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.
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 @@
 ftpcache = {}
 class URLopener:
 
-	tempcache = None		# So close() in __del__() won't fail
+	__tempfiles = []
 
 	# Constructor
 	def __init__(self, proxies=None):
@@ -110,14 +110,15 @@
 		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 @@
 		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 @@
 		# 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