fixed urllib.urlopen in the internal python (fdo#31466)
+ backported two fixes from newer python: + close the file even if an exception occurs (py#5536) + urllib doesn't correct server returned urls (py#918368) + thanks karolus <karlooforum at arcor dot de> for analyzing and suggesting the fix
This commit is contained in:
93
python/Python-2.6.1-urllib.patch
Normal file
93
python/Python-2.6.1-urllib.patch
Normal file
@@ -0,0 +1,93 @@
|
||||
--- misc/Python-2.6.1/Lib/urllib.py 2008-09-21 23:27:51.000000000 +0200
|
||||
+++ misc/build/Python-2.6.1/Lib/urllib.py 2010-11-23 15:41:08.000000000 +0100
|
||||
@@ -176,6 +176,9 @@ class URLopener:
|
||||
def open(self, fullurl, data=None):
|
||||
"""Use URLopener().open(file) instead of open(file, 'r')."""
|
||||
fullurl = unwrap(toBytes(fullurl))
|
||||
+ # percent encode url. fixing lame server errors like space within url
|
||||
+ # parts
|
||||
+ fullurl = quote(fullurl, safe="%/:=&?~#+!$,;'@()*[]|")
|
||||
if self.tempcache and fullurl in self.tempcache:
|
||||
filename, headers = self.tempcache[fullurl]
|
||||
fp = open(filename, 'rb')
|
||||
@@ -233,41 +236,45 @@ class URLopener:
|
||||
except IOError, msg:
|
||||
pass
|
||||
fp = self.open(url, data)
|
||||
- headers = fp.info()
|
||||
- if filename:
|
||||
- tfp = open(filename, 'wb')
|
||||
- else:
|
||||
- import tempfile
|
||||
- garbage, path = splittype(url)
|
||||
- garbage, path = splithost(path or "")
|
||||
- path, garbage = splitquery(path or "")
|
||||
- path, garbage = splitattr(path or "")
|
||||
- suffix = os.path.splitext(path)[1]
|
||||
- (fd, filename) = tempfile.mkstemp(suffix)
|
||||
- self.__tempfiles.append(filename)
|
||||
- tfp = os.fdopen(fd, 'wb')
|
||||
- result = filename, headers
|
||||
- if self.tempcache is not None:
|
||||
- self.tempcache[url] = result
|
||||
- bs = 1024*8
|
||||
- size = -1
|
||||
- read = 0
|
||||
- blocknum = 0
|
||||
- if reporthook:
|
||||
- if "content-length" in headers:
|
||||
- size = int(headers["Content-Length"])
|
||||
- reporthook(blocknum, bs, size)
|
||||
- while 1:
|
||||
- block = fp.read(bs)
|
||||
- if block == "":
|
||||
- break
|
||||
- read += len(block)
|
||||
- tfp.write(block)
|
||||
- blocknum += 1
|
||||
- if reporthook:
|
||||
- reporthook(blocknum, bs, size)
|
||||
- fp.close()
|
||||
- tfp.close()
|
||||
+ try:
|
||||
+ headers = fp.info()
|
||||
+ if filename:
|
||||
+ tfp = open(filename, 'wb')
|
||||
+ else:
|
||||
+ import tempfile
|
||||
+ garbage, path = splittype(url)
|
||||
+ garbage, path = splithost(path or "")
|
||||
+ path, garbage = splitquery(path or "")
|
||||
+ path, garbage = splitattr(path or "")
|
||||
+ suffix = os.path.splitext(path)[1]
|
||||
+ (fd, filename) = tempfile.mkstemp(suffix)
|
||||
+ self.__tempfiles.append(filename)
|
||||
+ tfp = os.fdopen(fd, 'wb')
|
||||
+ try:
|
||||
+ result = filename, headers
|
||||
+ if self.tempcache is not None:
|
||||
+ self.tempcache[url] = result
|
||||
+ bs = 1024*8
|
||||
+ size = -1
|
||||
+ read = 0
|
||||
+ blocknum = 0
|
||||
+ if reporthook:
|
||||
+ if "content-length" in headers:
|
||||
+ size = int(headers["Content-Length"])
|
||||
+ reporthook(blocknum, bs, size)
|
||||
+ while 1:
|
||||
+ block = fp.read(bs)
|
||||
+ if block == "":
|
||||
+ break
|
||||
+ read += len(block)
|
||||
+ tfp.write(block)
|
||||
+ blocknum += 1
|
||||
+ if reporthook:
|
||||
+ reporthook(blocknum, bs, size)
|
||||
+ finally:
|
||||
+ tfp.close()
|
||||
+ finally:
|
||||
+ fp.close()
|
||||
del fp
|
||||
del tfp
|
||||
|
@@ -50,7 +50,8 @@ TARFILE_MD5=e81c2f0953aa60f8062c05a4673f2be0
|
||||
PATCH_FILES=\
|
||||
Python-$(PYVERSION).patch \
|
||||
Python-ssl.patch \
|
||||
Python-aix.patch
|
||||
Python-aix.patch \
|
||||
Python-2.6.1-urllib.patch
|
||||
|
||||
CONFIGURE_DIR=
|
||||
|
||||
|
Reference in New Issue
Block a user