Commit 9588718c authored by Claude Paroz's avatar Claude Paroz
Browse files

Fixed #5897 -- Added the Content-Length response header in CommonMiddleware

Thanks Tim Graham for the review.
parent ca77b509
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -123,6 +123,10 @@ class CommonMiddleware(MiddlewareMixin):
                    etag=unquote_etag(response['ETag']),
                    response=response,
                )
        # Add the Content-Length header to non-streaming responses if not
        # already set.
        if not response.streaming and not response.has_header('Content-Length'):
            response['Content-Length'] = str(len(response.content))

        return response

+6 −0
Original line number Diff line number Diff line
@@ -66,6 +66,12 @@ Adds a few conveniences for perfectionists:
  for each request by MD5-hashing the page content, and it'll take care of
  sending ``Not Modified`` responses, if appropriate.

* Sets the ``Content-Length`` header for non-streaming responses.

.. versionchanged: 1.11

    Older versions didn't set the ``Content-Length`` header.

.. attribute:: CommonMiddleware.response_redirect_class

Defaults to :class:`~django.http.HttpResponsePermanentRedirect`. Subclass
+3 −0
Original line number Diff line number Diff line
@@ -197,6 +197,9 @@ Requests and Responses

* Added :meth:`QueryDict.fromkeys() <django.http.QueryDict.fromkeys>`.

* :class:`~django.middleware.common.CommonMiddleware` now sets the
  ``Content-Length`` response header for non-streaming responses.

Serialization
~~~~~~~~~~~~~

+24 −0
Original line number Diff line number Diff line
@@ -285,6 +285,27 @@ class CommonMiddlewareTest(SimpleTestCase):
        second_res = CommonMiddleware().process_response(second_req, HttpResponse('content'))
        self.assertEqual(second_res.status_code, 304)

    # Tests for the Content-Length header

    def test_content_length_header_added(self):
        response = HttpResponse('content')
        self.assertNotIn('Content-Length', response)
        response = CommonMiddleware().process_response(HttpRequest(), response)
        self.assertEqual(int(response['Content-Length']), len(response.content))

    def test_content_length_header_not_added_for_streaming_response(self):
        response = StreamingHttpResponse('content')
        self.assertNotIn('Content-Length', response)
        response = CommonMiddleware().process_response(HttpRequest(), response)
        self.assertNotIn('Content-Length', response)

    def test_content_length_header_not_changed(self):
        response = HttpResponse()
        bad_content_length = len(response.content) + 10
        response['Content-Length'] = bad_content_length
        response = CommonMiddleware().process_response(HttpRequest(), response)
        self.assertEqual(int(response['Content-Length']), bad_content_length)

    # Other tests

    @override_settings(DISALLOWED_USER_AGENTS=[re.compile(r'foo')])
@@ -445,6 +466,9 @@ class ConditionalGetMiddlewareTest(SimpleTestCase):

    def test_content_length_header_added(self):
        content_length = len(self.resp.content)
        # Already set by CommonMiddleware, remove it to check that
        # ConditionalGetMiddleware readds it.
        del self.resp['Content-Length']
        self.assertNotIn('Content-Length', self.resp)
        self.resp = ConditionalGetMiddleware().process_response(self.req, self.resp)
        self.assertIn('Content-Length', self.resp)
+1 −0
Original line number Diff line number Diff line
@@ -41,6 +41,7 @@ class TestStartProjectSettings(TestCase):
            response = self.client.get('/empty/')
            headers = sorted(response.serialize_headers().split(b'\r\n'))
            self.assertEqual(headers, [
                b'Content-Length: 0',
                b'Content-Type: text/html; charset=utf-8',
                b'X-Frame-Options: SAMEORIGIN',
            ])
Loading