# HG changeset patch # User Christophe de Vienne # Date 1410166530 -7200 # Node ID 9b3b21b7ff3e92549b7587f8d6849f05ae837e3b # Parent a4aeee690bffd46f38f82bb4c7c2efece2e1b3d5 [wsgi] Fix multiple variables reading in params Closes #4306081 diff -r a4aeee690bff -r 9b3b21b7ff3e wsgi/request.py --- a/wsgi/request.py Tue Sep 02 13:00:47 2014 +0200 +++ b/wsgi/request.py Mon Sep 08 10:55:30 2014 +0200 @@ -30,6 +30,7 @@ from StringIO import StringIO from urllib import quote from urlparse import parse_qs +from warnings import warn from cubicweb.multipart import copy_file, parse_form_data from cubicweb.web.request import CubicWebRequestBase @@ -152,6 +153,38 @@ if self.method == 'POST': forms, files = parse_form_data(self.environ, strict=True, mem_limit=self.vreg.config['max-post-length']) - post.update(forms) + post.update(forms.dict) self.content.seek(0, 0) return post, files + + def setup_params(self, params): + # This is a copy of CubicWebRequestBase.setup_params, but without + # converting unicode strings because it is partially done by + # get_posted_data + self.form = {} + if params is None: + return + encoding = self.encoding + for param, val in params.iteritems(): + if isinstance(val, (tuple, list)): + val = [ + unicode(x, encoding) if isinstance(x, str) else x + for x in val] + if len(val) == 1: + val = val[0] + elif isinstance(val, str): + val = unicode(val, encoding) + if param in self.no_script_form_params and val: + val = self.no_script_form_param(param, val) + if param == '_cwmsgid': + self.set_message_id(val) + elif param == '__message': + warn('[3.13] __message in request parameter is deprecated (may ' + 'only be given to .build_url). Seeing this message usualy ' + 'means your application hold some
where you should ' + 'replace use of __message hidden input by form.set_message, ' + 'so new _cwmsgid mechanism is properly used', + DeprecationWarning) + self.set_message(val) + else: + self.form[param] = val diff -r a4aeee690bff -r 9b3b21b7ff3e wsgi/test/unittest_wsgi.py --- a/wsgi/test/unittest_wsgi.py Tue Sep 02 13:00:47 2014 +0200 +++ b/wsgi/test/unittest_wsgi.py Mon Sep 08 10:55:30 2014 +0200 @@ -64,6 +64,18 @@ '/', params={'__login': self.admlogin, '__password': self.admpassword}) + def test_get_multiple_variables(self): + r = webtest.app.TestRequest.blank('/?arg=1&arg=2') + req = CubicWebWsgiRequest(r.environ, self.vreg) + + self.assertEqual([u'1', u'2'], req.form['arg']) + + def test_post_multiple_variables(self): + r = webtest.app.TestRequest.blank('/', POST='arg=1&arg=2') + req = CubicWebWsgiRequest(r.environ, self.vreg) + + self.assertEqual([u'1', u'2'], req.form['arg']) + @classmethod def init_config(cls, config): super(WSGIAppTC, cls).init_config(config)