Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 8a666e7

Browse files
committed
Fix a horrible race condition -- various routines were storing the
most recently opened URL in self.openedurl of the URLopener instance. This doesn't really work if multiple threads share the same opener instance! Fix: openedurl was actually simply the type prefix (e.g. "http:") followed by the rest of the URL; since the rest of the URL is available and the type is effectively determined by where you are in the code, I can reconstruct the full URL easily, e.g. "http:" + url.
1 parent e5bc497 commit 8a666e7

1 file changed

Lines changed: 7 additions & 9 deletions

File tree

Lib/urllib.py

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
import sys
2828

2929

30-
__version__ = '1.9'
30+
__version__ = '1.10'
3131

3232
MAXFTPCACHE = 10 # Trim the ftp cache beyond this size
3333

@@ -140,7 +140,6 @@ def open(self, fullurl, data=None):
140140
return addinfourl(fp, headers, fullurl)
141141
type, url = splittype(fullurl)
142142
if not type: type = 'file'
143-
self.openedurl = '%s:%s' % (type, url)
144143
if self.proxies.has_key(type):
145144
proxy = self.proxies[type]
146145
type, proxy = splittype(proxy)
@@ -173,7 +172,6 @@ def open_unknown(self, fullurl, data=None):
173172
# or (tempfilename, headers) for a remote object
174173
def retrieve(self, url, filename=None):
175174
url = unwrap(url)
176-
self.openedurl = url
177175
if self.tempcache and self.tempcache.has_key(url):
178176
return self.tempcache[url]
179177
type, url1 = splittype(url)
@@ -250,7 +248,7 @@ def open_http(self, url, data=None):
250248
errcode, errmsg, headers = h.getreply()
251249
fp = h.getfile()
252250
if errcode == 200:
253-
return addinfourl(fp, headers, self.openedurl)
251+
return addinfourl(fp, headers, "http:" + url)
254252
else:
255253
return self.http_error(url,
256254
fp, errcode, errmsg, headers)
@@ -287,7 +285,7 @@ def open_gopher(self, url):
287285
fp = gopherlib.send_query(selector, query, host)
288286
else:
289287
fp = gopherlib.send_selector(selector, host)
290-
return addinfourl(fp, noheaders(), self.openedurl)
288+
return addinfourl(fp, noheaders(), "gopher:" + url)
291289

292290
# Use local file or FTP depending on form of URL
293291
def open_file(self, url):
@@ -341,8 +339,8 @@ def open_ftp(self, url):
341339
try:
342340
if not self.ftpcache.has_key(key):
343341
self.ftpcache[key] = \
344-
ftpwrapper(user, passwd,
345-
host, port, dirs)
342+
ftpwrapper(user, passwd,
343+
host, port, dirs)
346344
if not file: type = 'D'
347345
else: type = 'I'
348346
for attr in attrs:
@@ -352,7 +350,7 @@ def open_ftp(self, url):
352350
type = string.upper(value)
353351
return addinfourl(
354352
self.ftpcache[key].retrfile(file, type),
355-
noheaders(), self.openedurl)
353+
noheaders(), "ftp:" + url)
356354
except ftperrors(), msg:
357355
raise IOError, ('ftp error', msg), sys.exc_info()[2]
358356

@@ -366,7 +364,7 @@ def __init__(self, *args):
366364

367365
# Default error handling -- don't raise an exception
368366
def http_error_default(self, url, fp, errcode, errmsg, headers):
369-
return addinfourl(fp, headers, self.openedurl)
367+
return addinfourl(fp, headers, "http:" + url)
370368

371369
# Error 302 -- relocated (temporarily)
372370
def http_error_302(self, url, fp, errcode, errmsg, headers):

0 commit comments

Comments
 (0)