Skip to content

Commit

Permalink
Fixed #4199 -- Changed date formatting in HTTP expires header to be spec
Browse files Browse the repository at this point in the history
compliant. Thanks, Chris Bennett.


git-svn-id: http://code.djangoproject.com/svn/django/trunk@5712 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information
malcolmt committed Jul 16, 2007
1 parent d5129ee commit 5dd9a2a
Show file tree
Hide file tree
Showing 5 changed files with 28 additions and 15 deletions.
1 change: 1 addition & 0 deletions AUTHORS
Expand Up @@ -57,6 +57,7 @@ answer newbie questions, and generally made Django that much better:
Ned Batchelder <http://www.nedbatchelder.com/> Ned Batchelder <http://www.nedbatchelder.com/>
Shannon -jj Behrens <http://jjinux.blogspot.com/> Shannon -jj Behrens <http://jjinux.blogspot.com/>
Esdras Beleza <linux@esdrasbeleza.com> Esdras Beleza <linux@esdrasbeleza.com>
Chris Bennett <chrisrbennett@yahoo.com>
James Bennett James Bennett
Ben <afternoon@uk2.net> Ben <afternoon@uk2.net>
Paul Bissex <http://e-scribe.com/> Paul Bissex <http://e-scribe.com/>
Expand Down
10 changes: 8 additions & 2 deletions django/contrib/sessions/middleware.py
Expand Up @@ -2,7 +2,9 @@
from django.contrib.sessions.models import Session from django.contrib.sessions.models import Session
from django.core.exceptions import SuspiciousOperation from django.core.exceptions import SuspiciousOperation
from django.utils.cache import patch_vary_headers from django.utils.cache import patch_vary_headers
from email.Utils import formatdate
import datetime import datetime
import time


TEST_COOKIE_NAME = 'testcookie' TEST_COOKIE_NAME = 'testcookie'
TEST_COOKIE_VALUE = 'worked' TEST_COOKIE_VALUE = 'worked'
Expand Down Expand Up @@ -37,7 +39,7 @@ def get(self, key, default=None):
return self._session.get(key, default) return self._session.get(key, default)


def pop(self, key, *args): def pop(self, key, *args):
self.modified = self.modified or key in self._session self.modified = self.modified or key in self._session
return self._session.pop(key, *args) return self._session.pop(key, *args)


def set_test_cookie(self): def set_test_cookie(self):
Expand Down Expand Up @@ -98,7 +100,11 @@ def process_response(self, request, response):
expires = None expires = None
else: else:
max_age = settings.SESSION_COOKIE_AGE max_age = settings.SESSION_COOKIE_AGE
expires = datetime.datetime.strftime(datetime.datetime.utcnow() + datetime.timedelta(seconds=settings.SESSION_COOKIE_AGE), "%a, %d-%b-%Y %H:%M:%S GMT") rfcdate = formatdate(time.time() + settings.SESSION_COOKIE_AGE)
# Fixed length date must have '-' separation in the format
# DD-MMM-YYYY for compliance with Netscape cookie standard
expires = (rfcdate[:7] + "-" + rfcdate[8:11]
+ "-" + rfcdate[12:26] + "GMT")
new_session = Session.objects.save(session_key, request.session._session, new_session = Session.objects.save(session_key, request.session._session,
datetime.datetime.now() + datetime.timedelta(seconds=settings.SESSION_COOKIE_AGE)) datetime.datetime.now() + datetime.timedelta(seconds=settings.SESSION_COOKIE_AGE))
response.set_cookie(settings.SESSION_COOKIE_NAME, session_key, response.set_cookie(settings.SESSION_COOKIE_NAME, session_key,
Expand Down
10 changes: 8 additions & 2 deletions django/core/servers/basehttp.py
Expand Up @@ -9,7 +9,13 @@


from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
from types import ListType, StringType from types import ListType, StringType
import os, re, sys, time, urllib, mimetypes from email.Utils import formatdate
import mimetypes
import os
import re
import sys
import time
import urllib


__version__ = "0.1" __version__ = "0.1"
__all__ = ['WSGIServer','WSGIRequestHandler','demo_app'] __all__ = ['WSGIServer','WSGIRequestHandler','demo_app']
Expand Down Expand Up @@ -370,7 +376,7 @@ def send_preamble(self):
self._write('HTTP/%s %s\r\n' % (self.http_version,self.status)) self._write('HTTP/%s %s\r\n' % (self.http_version,self.status))
if 'Date' not in self.headers: if 'Date' not in self.headers:
self._write( self._write(
'Date: %s\r\n' % time.asctime(time.gmtime(time.time())) 'Date: %s\r\n' % formatdate()[:26] + "GMT"
) )
if self.server_software and 'Server' not in self.headers: if self.server_software and 'Server' not in self.headers:
self._write('Server: %s\r\n' % self.server_software) self._write('Server: %s\r\n' % self.server_software)
Expand Down
5 changes: 2 additions & 3 deletions django/middleware/http.py
@@ -1,4 +1,4 @@
import datetime from email.Utils import formatdate


class ConditionalGetMiddleware(object): class ConditionalGetMiddleware(object):
""" """
Expand All @@ -11,8 +11,7 @@ class ConditionalGetMiddleware(object):
Also sets the Date and Content-Length response-headers. Also sets the Date and Content-Length response-headers.
""" """
def process_response(self, request, response): def process_response(self, request, response):
now = datetime.datetime.utcnow() response['Date'] = formatdate()[:26] + "GMT"
response['Date'] = now.strftime('%a, %d %b %Y %H:%M:%S GMT')
if not response.has_header('Content-Length'): if not response.has_header('Content-Length'):
response['Content-Length'] = str(len(response.content)) response['Content-Length'] = str(len(response.content))


Expand Down
17 changes: 9 additions & 8 deletions django/utils/cache.py
Expand Up @@ -17,7 +17,10 @@
"Accept-language" header. "Accept-language" header.
""" """


import datetime, md5, re import md5
import re
import time
from email.Utils import formatdate
from django.conf import settings from django.conf import settings
from django.core.cache import cache from django.core.cache import cache
from django.utils.encoding import smart_str from django.utils.encoding import smart_str
Expand All @@ -44,7 +47,7 @@ def dictitem(s):
return (t[0].lower().replace('-', '_'), True) return (t[0].lower().replace('-', '_'), True)


def dictvalue(t): def dictvalue(t):
if t[1] == True: if t[1] is True:
return t[0] return t[0]
else: else:
return t[0] + '=' + smart_str(t[1]) return t[0] + '=' + smart_str(t[1])
Expand Down Expand Up @@ -73,16 +76,14 @@ def patch_response_headers(response, cache_timeout=None):
""" """
if cache_timeout is None: if cache_timeout is None:
cache_timeout = settings.CACHE_MIDDLEWARE_SECONDS cache_timeout = settings.CACHE_MIDDLEWARE_SECONDS
now = datetime.datetime.utcnow() if cache_timeout < 0:
cache_timeout = 0 # Can't have max-age negative
if not response.has_header('ETag'): if not response.has_header('ETag'):
response['ETag'] = md5.new(response.content).hexdigest() response['ETag'] = md5.new(response.content).hexdigest()
if not response.has_header('Last-Modified'): if not response.has_header('Last-Modified'):
response['Last-Modified'] = now.strftime('%a, %d %b %Y %H:%M:%S GMT') response['Last-Modified'] = formatdate()[:26] + "GMT"
if not response.has_header('Expires'): if not response.has_header('Expires'):
expires = now + datetime.timedelta(0, cache_timeout) response['Expires'] = formatdate(time.time() + cache_timeout)[:26] + "GMT"
response['Expires'] = expires.strftime('%a, %d %b %Y %H:%M:%S GMT')
if cache_timeout < 0:
cache_timeout = 0 # Can't have max-age negative
patch_cache_control(response, max_age=cache_timeout) patch_cache_control(response, max_age=cache_timeout)


def add_never_cache_headers(response): def add_never_cache_headers(response):
Expand Down

0 comments on commit 5dd9a2a

Please sign in to comment.