From ad332e5ca9503bba2e14cc8c3ca675eed56d72bc Mon Sep 17 00:00:00 2001 From: Kevin Christopher Henry Date: Tue, 11 Oct 2016 03:42:00 -0400 Subject: Refs #19705 -- Made GZipMiddleware make ETags weak. Django's conditional request processing can now produce 304 Not Modified responses for content that is subject to compression. --- tests/middleware/tests.py | 43 ++++++++++++++++++++++++++++++------------- 1 file changed, 30 insertions(+), 13 deletions(-) (limited to 'tests') diff --git a/tests/middleware/tests.py b/tests/middleware/tests.py index a9cb1f31ea..db8ed6ea90 100644 --- a/tests/middleware/tests.py +++ b/tests/middleware/tests.py @@ -855,27 +855,44 @@ class GZipMiddlewareTest(SimpleTestCase): @override_settings(USE_ETAGS=True) class ETagGZipMiddlewareTest(SimpleTestCase): """ - Tests if the ETagMiddleware behaves correctly with GZipMiddleware. + ETags are handled properly by GZipMiddleware. """ rf = RequestFactory() compressible_string = b'a' * 500 - def test_compress_response(self): + def test_strong_etag_modified(self): """ - ETag is changed after gzip compression is performed. + GZipMiddleware makes a strong ETag weak. """ request = self.rf.get('/', HTTP_ACCEPT_ENCODING='gzip, deflate') - response = GZipMiddleware().process_response( - request, - CommonMiddleware().process_response(request, HttpResponse(self.compressible_string)) - ) - gzip_etag = response.get('ETag') + response = HttpResponse(self.compressible_string) + response['ETag'] = '"eggs"' + gzip_response = GZipMiddleware().process_response(request, response) + self.assertEqual(gzip_response['ETag'], 'W/"eggs"') - request = self.rf.get('/', HTTP_ACCEPT_ENCODING='') + def test_weak_etag_not_modified(self): + """ + GZipMiddleware doesn't modify a weak ETag. + """ + request = self.rf.get('/', HTTP_ACCEPT_ENCODING='gzip, deflate') + response = HttpResponse(self.compressible_string) + response['ETag'] = 'W/"eggs"' + gzip_response = GZipMiddleware().process_response(request, response) + self.assertEqual(gzip_response['ETag'], 'W/"eggs"') + + def test_etag_match(self): + """ + GZipMiddleware allows 304 Not Modified responses. + """ + request = self.rf.get('/', HTTP_ACCEPT_ENCODING='gzip, deflate') response = GZipMiddleware().process_response( request, - CommonMiddleware().process_response(request, HttpResponse(self.compressible_string)) + ConditionalGetMiddleware().process_response(request, HttpResponse(self.compressible_string)) ) - nogzip_etag = response.get('ETag') - - self.assertNotEqual(gzip_etag, nogzip_etag) + gzip_etag = response['ETag'] + next_request = self.rf.get('/', HTTP_ACCEPT_ENCODING='gzip, deflate', HTTP_IF_NONE_MATCH=gzip_etag) + next_response = ConditionalGetMiddleware().process_response( + next_request, + HttpResponse(self.compressible_string) + ) + self.assertEqual(next_response.status_code, 304) -- cgit v1.3