From ed7b14899fcc196acb5631819585dcc2be1b41f7 Mon Sep 17 00:00:00 2001 From: barberj Date: Fri, 20 Apr 2012 22:15:35 -0400 Subject: [PATCH 1/6] added mutlipart file=strings --- requests/models.py | 4 +++- tests/test_requests.py | 15 +++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/requests/models.py b/requests/models.py index 62aeb9c5..75692447 100644 --- a/requests/models.py +++ b/requests/models.py @@ -32,7 +32,7 @@ from .utils import ( DEFAULT_CA_BUNDLE_PATH) from .compat import ( cookielib, urlparse, urlunparse, urljoin, urlsplit, urlencode, str, bytes, - is_py2) + StringIO, is_py2) # Import chardet if it is available. try: @@ -348,6 +348,8 @@ class Request(object): else: fn = guess_filename(v) or k fp = v + if isinstance(fp, bytes): + fp = StringIO(fp) fields.update({k: (fn, fp.read())}) (body, content_type) = encode_multipart_formdata(fields) diff --git a/tests/test_requests.py b/tests/test_requests.py index 71967bb3..43745a56 100755 --- a/tests/test_requests.py +++ b/tests/test_requests.py @@ -329,6 +329,21 @@ class RequestsTestSuite(TestSetup, TestBaseMixin, unittest.TestCase): self.assertEqual(post2.status_code, 200) + def test_POSTBIN_GET_POST_FILES_STRINGS(self): + + for service in SERVICES: + + url = service('post') + + post1 = post(url, files={'fname.txt': 'fdata'}) + self.assertEqual(post1.status_code, 200) + + post2 = post(url, files={'fname.txt': 'fdata', 'fname2.txt':'more fdata'}) + self.assertEqual(post2.status_code, 200) + + post3 = post(url, files={'fname.txt': 'fdata', 'fname2.txt':open(__file__,'rb')}) + self.assertEqual(post3.status_code, 200) + def test_nonzero_evaluation(self): for service in SERVICES: From 0a7d98871c08029c9562699fde92ba293a3a791a Mon Sep 17 00:00:00 2001 From: barberj Date: Fri, 20 Apr 2012 22:18:28 -0400 Subject: [PATCH 2/6] credit where credits due --- AUTHORS.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.rst b/AUTHORS.rst index a4b2411b..658f0b96 100644 --- a/AUTHORS.rst +++ b/AUTHORS.rst @@ -98,3 +98,4 @@ Patches and Suggestions - Shivaram Lingamneni - Miguel Turner - Rohan Jain (crodjer) +- Justin Barber From 3288426f2bb4fc52f58ea6422444bc013ce31a8c Mon Sep 17 00:00:00 2001 From: barberj Date: Fri, 20 Apr 2012 23:30:45 -0400 Subject: [PATCH 3/6] added unicode strings --- requests/models.py | 2 +- tests/test_requests.py | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/requests/models.py b/requests/models.py index 75692447..c0d613bb 100644 --- a/requests/models.py +++ b/requests/models.py @@ -348,7 +348,7 @@ class Request(object): else: fn = guess_filename(v) or k fp = v - if isinstance(fp, bytes): + if isinstance(fp, (bytes, str)): fp = StringIO(fp) fields.update({k: (fn, fp.read())}) diff --git a/tests/test_requests.py b/tests/test_requests.py index 43745a56..e8a9d4ee 100755 --- a/tests/test_requests.py +++ b/tests/test_requests.py @@ -344,6 +344,15 @@ class RequestsTestSuite(TestSetup, TestBaseMixin, unittest.TestCase): post3 = post(url, files={'fname.txt': 'fdata', 'fname2.txt':open(__file__,'rb')}) self.assertEqual(post3.status_code, 200) + post4 = post(url, files={'fname.txt': u'fdata'}) + self.assertEqual(post4.status_code, 200) + + post5 = post(url, files={'file': ('file.txt', 'more fdata')}) + self.assertEqual(post5.status_code, 200) + + post6 = post(url, files={'fname.txt': u'\xe9'}) + self.assertEqual(post6.status_code, 200) + def test_nonzero_evaluation(self): for service in SERVICES: From e912a6f5da30e9a5507fd14cb6cb32f7e05611c0 Mon Sep 17 00:00:00 2001 From: barberj Date: Wed, 25 Apr 2012 16:45:21 -0400 Subject: [PATCH 4/6] sending strings to be received as files --- docs/user/quickstart.rst | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/docs/user/quickstart.rst b/docs/user/quickstart.rst index 62316309..bdb6635c 100644 --- a/docs/user/quickstart.rst +++ b/docs/user/quickstart.rst @@ -222,6 +222,34 @@ Setting filename explicitly:: "data": "" } +Sending strings to be received as files:: + + >>> url = 'http://httpbin.org/post' + >>> files = {'file': ('report.csv', 'some,data,to,send\nanother,row,to,send\n')} + + >>> r = requests.post(url, files=files) + >>> r.text + { + "origin": "179.13.100.4", + "files": { + "file": "some,data,to,send\\nanother,row,to,send\\n" + }, + "form": {}, + "url": "http://httpbin.org/post", + "args": {}, + "headers": { + "Content-Length": "216", + "Accept-Encoding": "identity, deflate, compress, gzip", + "Connection": "keep-alive", + "Accept": "*/*", + "User-Agent": "python-requests/0.11.1", + "Host": "httpbin.org", + "Content-Type": "multipart/form-data; boundary=127.0.0.1.502.41433.1335385481.788.1" + }, + "json": null, + "data": "" + } + Response Status Codes --------------------- From 64eb415ec0595f4ee5a59578dbbbb99200755c49 Mon Sep 17 00:00:00 2001 From: barberj Date: Sun, 6 May 2012 18:50:42 -0400 Subject: [PATCH 5/6] synatx error for python3. all strings are unicode --- tests/test_requests.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_requests.py b/tests/test_requests.py index e8a9d4ee..4a71af75 100755 --- a/tests/test_requests.py +++ b/tests/test_requests.py @@ -344,13 +344,13 @@ class RequestsTestSuite(TestSetup, TestBaseMixin, unittest.TestCase): post3 = post(url, files={'fname.txt': 'fdata', 'fname2.txt':open(__file__,'rb')}) self.assertEqual(post3.status_code, 200) - post4 = post(url, files={'fname.txt': u'fdata'}) + post4 = post(url, files={'fname.txt': 'fdata'}) self.assertEqual(post4.status_code, 200) post5 = post(url, files={'file': ('file.txt', 'more fdata')}) self.assertEqual(post5.status_code, 200) - post6 = post(url, files={'fname.txt': u'\xe9'}) + post6 = post(url, files={'fname.txt': '\xe9'}) self.assertEqual(post6.status_code, 200) def test_nonzero_evaluation(self): From b06690270500c9b550c989ed3ddf0115808e8796 Mon Sep 17 00:00:00 2001 From: barberj Date: Sun, 6 May 2012 19:24:37 -0400 Subject: [PATCH 6/6] adding test verifying data httpbin sees --- tests/test_requests.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tests/test_requests.py b/tests/test_requests.py index 4a71af75..530008a3 100755 --- a/tests/test_requests.py +++ b/tests/test_requests.py @@ -353,6 +353,13 @@ class RequestsTestSuite(TestSetup, TestBaseMixin, unittest.TestCase): post6 = post(url, files={'fname.txt': '\xe9'}) self.assertEqual(post6.status_code, 200) + post7 = post(url, files={'fname.txt': 'fdata to verify'}) + rbody = json.loads(post7.text) + self.assertTrue(rbody.get('files', None)) + self.assertTrue(rbody['files'].get('fname.txt'), None) + self.assertEqual(rbody['files']['fname.txt'], 'fdata to verify') + + def test_nonzero_evaluation(self): for service in SERVICES: