Commit 61282558 authored by Ramiro Morales's avatar Ramiro Morales
Browse files

[1.2.X] Fixed #14812 -- Made parsing of the If-Modified-Since HTTP header more...

[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
parent 3d07bb71
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -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
+14 −0
Original line number Diff line number Diff line
@@ -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']))