summaryrefslogtreecommitdiff
path: root/repoze
diff options
context:
space:
mode:
Diffstat (limited to 'repoze')
-rw-r--r--repoze/bfg/request.py19
-rw-r--r--repoze/bfg/tests/test_request.py49
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
+
+
+
+