Commit 0594fed9 authored by Łukasz Langa's avatar Łukasz Langa
Browse files

Fixed #20472: response.content should be bytes on both Python 2 and 3

parent 4ba1c2e7
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -31,13 +31,13 @@ def conditional_content_removal(request, response):
        if response.streaming:
            response.streaming_content = []
        else:
            response.content = ''
            response.content = b''
        response['Content-Length'] = '0'
    if request.method == 'HEAD':
        if response.streaming:
            response.streaming_content = []
        else:
            response.content = ''
            response.content = b''
    return response


+24 −0
Original line number Diff line number Diff line
from __future__ import unicode_literals

import io
import gzip

from django.http import HttpRequest, HttpResponse, StreamingHttpResponse
from django.http.utils import conditional_content_removal
from django.test import TestCase


# based on Python 3.3's gzip.compress
def gzip_compress(data):
    buf = io.BytesIO()
    with gzip.GzipFile(fileobj=buf, mode='wb', compresslevel=0) as f:
        f.write(data)
    return buf.getvalue()


class HttpUtilTests(TestCase):

    def test_conditional_content_removal(self):
@@ -33,6 +44,19 @@ class HttpUtilTests(TestCase):
            conditional_content_removal(req, res)
            self.assertEqual(b''.join(res), b'')

        # Issue #20472  
        abc = gzip_compress(b'abc')
        res = HttpResponse(abc, status=304)
        res['Content-Encoding'] = 'gzip'
        conditional_content_removal(req, res)
        self.assertEqual(res.content, b'')

        res = StreamingHttpResponse([abc], status=304)
        res['Content-Encoding'] = 'gzip'
        conditional_content_removal(req, res)
        self.assertEqual(b''.join(res), b'')


        # Strip content for HEAD requests.
        req.method = 'HEAD'