From: Jeremy Hylton Date: Mon, 27 Aug 2001 20:16:53 +0000 (+0000) Subject: Add content-type header to ftp URLs (SF patch #454553) X-Git-Tag: v2.2a3~308 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6d8c1aabff765d4958132f750a968769e7cece13;p=python Add content-type header to ftp URLs (SF patch #454553) Modify rfc822.formatdate() to always generate English names, regardless of locale. This is required by RFC 1123. In open_local_file() of urllib and urllib2, use new formatdate() from rfc822. --- diff --git a/Lib/rfc822.py b/Lib/rfc822.py index c2249f3681..e69c4cbcde 100644 --- a/Lib/rfc822.py +++ b/Lib/rfc822.py @@ -953,11 +953,21 @@ def formatdate(timeval=None): """Returns time format preferred for Internet standards. Sun, 06 Nov 1994 08:49:37 GMT ; RFC 822, updated by RFC 1123 + + According to RFC 1123, day and month names must always be in + English. If not for that, this code could use strftime(). It + can't because strftime() honors the locale and could generated + non-English names. """ if timeval is None: timeval = time.time() - return "%s" % time.strftime('%a, %d %b %Y %H:%M:%S GMT', - time.gmtime(timeval)) + timeval = time.gmtime(timeval) + return "%s, %02d %s %04d %02d:%02d:%02d GMT" % ( + ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"][timeval[6]], + timeval[2], + ["Jan", "Feb", "Mar", "Apr", "May", "Jun", + "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"][timeval[1]-1], + timeval[0], timeval[3], timeval[4], timeval[5]) # When used as script, run a small test program. diff --git a/Lib/urllib.py b/Lib/urllib.py index a255956efd..8c1852ef17 100644 --- a/Lib/urllib.py +++ b/Lib/urllib.py @@ -406,18 +406,12 @@ class URLopener: def open_local_file(self, url): """Use local file.""" - import mimetypes, mimetools, StringIO + import mimetypes, mimetools, rfc822, 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]) + modified = rfc822.formatdate(stats[stat.ST_MTIME]) mtype = mimetypes.guess_type(url)[0] headers = mimetools.Message(StringIO.StringIO( 'Content-Type: %s\nContent-Length: %d\nLast-modified: %s\n' % diff --git a/Lib/urllib2.py b/Lib/urllib2.py index 5882de6c45..beb9fa5af0 100644 --- a/Lib/urllib2.py +++ b/Lib/urllib2.py @@ -96,9 +96,12 @@ import urlparse import md5 import mimetypes import mimetools +import rfc822 import ftplib import sys import time +import os +import stat import gopherlib import posixpath @@ -914,16 +917,22 @@ class FileHandler(BaseHandler): # not entirely sure what the rules are here def open_local_file(self, req): - mtype = mimetypes.guess_type(req.get_selector())[0] - headers = mimetools.Message(StringIO('Content-Type: %s\n' \ - % (mtype or 'text/plain'))) host = req.get_host() file = req.get_selector() + localfile = url2pathname(file) + stats = os.stat(localfile) + size = stats[stat.ST_SIZE] + modified = rfc822.formatdate(stats[stat.ST_MTIME]) + mtype = mimetypes.guess_type(file)[0] + stats = os.stat(localfile) + headers = mimetools.Message(StringIO( + 'Content-Type: %s\nContent-Length: %d\nLast-modified: %s\n' % + (mtype or 'text/plain', size, modified))) if host: host, port = splitport(host) if not host or \ (not port and socket.gethostbyname(host) in self.get_names()): - return addinfourl(open(url2pathname(file), 'rb'), + return addinfourl(open(localfile, 'rb'), headers, 'file:'+file) raise URLError('file not on local host')