mirror of
https://github.com/python/cpython
synced 2024-07-21 10:15:53 +00:00
Added a usegmt flag to email.Utils.formatdate - this allows it to be
used to replace rfc822.formatdate for protocols like HTTP (where 'GMT' must be the timezone string).
This commit is contained in:
parent
7f468f29f4
commit
3dd9e46161
|
@ -84,7 +84,7 @@ changes in daylight savings time, though not worth worrying about for
|
|||
common use.
|
||||
\end{funcdesc}
|
||||
|
||||
\begin{funcdesc}{formatdate}{\optional{timeval\optional{, localtime}}}
|
||||
\begin{funcdesc}{formatdate}{\optional{timeval\optional{, localtime}\optional{, usegmt}}}
|
||||
Returns a date string as per \rfc{2822}, e.g.:
|
||||
|
||||
\begin{verbatim}
|
||||
|
@ -99,6 +99,11 @@ Optional \var{localtime} is a flag that when \code{True}, interprets
|
|||
\var{timeval}, and returns a date relative to the local timezone
|
||||
instead of UTC, properly taking daylight savings time into account.
|
||||
The default is \code{False} meaning UTC is used.
|
||||
|
||||
Optional \var{usegmt} is a flag that when \code{True}, outputs a
|
||||
date string with the timezone as an ascii string \code{GMT}, rather
|
||||
than a numeric \code{-0000}. This is needed for some protocols (such
|
||||
as HTTP). This only applies when \var{localtime} is \code{False}
|
||||
\end{funcdesc}
|
||||
|
||||
\begin{funcdesc}{make_msgid}{\optional{idstring}}
|
||||
|
|
|
@ -103,7 +103,7 @@ def getaddresses(fieldvalues):
|
|||
|
||||
|
||||
|
||||
def formatdate(timeval=None, localtime=False):
|
||||
def formatdate(timeval=None, localtime=False, usegmt=False):
|
||||
"""Returns a date string as specified by RFC 2822, e.g.:
|
||||
|
||||
Fri, 09 Nov 2001 01:08:47 -0000
|
||||
|
@ -114,6 +114,10 @@ def formatdate(timeval=None, localtime=False):
|
|||
Optional localtime is a flag that when True, interprets timeval, and
|
||||
returns a date relative to the local timezone instead of UTC, properly
|
||||
taking daylight savings time into account.
|
||||
|
||||
Optional argument usegmt means that the timezone is written out as
|
||||
an ascii string, not numeric one (so "GMT" instead of "+0000"). This
|
||||
is needed for HTTP, and is only used when localtime==False.
|
||||
"""
|
||||
# Note: we cannot use strftime() because that honors the locale and RFC
|
||||
# 2822 requires that day and month names be the English abbreviations.
|
||||
|
@ -138,7 +142,10 @@ def formatdate(timeval=None, localtime=False):
|
|||
else:
|
||||
now = time.gmtime(timeval)
|
||||
# Timezone offset is always -0000
|
||||
zone = '-0000'
|
||||
if usegmt:
|
||||
zone = 'GMT'
|
||||
else:
|
||||
zone = '-0000'
|
||||
return '%s, %02d %s %04d %02d:%02d:%02d %s' % (
|
||||
['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'][now[6]],
|
||||
now[2],
|
||||
|
|
|
@ -2037,6 +2037,15 @@ def test_formatdate_localtime(self):
|
|||
Utils.parsedate(Utils.formatdate(now, localtime=True))[:6],
|
||||
time.localtime(now)[:6])
|
||||
|
||||
def test_formatdate_usegmt(self):
|
||||
now = time.time()
|
||||
self.assertEqual(
|
||||
Utils.formatdate(now, localtime=False),
|
||||
time.strftime('%a, %d %b %Y %H:%M:%S -0000', time.gmtime(now)))
|
||||
self.assertEqual(
|
||||
Utils.formatdate(now, localtime=False, usegmt=True),
|
||||
time.strftime('%a, %d %b %Y %H:%M:%S GMT', time.gmtime(now)))
|
||||
|
||||
def test_parsedate_none(self):
|
||||
self.assertEqual(Utils.parsedate(''), None)
|
||||
|
||||
|
|
|
@ -410,7 +410,7 @@ def open_file(self, url):
|
|||
|
||||
def open_local_file(self, url):
|
||||
"""Use local file."""
|
||||
import mimetypes, mimetools, rfc822, StringIO
|
||||
import mimetypes, mimetools, email.Utils, StringIO
|
||||
host, file = splithost(url)
|
||||
localname = url2pathname(file)
|
||||
try:
|
||||
|
@ -418,7 +418,7 @@ def open_local_file(self, url):
|
|||
except OSError, e:
|
||||
raise IOError(e.errno, e.strerror, e.filename)
|
||||
size = stats.st_size
|
||||
modified = rfc822.formatdate(stats.st_mtime)
|
||||
modified = email.Utils.formatdate(stats.st_mtime, usegmt=True)
|
||||
mtype = mimetypes.guess_type(url)[0]
|
||||
headers = mimetools.Message(StringIO.StringIO(
|
||||
'Content-Type: %s\nContent-Length: %d\nLast-modified: %s\n' %
|
||||
|
|
|
@ -99,7 +99,6 @@
|
|||
import posixpath
|
||||
import random
|
||||
import re
|
||||
import rfc822
|
||||
import sha
|
||||
import socket
|
||||
import sys
|
||||
|
@ -1129,12 +1128,13 @@ def get_names(self):
|
|||
|
||||
# not entirely sure what the rules are here
|
||||
def open_local_file(self, req):
|
||||
import email.Utils
|
||||
host = req.get_host()
|
||||
file = req.get_selector()
|
||||
localfile = url2pathname(file)
|
||||
stats = os.stat(localfile)
|
||||
size = stats.st_size
|
||||
modified = rfc822.formatdate(stats.st_mtime)
|
||||
modified = email.Utils.formatdate(stats.st_mtime, usegmt=True)
|
||||
mtype = mimetypes.guess_type(file)[0]
|
||||
headers = mimetools.Message(StringIO(
|
||||
'Content-type: %s\nContent-length: %d\nLast-modified: %s\n' %
|
||||
|
|
Loading…
Reference in a new issue