mirror of
https://github.com/django/django.git
synced 2025-10-24 14:16:09 +00:00
[1.8.x] 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.
Backport of 250aa7c39b from master.
This commit is contained in:
committed by
Claude Paroz
parent
43b0131fb5
commit
d88c24f436
@@ -590,6 +590,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('/')
|
||||
@@ -601,6 +602,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):
|
||||
@@ -624,6 +627,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.
|
||||
|
||||
Reference in New Issue
Block a user