mirror of
https://github.com/django/django.git
synced 2025-08-04 10:59:45 +00:00
Fixed #7581 -- Added streaming responses.
Thanks mrmachine and everyone else involved on this long-standing ticket.
This commit is contained in:
parent
300d052713
commit
4b27813198
18 changed files with 533 additions and 75 deletions
|
@ -8,7 +8,7 @@ from io import BytesIO
|
|||
from django.conf import settings
|
||||
from django.core import mail
|
||||
from django.http import HttpRequest
|
||||
from django.http import HttpResponse
|
||||
from django.http import HttpResponse, StreamingHttpResponse
|
||||
from django.middleware.clickjacking import XFrameOptionsMiddleware
|
||||
from django.middleware.common import CommonMiddleware
|
||||
from django.middleware.http import ConditionalGetMiddleware
|
||||
|
@ -322,6 +322,12 @@ class ConditionalGetMiddlewareTest(TestCase):
|
|||
self.assertTrue('Content-Length' in self.resp)
|
||||
self.assertEqual(int(self.resp['Content-Length']), content_length)
|
||||
|
||||
def test_content_length_header_not_added(self):
|
||||
resp = StreamingHttpResponse('content')
|
||||
self.assertFalse('Content-Length' in resp)
|
||||
resp = ConditionalGetMiddleware().process_response(self.req, resp)
|
||||
self.assertFalse('Content-Length' in resp)
|
||||
|
||||
def test_content_length_header_not_changed(self):
|
||||
bad_content_length = len(self.resp.content) + 10
|
||||
self.resp['Content-Length'] = bad_content_length
|
||||
|
@ -351,6 +357,29 @@ class ConditionalGetMiddlewareTest(TestCase):
|
|||
self.resp = ConditionalGetMiddleware().process_response(self.req, self.resp)
|
||||
self.assertEqual(self.resp.status_code, 200)
|
||||
|
||||
@override_settings(USE_ETAGS=True)
|
||||
def test_etag(self):
|
||||
req = HttpRequest()
|
||||
res = HttpResponse('content')
|
||||
self.assertTrue(
|
||||
CommonMiddleware().process_response(req, res).has_header('ETag'))
|
||||
|
||||
@override_settings(USE_ETAGS=True)
|
||||
def test_etag_streaming_response(self):
|
||||
req = HttpRequest()
|
||||
res = StreamingHttpResponse(['content'])
|
||||
res['ETag'] = 'tomatoes'
|
||||
self.assertEqual(
|
||||
CommonMiddleware().process_response(req, res).get('ETag'),
|
||||
'tomatoes')
|
||||
|
||||
@override_settings(USE_ETAGS=True)
|
||||
def test_no_etag_streaming_response(self):
|
||||
req = HttpRequest()
|
||||
res = StreamingHttpResponse(['content'])
|
||||
self.assertFalse(
|
||||
CommonMiddleware().process_response(req, res).has_header('ETag'))
|
||||
|
||||
# Tests for the Last-Modified header
|
||||
|
||||
def test_if_modified_since_and_no_last_modified(self):
|
||||
|
@ -511,6 +540,7 @@ class GZipMiddlewareTest(TestCase):
|
|||
short_string = b"This string is too short to be worth compressing."
|
||||
compressible_string = b'a' * 500
|
||||
uncompressible_string = b''.join(six.int2byte(random.randint(0, 255)) for _ in xrange(500))
|
||||
sequence = [b'a' * 500, b'b' * 200, b'a' * 300]
|
||||
|
||||
def setUp(self):
|
||||
self.req = HttpRequest()
|
||||
|
@ -525,6 +555,8 @@ class GZipMiddlewareTest(TestCase):
|
|||
self.resp.status_code = 200
|
||||
self.resp.content = self.compressible_string
|
||||
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'
|
||||
|
||||
@staticmethod
|
||||
def decompress(gzipped_string):
|
||||
|
@ -539,6 +571,15 @@ class GZipMiddlewareTest(TestCase):
|
|||
self.assertEqual(r.get('Content-Encoding'), 'gzip')
|
||||
self.assertEqual(r.get('Content-Length'), str(len(r.content)))
|
||||
|
||||
def test_compress_streaming_response(self):
|
||||
"""
|
||||
Tests that compression is performed on responses with streaming content.
|
||||
"""
|
||||
r = GZipMiddleware().process_response(self.req, self.stream_resp)
|
||||
self.assertEqual(self.decompress(b''.join(r)), b''.join(self.sequence))
|
||||
self.assertEqual(r.get('Content-Encoding'), 'gzip')
|
||||
self.assertFalse(r.has_header('Content-Length'))
|
||||
|
||||
def test_compress_non_200_response(self):
|
||||
"""
|
||||
Tests that compression is performed on responses with a status other than 200.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue