diff options
Diffstat (limited to 'repoze')
| -rw-r--r-- | repoze/bfg/request.py | 19 | ||||
| -rw-r--r-- | repoze/bfg/tests/test_request.py | 49 |
2 files changed, 65 insertions, 3 deletions
diff --git a/repoze/bfg/request.py b/repoze/bfg/request.py index 8d938e974..de5711e0a 100644 --- a/repoze/bfg/request.py +++ b/repoze/bfg/request.py @@ -3,6 +3,17 @@ from webob import Request as WebobRequest import repoze.bfg.interfaces +def make_request_ascii(event): + """ An event handler that causes the request charset to be ASCII; + used as an INewRequest subscriber so code written before 0.7.0 can + continue to work without a change""" + request = event.request + request.charset = None + +class Request(WebobRequest): + implements(repoze.bfg.interfaces.IRequest) + charset = 'utf-8' + # We use 'precooked' Request subclasses that correspond to HTTP # request methods within ``router.py`` when constructing a request # object rather than using ``alsoProvides`` to attach the proper @@ -13,23 +24,25 @@ import repoze.bfg.interfaces # ``HTTP_METHOD_FACTORIES`` lookup dict should be imported directly by # user code. -class Request(WebobRequest): - implements(repoze.bfg.interfaces.IRequest) - class GETRequest(WebobRequest): implements(repoze.bfg.interfaces.IGETRequest) + charset = 'utf-8' class POSTRequest(WebobRequest): implements(repoze.bfg.interfaces.IPOSTRequest) + charset = 'utf-8' class PUTRequest(WebobRequest): implements(repoze.bfg.interfaces.IPUTRequest) + charset = 'utf-8' class DELETERequest(WebobRequest): implements(repoze.bfg.interfaces.IDELETERequest) + charset = 'utf-8' class HEADRequest(WebobRequest): implements(repoze.bfg.interfaces.IHEADRequest) + charset = 'utf-8' HTTP_METHOD_FACTORIES = { 'GET':GETRequest, diff --git a/repoze/bfg/tests/test_request.py b/repoze/bfg/tests/test_request.py new file mode 100644 index 000000000..f2124d4c9 --- /dev/null +++ b/repoze/bfg/tests/test_request.py @@ -0,0 +1,49 @@ +import unittest + +class TestMakeRequestASCII(unittest.TestCase): + def _callFUT(self, event): + from repoze.bfg.request import make_request_ascii + return make_request_ascii(event) + + def test_it(self): + request = DummyRequest() + event = DummyNewRequestEvent(request) + self._callFUT(event) + self.assertEqual(request.charset, None) + +class TestSubclassedRequest(unittest.TestCase): + def _getTargetClass(self): + from repoze.bfg.request import Request + return Request + + def _makeOne(self, environ): + request = self._getTargetClass()(environ) + return request + + def test_params_decoded_from_utf_8_by_default(self): + environ = { + 'PATH_INFO':'/', + 'QUERY_STRING':'la=La%20Pe%C3%B1a' + } + request = self._makeOne(environ) + self.assertEqual(request.GET['la'], u'La Pe\xf1a') + + def test_params_bystring_when_charset_None(self): + environ = { + 'PATH_INFO':'/', + 'QUERY_STRING':'la=La%20Pe%C3%B1a' + } + request = self._makeOne(environ) + request.charset = None + self.assertEqual(request.GET['la'], 'La Pe\xc3\xb1a') + +class DummyRequest: + pass + +class DummyNewRequestEvent: + def __init__(self, request): + self.request = request + + + + |
