From fe2f018b1af456b7a5a5738cd3b0ac9602ad4087 Mon Sep 17 00:00:00 2001 From: Daniel Grana Date: Thu, 5 Feb 2009 13:41:10 +0000 Subject: [PATCH] FormRequest: urlencode multiples values of a single key using doseq this prevents urllib.urlencode from sending the repr of the value when it founds a list or tuple. --HG-- extra : convert_revision : svn%3Ab85faa78-f9eb-468e-a121-7cced6da292c%40825 --- scrapy/trunk/scrapy/http/request/form.py | 13 +++++++++++-- scrapy/trunk/scrapy/tests/test_http_request.py | 5 +++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/scrapy/trunk/scrapy/http/request/form.py b/scrapy/trunk/scrapy/http/request/form.py index 1c8595be7..5bba9627c 100644 --- a/scrapy/trunk/scrapy/http/request/form.py +++ b/scrapy/trunk/scrapy/http/request/form.py @@ -10,13 +10,22 @@ import urllib from scrapy.http.request import Request from scrapy.utils.python import unicode_to_str +def _unicode_to_str(string, encoding): + if hasattr(string, '__iter__'): + return [unicode_to_str(k, encoding) for k in string] + else: + return unicode_to_str(string, encoding) + + class FormRequest(Request): def __init__(self, *args, **kwargs): formdata = kwargs.pop('formdata', None) Request.__init__(self, *args, **kwargs) + if formdata: items = formdata.iteritems() if isinstance(formdata, dict) else formdata - query = [(unicode_to_str(k, self.encoding), unicode_to_str(v, self.encoding)) for k, v in items] - self.body = urllib.urlencode(query) + query = [(unicode_to_str(k, self.encoding), _unicode_to_str(v, self.encoding)) + for k, v in items] + self.body = urllib.urlencode(query, doseq=1) self.headers['Content-Type'] = 'application/x-www-form-urlencoded' diff --git a/scrapy/trunk/scrapy/tests/test_http_request.py b/scrapy/trunk/scrapy/tests/test_http_request.py index 580da4d4b..993a1ccd9 100644 --- a/scrapy/trunk/scrapy/tests/test_http_request.py +++ b/scrapy/trunk/scrapy/tests/test_http_request.py @@ -174,5 +174,10 @@ class RequestTest(unittest.TestCase): self.assertEqual(r3.encoding, 'latin1') self.assertEqual(r3.body, 'price=%A3+100') + # using multiples values for a single key + data = {'price': u'\xa3 100', 'colours': ['red', 'blue', 'green']} + r3 = FormRequest("http://www.example.com", formdata=data) + self.assertEqual(r3.body, 'colours=red&colours=blue&colours=green&price=%C2%A3+100') + if __name__ == "__main__": unittest.main()