From 8d503286205cf07fad8f35cc18bc4078d57aa0e3 Mon Sep 17 00:00:00 2001 From: Ryan Petrello Date: Tue, 23 Sep 2014 14:01:31 -0400 Subject: When detecting non-content for HTTP 204, properly catch UnicodeDecodeError. Fixes-bug: 1373003 Change-Id: I7761004c047976195a680bfb2ca23fe92516f3a6 --- pecan/core.py | 12 +++++++++--- pecan/tests/test_base.py | 8 ++++++++ 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/pecan/core.py b/pecan/core.py index 9174c50..23a427d 100644 --- a/pecan/core.py +++ b/pecan/core.py @@ -594,9 +594,15 @@ class PecanBase(object): else: text = None if state.response.charset: - # `response.text` cannot be accessed without a charset - # (because we don't know which encoding to use) - text = state.response.text + # `response.text` cannot be accessed without a valid + # charset (because we don't know which encoding to use) + try: + text = state.response.text + except UnicodeDecodeError: + # If a valid charset is not specified, don't bother + # trying to guess it (because there's obviously + # content, so we know this shouldn't be a 204) + pass if not any((state.response.body, text)): state.response.status = 204 diff --git a/pecan/tests/test_base.py b/pecan/tests/test_base.py index 35f48ab..e6ddb05 100644 --- a/pecan/tests/test_base.py +++ b/pecan/tests/test_base.py @@ -68,6 +68,10 @@ class TestEmptyContent(PecanTestCase): def explicit_json_body(self): response.json_body = {'foo': 'bar'} + @expose() + def non_unicode(self): + return chr(0xc0) + return TestApp(Pecan(RootController())) def test_empty_index(self): @@ -77,6 +81,10 @@ class TestEmptyContent(PecanTestCase): self.assertEqual(r.headers['Content-Length'], '0') self.assertEqual(len(r.body), 0) + def test_index_with_non_unicode(self): + r = self.app_.get('/non_unicode/') + self.assertEqual(r.status_int, 200) + def test_explicit_body(self): r = self.app_.get('/explicit_body/') self.assertEqual(r.status_int, 200) -- cgit v1.2.1