From 3bb68004ff600930e181c190d06d79254f5a1b9c Mon Sep 17 00:00:00 2001 From: Malcolm Tredinnick Date: Sun, 22 Mar 2009 23:16:03 +0000 Subject: [PATCH] Fixed #10581 -- Fixed conditional handling of If-Match headers. The conditional processing decorator from r10114 wasn't parsing ETags from an If-Match header correctly. Patch from Ivan Sagalaev (who also did most of the work in r10114, before I rewrote parts of it and added bonus bugs, although I forgot to thank him there). git-svn-id: http://code.djangoproject.com/svn/django/trunk@10116 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/views/decorators/http.py | 2 +- tests/regressiontests/conditional_processing/models.py | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/django/views/decorators/http.py b/django/views/decorators/http.py index ec4695367b..596409dd90 100644 --- a/django/views/decorators/http.py +++ b/django/views/decorators/http.py @@ -75,7 +75,7 @@ def condition(etag_func=None, last_modified_func=None): if if_none_match or if_match: # There can be more than one ETag in the request, so we # consider the list of values. - etags = parse_etags(if_none_match) + etags = parse_etags(if_none_match or if_match) # Compute values (if any) for the requested resource. if etag_func: diff --git a/tests/regressiontests/conditional_processing/models.py b/tests/regressiontests/conditional_processing/models.py index 5c52acbd52..120a673859 100644 --- a/tests/regressiontests/conditional_processing/models.py +++ b/tests/regressiontests/conditional_processing/models.py @@ -50,6 +50,14 @@ class ConditionalGet(TestCase): response = self.client.get('/condition/') self.assertNotModified(response) + def testIfMatch(self): + self.client.defaults['HTTP_IF_MATCH'] = '"%s"' % ETAG + response = self.client.put('/condition/etag/', {'data': ''}) + self.assertEquals(response.status_code, 200) + self.client.defaults['HTTP_IF_MATCH'] = '"%s"' % EXPIRED_ETAG + response = self.client.put('/condition/etag/', {'data': ''}) + self.assertEquals(response.status_code, 412) + def testBothHeaders(self): self.client.defaults['HTTP_IF_MODIFIED_SINCE'] = LAST_MODIFIED_STR self.client.defaults['HTTP_IF_NONE_MATCH'] = '"%s"' % ETAG