summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>1997-09-03 22:36:15 (GMT)
committerGuido van Rossum <guido@python.org>1997-09-03 22:36:15 (GMT)
commit2b3fd76cc7599630df68444a7a96e97fddd5c0fb (patch)
treee3ebfba96b1434b4f502b9f74b07cf7a42719101
parentf01dff7e93993c01f9883de5b456ccac32f550a9 (diff)
downloadcpython-2b3fd76cc7599630df68444a7a96e97fddd5c0fb.zip
cpython-2b3fd76cc7599630df68444a7a96e97fddd5c0fb.tar.gz
cpython-2b3fd76cc7599630df68444a7a96e97fddd5c0fb.tar.bz2
One patch from Sjoerd and one from Jack.
Sjoerd: add separate administration of temporary files created y URLopener.retrieve() so cleanup can properly remove them. The old code removed everything in tempcache which was a bad idea if the user had passed a non-temp file into it. (I added a line to delete the tempcache in cleanup() -- it still seems to make sense.) Jack: in basejoin(), interpret relative paths starting in "../". This is necessary if the server uses symbolic links.
-rw-r--r--Lib/urllib.py21
1 files changed, 14 insertions, 7 deletions
diff --git a/Lib/urllib.py b/Lib/urllib.py
index 82a26b3..6922f22 100644
--- a/Lib/urllib.py
+++ b/Lib/urllib.py
@@ -82,7 +82,7 @@ def urlcleanup():
ftpcache = {}
class URLopener:
- tempcache = None # So close() in __del__() won't fail
+ __tempfiles = []
# Constructor
def __init__(self, proxies=None):
@@ -110,14 +110,15 @@ class URLopener:
self.cleanup()
def cleanup(self):
- if self.tempcache:
+ if self.__tempfiles:
import os
- for url in self.tempcache.keys():
+ for file in self.__tempfiles:
try:
- os.unlink(self.tempcache[url][0])
+ os.unlink(file)
except os.error:
pass
- del self.tempcache[url]
+ URLopener.__tempfiles = []
+ self.tempcache = None
# Add a header to be used by the HTTP interface only
# e.g. u.addheader('Accept', 'sound/basic')
@@ -182,6 +183,7 @@ class URLopener:
if not filename:
import tempfile
filename = tempfile.mktemp()
+ self.__tempfiles.append(filename)
result = filename, headers
if self.tempcache is not None:
self.tempcache[url] = result
@@ -622,9 +624,14 @@ def basejoin(base, url):
# Interpret ../ (important because of symlinks)
while basepath and path[:3] == '../':
path = path[3:]
- i = string.rfind(basepath, '/')
+ i = string.rfind(basepath[:-1], '/')
if i > 0:
- basepath = basepath[:i-1]
+ basepath = basepath[:i+1]
+ elif i == 0:
+ basepath = '/'
+ break
+ else:
+ basepath = ''
path = basepath + path
if type and host: return type + '://' + host + path