Fixed #10681 -- Work around (by ignoring) invalid ETag headers.

This is a hack to work around problems in the Real World. Apparently, Opera
9.64 has been observed sending malformed headers. We now compromise our high
principles and simply ignore such bad behaviour.

Patch from Ivan Sagalaev.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@10370 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Malcolm Tredinnick 2009-04-03 06:59:34 +00:00
parent 8d42902f19
commit d2a8bc5b40
2 changed files with 14 additions and 1 deletions

View File

@ -75,7 +75,15 @@ def condition(etag_func=None, last_modified_func=None):
if if_none_match or if_match: if if_none_match or if_match:
# There can be more than one ETag in the request, so we # There can be more than one ETag in the request, so we
# consider the list of values. # consider the list of values.
try:
etags = parse_etags(if_none_match or if_match) etags = parse_etags(if_none_match or if_match)
except ValueError:
# In case of invalid etag ignore all ETag headers.
# Apparently Opera sends invalidly quoted headers at times
# (we should be returning a 400 response, but that's a
# little extreme) -- this is Django bug #10681.
if_none_match = None
if_match = None
# Compute values (if any) for the requested resource. # Compute values (if any) for the requested resource.
if etag_func: if etag_func:

View File

@ -112,6 +112,11 @@ class ConditionalGet(TestCase):
response = self.client.get('/condition/last_modified2/') response = self.client.get('/condition/last_modified2/')
self.assertFullResponse(response, check_etag=False) self.assertFullResponse(response, check_etag=False)
def testInvalidETag(self):
self.client.defaults['HTTP_IF_NONE_MATCH'] = r'"\"'
response = self.client.get('/condition/etag/')
self.assertFullResponse(response, check_last_modified=False)
class ETagProcesing(TestCase): class ETagProcesing(TestCase):
def testParsing(self): def testParsing(self):