From ceecc962ad8f6bbbc2b989aec53eee6c6cca04b9 Mon Sep 17 00:00:00 2001 From: Baptiste Mispelon Date: Sat, 16 Nov 2013 00:54:20 +0100 Subject: [PATCH] Fixed #21447 -- Restored code erroneously removed in 20472aa827669d2b83b74e521504e88e18d086a1. Also added some tests for HttpRequest.__repr__. Note that the added tests don't actually catch the accidental code removal (see ticket) but they do cover a codepath that wasn't tested before. Thanks to Tom Christie for the report and the original patch. --- django/http/request.py | 2 +- tests/requests/tests.py | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/django/http/request.py b/django/http/request.py index 4d11fb21e0..1aefe6bf22 100644 --- a/django/http/request.py +++ b/django/http/request.py @@ -242,7 +242,7 @@ class HttpRequest(object): # Mark that an error occured. This allows self.__repr__ to # be explicit about it instead of simply representing an # empty POST - # self._mark_post_parse_error() + self._mark_post_parse_error() raise elif self.META.get('CONTENT_TYPE', '').startswith('application/x-www-form-urlencoded'): self._post, self._files = QueryDict(self.body, encoding=self._encoding), MultiValueDict() diff --git a/tests/requests/tests.py b/tests/requests/tests.py index 2a69638260..850cf70c2f 100644 --- a/tests/requests/tests.py +++ b/tests/requests/tests.py @@ -42,6 +42,22 @@ class RequestsTests(SimpleTestCase): self.assertEqual(build_request_repr(request, path_override='/otherpath/', GET_override={'a': 'b'}, POST_override={'c': 'd'}, COOKIES_override={'e': 'f'}, META_override={'g': 'h'}), str_prefix("")) + def test_bad_httprequest_repr(self): + """ + If an exception occurs when parsing GET, POST, COOKIES, or META, the + repr of the request should show it. + """ + class Bomb(object): + """An object that raises an exception when printed out.""" + def __repr__(self): + raise Exception('boom!') + + bomb = Bomb() + for attr in ['GET', 'POST', 'COOKIES', 'META']: + request = HttpRequest() + setattr(request, attr, {'bomb': bomb}) + self.assertIn('%s:' % attr, repr(request)) + def test_wsgirequest(self): request = WSGIRequest({'PATH_INFO': 'bogus', 'REQUEST_METHOD': 'bogus', 'wsgi.input': BytesIO(b'')}) self.assertEqual(list(request.GET.keys()), [])