Support optional filename argument for retrieve() and urlretrieve(),
to specify where it should go (if specified, even local files will be
copied into the given file).
diff --git a/Lib/urllib.py b/Lib/urllib.py
index 82a39f2..6caf2b2 100644
--- a/Lib/urllib.py
+++ b/Lib/urllib.py
@@ -45,11 +45,14 @@
 	if not _urlopener:
 		_urlopener = FancyURLopener()
 	return _urlopener.open(url)
-def urlretrieve(url):
+def urlretrieve(url, filename=None):
 	global _urlopener
 	if not _urlopener:
 		_urlopener = FancyURLopener()
-	return _urlopener.retrieve(url)
+	if filename:
+	    return _urlopener.retrieve(url, filename)
+	else:
+	    return _urlopener.retrieve(url)
 def urlcleanup():
 	if _urlopener:
 		_urlopener.cleanup()
@@ -134,7 +137,7 @@
 	# External interface
 	# retrieve(url) returns (filename, None) for a local object
 	# or (tempfilename, headers) for a remote object
-	def retrieve(self, url):
+	def retrieve(self, url, filename=None):
 		if self.tempcache and self.tempcache.has_key(url):
 			return self.tempcache[url]
 		url1 = unwrap(url)
@@ -142,7 +145,7 @@
 			self.tempcache[url] = self.tempcache[url1]
 			return self.tempcache[url1]
 		type, url1 = splittype(url1)
-		if not type or type == 'file':
+		if not filename and (not type or type == 'file'):
 			try:
 				fp = self.open_local_file(url1)
 				del fp
@@ -151,12 +154,13 @@
 				pass
 		fp = self.open(url)
 		headers = fp.info()
-		import tempfile
-		tfn = tempfile.mktemp()
-		result = tfn, headers
+		if not filename:
+		    import tempfile
+		    filename = tempfile.mktemp()
+		result = filename, headers
 		if self.tempcache is not None:
 			self.tempcache[url] = result
-		tfp = open(tfn, 'w')
+		tfp = open(filename, 'w')
 		bs = 1024*8
 		block = fp.read(bs)
 		while block: