summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Schetinin <sergey@maluke.com>2011-12-26 12:40:26 +0200
committerSergey Schetinin <sergey@maluke.com>2011-12-26 12:40:26 +0200
commitd4d36ab34de30f7f2394f4b33b36f75da40e4b62 (patch)
tree6f3857ec38532ddc410383ddeac9687c99fec2a1
parentade7629dd4a0fd1556eeff60ac119ece72f46d5e (diff)
downloadwebob-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.py9
-rw-r--r--webob/compat.py3
-rw-r--r--webob/request.py11
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(),