]> granicus.if.org Git - python/commitdiff
SF Patch #420725 by Walter Doerwald:
authorGuido van Rossum <guido@python.org>
Thu, 9 Aug 2001 17:43:35 +0000 (17:43 +0000)
committerGuido van Rossum <guido@python.org>
Thu, 9 Aug 2001 17:43:35 +0000 (17:43 +0000)
  For local files urllib.py doesn't return the MIME
  headers that the documentation says it does:

  http://www.python.org/doc/current/lib/module-
  urllib.html#l2h-2187 states that "When the method is
  local-file, returned headers will include a Date
  representing the file's last-modified time, a Content-
  Length giving file size, and a Content-Type containing
  a guess at the file's type"

  But in Python 2.1 the only header that gets returned
  is the Content-Type:

  >>> import urllib
  >>> f = urllib.urlopen("gurk.txt")
  >>> f.info().headers
  ['Content-Type: text/plain\n']

Lib/urllib.py

index 084d32af30b064602e3f9186795d13aa52194ba3..9c1f5b76f4c90cacc263193570d8bd5a3ceb0802 100644 (file)
@@ -25,6 +25,8 @@ used to query various info about the object, if available.
 import string
 import socket
 import os
+import stat
+import time
 import sys
 import types
 
@@ -402,15 +404,26 @@ class URLopener:
     def open_local_file(self, url):
         """Use local file."""
         import mimetypes, mimetools, StringIO
+        host, file = splithost(url)
+        localname = url2pathname(file)
+        stats = os.stat(localname)
+        size = stats[stat.ST_SIZE]
+        modified = time.gmtime(stats[stat.ST_MTIME])
+        modified = "%s, %02d %s %04d %02d:%02d:%02d GMT" % (
+            ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"][modified[6]],
+            modified[2],
+            ["Jan", "Feb", "Mar", "Apr", "May", "Jun",
+             "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"][modified[1]-1],
+            modified[0], modified[3], modified[4], modified[5])
         mtype = mimetypes.guess_type(url)[0]
         headers = mimetools.Message(StringIO.StringIO(
-            'Content-Type: %s\n' % (mtype or 'text/plain')))
-        host, file = splithost(url)
+            'Content-Type: %s\nContent-Length: %d\nLast-modified: %s\n' %
+            (mtype or 'text/plain', size, modified)))
         if not host:
             urlfile = file
             if file[:1] == '/':
                 urlfile = 'file://' + file
-            return addinfourl(open(url2pathname(file), 'rb'),
+            return addinfourl(open(localname, 'rb'),
                               headers, urlfile)
         host, port = splitport(host)
         if not port \
@@ -418,7 +431,7 @@ class URLopener:
             urlfile = file
             if file[:1] == '/':
                 urlfile = 'file://' + file
-            return addinfourl(open(url2pathname(file), 'rb'),
+            return addinfourl(open(localname, 'rb'),
                               headers, urlfile)
         raise IOError, ('local file error', 'not on local host')