Sjoerd Mullender writes:

Urllib makes the URL of the opened file available through the geturl
method of the returned object.  For local files, this consists of
file: plus the name of the file.  This results in an invalid URL if
the file name was relative.  This patch fixes this so that the
returned URL is just a relative URL in that case.  When the file name
is absolute, the URL returned is of the form file:///absolute/path.

[I guess that a URL of the form "file:foo.html" is illegal...  GvR]
diff --git a/Lib/urllib.py b/Lib/urllib.py
index 1b5baaa..c12f451 100644
--- a/Lib/urllib.py
+++ b/Lib/urllib.py
@@ -325,13 +325,19 @@
             'Content-Type: %s\n' % (mtype or 'text/plain')))
         host, file = splithost(url)
         if not host:
+            urlfile = file
+            if file[:1] == '/':
+                urlfile = 'file://' + file
             return addinfourl(open(url2pathname(file), 'rb'),
-                              headers, 'file:'+file)
+                              headers, urlfile)
         host, port = splitport(host)
         if not port \
            and socket.gethostbyname(host) in (localhost(), thishost()): 
+            urlfile = file
+            if file[:1] == '/':
+                urlfile = 'file://' + file
             return addinfourl(open(url2pathname(file), 'rb'),
-                              headers, 'file:'+file)
+                              headers, urlfile)
         raise IOError, ('local file error', 'not on local host')
 
     # Use FTP protocol