Skip to content

Commit

Permalink
Merge pull request #5 from roman-alexeev/response_bytes_conversion
Browse files Browse the repository at this point in the history
Fix handling of responses where content is `bytes`
  • Loading branch information
barseghyanartur committed Sep 24, 2019
2 parents a44e08e + f2a3abb commit d13e6b4
Show file tree
Hide file tree
Showing 4 changed files with 52 additions and 15 deletions.
13 changes: 4 additions & 9 deletions src/debug_toolbar_force/middleware.py
Expand Up @@ -2,9 +2,9 @@

from django.http import HttpResponse
from django.utils.translation import ugettext_lazy as _
from django.utils.encoding import smart_text

from nine.versions import DJANGO_GTE_1_10
from six import text_type

from .settings import GET_PARAM_NAME_FORCE, GET_PARAM_NAME_NON_AJAX

Expand Down Expand Up @@ -60,13 +60,8 @@ def process_response(self, request, response):
len(response.content))
response = HttpResponse(new_content)
elif response['Content-Type'] != 'text/html':
content = response.content
try:
json_ = json.loads(text_type(content))
content = json.dumps(json_, sort_keys=True, indent=2)
except ValueError:
pass
response = HttpResponse('<html><body>{}'
'</body></html>'.format(content))
content = smart_text(response.content)
response = HttpResponse(u'<html><body>{}'
u'</body></html>'.format(content))

return response
2 changes: 2 additions & 0 deletions src/debug_toolbar_force/tests/foo/urls.py
Expand Up @@ -3,6 +3,7 @@
from .views import (
ajax_view,
json_view,
json_bytes_view,
html_view,
partial_html_view
)
Expand All @@ -17,6 +18,7 @@
urlpatterns = [
url(r'^ajax-view/$', view=ajax_view, name='foo.ajax_view'),
url(r'^json-view/$', view=json_view, name='foo.json_view'),
url(r'^json-bytes-view/$', view=json_bytes_view, name='foo.json_bytes_view'),
url(r'^html-view/$', view=html_view, name='foo.html_view'),
url(r'^partial-html-view/$',
view=partial_html_view,
Expand Down
11 changes: 8 additions & 3 deletions src/debug_toolbar_force/tests/foo/views.py
@@ -1,7 +1,7 @@
from django.http import JsonResponse
from django.http import JsonResponse, HttpResponse
from django.shortcuts import render

from six import text_type
import json

__title__ = 'debug_toolbar_force.tests.foo.views'
__author__ = 'Artur Barseghyan <artur.barseghyan@gmail.com>'
Expand All @@ -17,8 +17,13 @@

def json_view(request):
"""JSON view."""
return JsonResponse(text_type([1, 2, 3]), safe=False)
# Standard Django way, content will be unicode
return JsonResponse([1, 2, 3], safe=False)

def json_bytes_view(request):
"""JSON view, returns bytes"""
# Something an application may do is return bytes instead of unicode
return HttpResponse(json.dumps([1, 2, 3]), content_type="application/json")

def ajax_view(request, template_name='foo/ajax_view.html'):
"""AJAX view."""
Expand Down
41 changes: 38 additions & 3 deletions src/debug_toolbar_force/tests/test_core.py
Expand Up @@ -17,6 +17,8 @@
else:
from django.core.urlresolvers import reverse

from django.utils.encoding import smart_text

__title__ = 'debug_toolbar_force.tests.test_core'
__author__ = 'Artur Barseghyan <artur.barseghyan@gmail.com>'
__copyright__ = '2016-2019 Artur Barseghyan'
Expand Down Expand Up @@ -50,26 +52,59 @@ def __test_view(self, reverse_url, force=True):
self.assertIsNotNone(ddt_div)
return ddt_div

@log_info
def __test_view_unchanged(self, reverse_url):
"""Test that the body is unchanged in force mode
(other than html and formatting and links etc)"""
resp_noforce = self.client.get(self.__get_url(reverse_url, force=False))
resp_force= self.client.get(self.__get_url(reverse_url, force=True))

soup = BeautifulSoup(resp_force.content, "html.parser")
body_noforce = resp_noforce.content
body_force = list(soup.find('body').children)[0]

def canonic(txt):
return smart_text(txt).strip()

self.assertEqual(canonic(body_noforce), canonic(body_force))


@log_info
def test_01_json_view(self):
"""Test JSON view."""
return self.__test_view('foo.json_view')

@log_info
def test_02_ajax_view(self):
def test_02_json_bytes_view(self):
"""Test JSON view returning bytes."""
return self.__test_view('foo.json_bytes_view')

@log_info
def test_03_ajax_view(self):
"""Test AJAX view."""
return self.__test_view('foo.ajax_view')

@log_info
def test_03_html_view(self):
def test_04_html_view(self):
"""Test HTML view."""
return self.__test_view('foo.html_view')

@log_info
def test_04_partial_html_view(self):
def test_05_partial_html_view(self):
"""Test partial HTML view."""
return self.__test_view('foo.partial_html_view')

@log_info
def test_06_json_view_unchanged(self):
"""Test JSON view body content is not being changed"""
return self.__test_view_unchanged('foo.json_view')

@log_info
def test_07_json_bytes_view_unchanged(self):
"""Test JSON view returning bytes body content is not being changed"""
return self.__test_view_unchanged('foo.json_bytes_view')


if __name__ == '__main__':
unittest.main()

0 comments on commit d13e6b4

Please sign in to comment.