From 612825583857f0dfbfa0c0bb3bb3c64832302f8d Mon Sep 17 00:00:00 2001 From: Ramiro Morales Date: Tue, 30 Nov 2010 21:32:11 +0000 Subject: [PATCH] [1.2.X] Fixed #14812 -- Made parsing of the If-Modified-Since HTTP header more robust in presence of malformed values when serving static content. Thanks shaohua for the report, and alexey.smolsky@gmail.com for a similar report and patch. Backport of r14753 from trunk. git-svn-id: http://code.djangoproject.com/svn/django/branches/releases/1.2.X@14754 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/views/static.py | 5 ++++- tests/regressiontests/views/tests/static.py | 14 ++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/django/views/static.py b/django/views/static.py index cc88211876..fda3764b0c 100644 --- a/django/views/static.py +++ b/django/views/static.py @@ -129,7 +129,10 @@ def was_modified_since(header=None, mtime=0, size=0): raise ValueError matches = re.match(r"^([^;]+)(; length=([0-9]+))?$", header, re.IGNORECASE) - header_mtime = mktime_tz(parsedate_tz(matches.group(1))) + header_date = parsedate_tz(matches.group(1)) + if header_date is None: + raise ValueError + header_mtime = mktime_tz(header_date) header_len = matches.group(3) if header_len and int(header_len) != size: raise ValueError diff --git a/tests/regressiontests/views/tests/static.py b/tests/regressiontests/views/tests/static.py index 25153e86b0..de0bd51ac4 100644 --- a/tests/regressiontests/views/tests/static.py +++ b/tests/regressiontests/views/tests/static.py @@ -61,3 +61,17 @@ class StaticTests(TestCase): self.assertEquals(len(response.content), int(response['Content-Length'])) + def test_invalid_if_modified_since2(self): + """Handle even more bogus If-Modified-Since values gracefully + + Assume that a file is modified since an invalid timestamp as per RFC + 2616, section 14.25. + """ + file_name = 'file.txt' + invalid_date = ': 1291108438, Wed, 20 Oct 2010 14:05:00 GMT' + response = self.client.get('/views/site_media/%s' % file_name, + HTTP_IF_MODIFIED_SINCE=invalid_date) + file = open(path.join(media_dir, file_name)) + self.assertEquals(file.read(), response.content) + self.assertEquals(len(response.content), + int(response['Content-Length']))