diff options
| author | Sergey Schetinin <sergey@maluke.com> | 2011-12-26 12:40:26 +0200 |
|---|---|---|
| committer | Sergey Schetinin <sergey@maluke.com> | 2011-12-26 12:40:26 +0200 |
| commit | d4d36ab34de30f7f2394f4b33b36f75da40e4b62 (patch) | |
| tree | 6f3857ec38532ddc410383ddeac9687c99fec2a1 | |
| parent | ade7629dd4a0fd1556eeff60ac119ece72f46d5e (diff) | |
| download | webob-d4d36ab34de30f7f2394f4b33b36f75da40e4b62.tar.gz | |
fix https://github.com/Pylons/webob/issues/18 (non-ascii form POST, then parse, then serialize)
| -rw-r--r-- | tests/test_request_nose.py | 9 | ||||
| -rw-r--r-- | webob/compat.py | 3 | ||||
| -rw-r--r-- | webob/request.py | 11 |
3 files changed, 18 insertions, 5 deletions
diff --git a/tests/test_request_nose.py b/tests/test_request_nose.py index cb0665b..6f0026c 100644 --- a/tests/test_request_nose.py +++ b/tests/test_request_nose.py @@ -180,3 +180,12 @@ def test_json_body_alternate_charset(): def test_json_body_GET_request(): request = Request.blank('/') assert_raises(ValueError, getattr, request, 'json_body') + +def test_non_ascii_body_params(): + body = 'test=%D1%82%D0%B5%D1%81%D1%82' + req = Request.blank('/', POST=body) + # acessing params parses request body + req.params + # accessing body again makes the POST dict serialize again + # make sure it can handle the non-ascii characters in the query + eq(req.body, body) diff --git a/webob/compat.py b/webob/compat.py index 7cda0c4..6a87516 100644 --- a/webob/compat.py +++ b/webob/compat.py @@ -52,10 +52,11 @@ if PY3: # pragma: no cover from urllib import parse urlparse = parse from urllib.parse import quote as url_quote - from urllib.parse import urlencode as url_encode + from urllib.parse import urlencode as url_encode, quote_plus from urllib.request import urlopen as url_open else: import urlparse + from urllib import quote_plus from urllib import quote as url_quote from urllib import unquote as url_unquote from urllib import urlencode as url_encode diff --git a/webob/request.py b/webob/request.py index 27c3480..8e65506 100644 --- a/webob/request.py +++ b/webob/request.py @@ -33,6 +33,7 @@ from webob.compat import ( url_encode, url_quote, url_unquote, + quote_plus, urlparse, ) @@ -373,7 +374,7 @@ class BaseRequest(object): port = '80' else: port = e['SERVER_PORT'] - return port + return port @property def host_url(self): @@ -1454,9 +1455,11 @@ class FakeCGIBody(io.RawIOBase): if self.file is None: if self.content_type.startswith( 'application/x-www-form-urlencoded'): - # TODO: check if bytes_ is necessary - data = bytes_(url_encode(self.vars), 'utf8') - self.file = io.BytesIO(data) + data = '&'.join( + '%s=%s' % (quote_plus(bytes_(k, 'utf8')), quote_plus(bytes_(v, 'utf8'))) + for k,v in self.vars.items() + ) + self.file = io.BytesIO(bytes_(data)) elif self.content_type.startswith('multipart/form-data'): self.file = _encode_multipart( self.vars.items(), |
