summaryrefslogtreecommitdiff
path: root/tests/middleware/tests.py
diff options
context:
space:
mode:
authorMatthew Somerville <matthew-github@dracos.co.uk>2015-01-28 21:43:23 +0000
committerClaude Paroz <claude@2xlibre.net>2015-02-03 18:18:12 +0100
commit250aa7c39b0025ef3ae508884fda8d6e43c9518f (patch)
tree8565f3ebc9bc7e59f6e7743e948919e6e4428589 /tests/middleware/tests.py
parentcd4282816db9164791cd0ac97a3dc329ad92c522 (diff)
downloaddjango-250aa7c39b0025ef3ae508884fda8d6e43c9518f.tar.gz
Fixed #24240 -- Allowed GZipping a Unicode StreamingHttpResponse
make_bytes() assumed that if the Content-Encoding header is set, then everything had already been dealt with bytes-wise, but in a streaming situation this was not necessarily the case. make_bytes() is only called when necessary when working with a StreamingHttpResponse iterable, but by that point the middleware has added the Content-Encoding header and thus make_bytes() tried to call bytes(value) (and dies). If it had been a normal HttpResponse, make_bytes() would have been called when the content was set, well before the middleware set the Content-Encoding header. This commit removes the special casing when Content-Encoding is set, allowing unicode strings to be encoded during the iteration before they are e.g. gzipped. This behaviour was added a long time ago for #4969 and it doesn't appear to be necessary any more, as everything is correctly made into bytes at the appropriate places. Two new tests, to show that supplying non-ASCII characters to a StreamingHttpResponse works fine normally, and when passed through the GZip middleware (the latter dies without the change to make_bytes()). Removes the test with a nonsense Content-Encoding and Unicode input - if this were to happen, it can still be encoded as bytes fine.
Diffstat (limited to 'tests/middleware/tests.py')
-rw-r--r--tests/middleware/tests.py12
1 files changed, 12 insertions, 0 deletions
diff --git a/tests/middleware/tests.py b/tests/middleware/tests.py
index 30ed394503..770d500444 100644
--- a/tests/middleware/tests.py
+++ b/tests/middleware/tests.py
@@ -599,6 +599,7 @@ class GZipMiddlewareTest(TestCase):
compressible_string = b'a' * 500
uncompressible_string = b''.join(six.int2byte(random.randint(0, 255)) for _ in range(500))
sequence = [b'a' * 500, b'b' * 200, b'a' * 300]
+ sequence_unicode = ['a' * 500, 'é' * 200, 'a' * 300]
def setUp(self):
self.req = RequestFactory().get('/')
@@ -610,6 +611,8 @@ class GZipMiddlewareTest(TestCase):
self.resp['Content-Type'] = 'text/html; charset=UTF-8'
self.stream_resp = StreamingHttpResponse(self.sequence)
self.stream_resp['Content-Type'] = 'text/html; charset=UTF-8'
+ self.stream_resp_unicode = StreamingHttpResponse(self.sequence_unicode)
+ self.stream_resp_unicode['Content-Type'] = 'text/html; charset=UTF-8'
@staticmethod
def decompress(gzipped_string):
@@ -633,6 +636,15 @@ class GZipMiddlewareTest(TestCase):
self.assertEqual(r.get('Content-Encoding'), 'gzip')
self.assertFalse(r.has_header('Content-Length'))
+ def test_compress_streaming_response_unicode(self):
+ """
+ Tests that compression is performed on responses with streaming Unicode content.
+ """
+ r = GZipMiddleware().process_response(self.req, self.stream_resp_unicode)
+ self.assertEqual(self.decompress(b''.join(r)), b''.join(x.encode('utf-8') for x in self.sequence_unicode))
+ self.assertEqual(r.get('Content-Encoding'), 'gzip')
+ self.assertFalse(r.has_header('Content-Length'))
+
def test_compress_file_response(self):
"""
Tests that compression is performed on FileResponse.