From f0660e33a268e9517ad15b39457bcf9875f71619 Mon Sep 17 00:00:00 2001 From: Jason Emerick Date: Mon, 1 Apr 2013 18:10:12 -0400 Subject: [PATCH 1/6] add test for unicode multipart post --- test_requests.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/test_requests.py b/test_requests.py index 93b81236..13766a28 100644 --- a/test_requests.py +++ b/test_requests.py @@ -286,6 +286,12 @@ class RequestsTestCase(unittest.TestCase): files={'file': ('test_requests.py', open(__file__, 'rb'))}) self.assertEqual(r.status_code, 200) + def test_unicode_multipart_post(self): + r = requests.post(httpbin('post'), + data={'stuff': u'ëlïxr'}, + files={'file': ('test_requests.py', open(__file__, 'rb'))}) + self.assertEqual(r.status_code, 200) + def test_custom_content_type(self): r = requests.post(httpbin('post'), data={'stuff': json.dumps({'a': 123})}, From f37b9684756b9c495fdcea1db3b6edd6a76b6d47 Mon Sep 17 00:00:00 2001 From: Jason Emerick Date: Mon, 1 Apr 2013 18:14:52 -0400 Subject: [PATCH 2/6] use compat.str instead of compat.builtin_str --- requests/models.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/requests/models.py b/requests/models.py index 6ed2b599..8249ce3a 100644 --- a/requests/models.py +++ b/requests/models.py @@ -101,9 +101,9 @@ class RequestEncodingMixin(object): for field, val in fields: if isinstance(val, list): for v in val: - new_fields.append((field, builtin_str(v))) + new_fields.append((field, str(v))) else: - new_fields.append((field, builtin_str(val))) + new_fields.append((field, str(val))) for (k, v) in files: # support for explicit filename From 82d36d825902057c29d02d350070909840104d08 Mon Sep 17 00:00:00 2001 From: Jason Emerick Date: Tue, 2 Apr 2013 11:41:07 -0400 Subject: [PATCH 3/6] add additional test for unicode multipart post --- test_requests.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/test_requests.py b/test_requests.py index 13766a28..7c22e35e 100644 --- a/test_requests.py +++ b/test_requests.py @@ -292,6 +292,11 @@ class RequestsTestCase(unittest.TestCase): files={'file': ('test_requests.py', open(__file__, 'rb'))}) self.assertEqual(r.status_code, 200) + r = requests.post(httpbin('post'), + data={'stuff': u'ëlïxr'.encode('utf-8')}, + files={'file': ('test_requests.py', open(__file__, 'rb'))}) + self.assertEqual(r.status_code, 200) + def test_custom_content_type(self): r = requests.post(httpbin('post'), data={'stuff': json.dumps({'a': 123})}, From 168c3e691386602508213c992bac1d206b779358 Mon Sep 17 00:00:00 2001 From: Jason Emerick Date: Tue, 2 Apr 2013 14:22:12 -0400 Subject: [PATCH 4/6] add a few more variations to the unicode multipart post test --- test_requests.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/test_requests.py b/test_requests.py index 7c22e35e..d9268118 100644 --- a/test_requests.py +++ b/test_requests.py @@ -297,6 +297,16 @@ class RequestsTestCase(unittest.TestCase): files={'file': ('test_requests.py', open(__file__, 'rb'))}) self.assertEqual(r.status_code, 200) + r = requests.post(httpbin('post'), + data={'stuff': 'elixr'}, + files={'file': ('test_requests.py', open(__file__, 'rb'))}) + self.assertEqual(r.status_code, 200) + + r = requests.post(httpbin('post'), + data={'stuff': 'elixr'.encode('utf-8')}, + files={'file': ('test_requests.py', open(__file__, 'rb'))}) + self.assertEqual(r.status_code, 200) + def test_custom_content_type(self): r = requests.post(httpbin('post'), data={'stuff': json.dumps({'a': 123})}, From e7247ce3f6d8115a6bc191e5ef816e04da82aa25 Mon Sep 17 00:00:00 2001 From: Jason Emerick Date: Tue, 2 Apr 2013 14:22:49 -0400 Subject: [PATCH 5/6] model the encode_files data handling after encode_params --- requests/models.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/requests/models.py b/requests/models.py index 8249ce3a..0860567a 100644 --- a/requests/models.py +++ b/requests/models.py @@ -99,11 +99,13 @@ class RequestEncodingMixin(object): files = to_key_val_list(files or {}) for field, val in fields: - if isinstance(val, list): - for v in val: - new_fields.append((field, str(v))) - else: - new_fields.append((field, str(val))) + if isinstance(val, basestring) or not hasattr(val, '__iter__'): + val = [val] + for v in val: + if v is not None: + new_fields.append( + (field.encode('utf-8') if isinstance(field, str) else field, + v.encode('utf-8') if isinstance(v, str) else v)) for (k, v) in files: # support for explicit filename From 736e8cd7358a475979da9d2e525e535e81fdab18 Mon Sep 17 00:00:00 2001 From: Iuri de Silvio Date: Wed, 17 Apr 2013 12:27:06 -0700 Subject: [PATCH 6/6] Fix max_redirects docs issue #1301 --- requests/sessions.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/requests/sessions.py b/requests/sessions.py index 27ca18fc..40e4d82b 100644 --- a/requests/sessions.py +++ b/requests/sessions.py @@ -212,7 +212,8 @@ class Session(SessionRedirectMixin): #: SSL certificate default. self.cert = None - #: Maximum number of redirects to follow. + #: Maximum number of redirects allowed. If the request exceeds this + #: limit, a :class:`TooManyRedirects` exception is raised. self.max_redirects = DEFAULT_REDIRECT_LIMIT #: Should we trust the environment?