From 58d63d55bc0cbbb1d543a4165f2e80a808c5577e Mon Sep 17 00:00:00 2001 From: Mike Waldner Date: Sun, 28 Aug 2011 21:19:51 -0400 Subject: [PATCH 1/3] Sphinx Documentation #139 --- docs/api.rst | 4 ++++ requests/utils.py | 26 ++++++++++++++++++-------- 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/docs/api.rst b/docs/api.rst index e3338b66..328e9e8b 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -48,6 +48,10 @@ Cookies .. autofunction:: cookiejar_from_dict .. autofunction:: add_dict_to_cookiejar +Curl +~~~~ +.. autofunction:: curl_from_request + Encodings ~~~~~~~~~ diff --git a/requests/utils.py b/requests/utils.py index 8fa9d659..d4f05b5e 100644 --- a/requests/utils.py +++ b/requests/utils.py @@ -169,11 +169,21 @@ def decode_gzip(content): def curl_from_request(request): - """Creates a curl command from the request.""" + """Returns a curl command from the request. + + :param request: The :class:`Request ` object + + Example: + | import requests + | from requests.utils import curl_from_request + | r = requests.get('http://httpbin.org/get') + | curl_from_request(r.request) + + """ #TODO - OAuth - #: -L/--location - if there is a redirect, redo request on the new place + #: -L/--location - if there is a redirect, redo request on the new place. curl = 'curl -L ' #: -u/--user - Specify the user name and password to use for server auth. @@ -184,10 +194,10 @@ def curl_from_request(request): method = '' if request.method.upper() == 'HEAD': - #: -I/--head - fetch headers only + #: -I/--head - fetch headers only. method = '-I ' else: - #: -X/--request - specify request method + #: -X/--request - specify request method. method = '-X %s ' % request.method.upper() #: -b/--cookie @@ -197,15 +207,15 @@ def curl_from_request(request): if request.cookiejar: cookies = cookies.join(['-b "%s=%s" ' % (k.name, k.value) for k in request.cookiejar]) - #: -H/--header - Extra header to use when getting a web page + #: -H/--header - Extra header to use when getting a web page. header = '' if request.headers: header = header.join(['-H "%s:%s" ' % (k, v) for k, v in request.headers.iteritems()]) form = '' if request.method in ('PUT', 'POST', 'PATCH'): - #: request.files is updated with request.data if both exist. - #: ContentType multipart/form-data is used + #: request.files is updated with request.data if both exist, so only iterate request.files. + #: ContentType multipart/form-data is used. if request.files: #: -F/--form - Emulate form data. To force 'content' to a file, prefix file name @. for k, v in request.files.iteritems(): @@ -214,7 +224,7 @@ def curl_from_request(request): elif v not in (None, ''): form = form + '-F "%s=%s" ' % (k, v) - #: content-type application/x-www-form-urlencoded is used here + #: content-type application/x-www-form-urlencoded is used here. else: #: -d/--data - send specified data in post request. if isinstance(request.data, (list, tuple)): From e46351cfbd1ee908fecdd54c52bd928c370b4c05 Mon Sep 17 00:00:00 2001 From: Mike Waldner Date: Sun, 28 Aug 2011 23:31:43 -0400 Subject: [PATCH 2/3] Unit Tests for curl_from_request #139 --- test_requests.py | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/test_requests.py b/test_requests.py index dd923471..b3f590cd 100755 --- a/test_requests.py +++ b/test_requests.py @@ -14,6 +14,7 @@ except ImportError: import requests from requests.sessions import Session +from requests.utils import curl_from_request HTTPBIN_URL = 'http://httpbin.org/' @@ -470,6 +471,53 @@ class RequestsTestSuite(unittest.TestCase): self.assertEqual(r2.status_code, 200) + def test_curl_HTTP_OK_GET(self): + curl_str = 'curl -L -X GET -H "Accept-Encoding:gzip" -H "User-Agent:python-requests.org" "http://httpbin.org//"' + r = requests.get(httpbin('/')) + self.assertEqual(curl_from_request(r.request), curl_str) + + + def test_curl_HTTP_OK_GET_WITH_PARAMS(self): + curl_str = 'curl -L -X GET -H "Accept-Encoding:gzip" -H "User-agent:Mozilla/5.0" "http://httpbin.org/user-agent"' + + heads = {'User-agent': 'Mozilla/5.0'} + r = requests.get(httpbin('user-agent'), headers=heads) + self.assertEqual(curl_from_request(r.request), curl_str) + + + def test_curl_HTTP_OK_HEAD(self): + curl_str ='curl -L -I -H "Accept-Encoding:gzip" -H "User-Agent:python-requests.org" "http://httpbin.org//"' + r = requests.head(httpbin('/')) + self.assertEqual(curl_from_request(r.request), curl_str) + + + def test_curl_HTTP_OK_PATCH(self): + curl_str = 'curl -L -X PATCH -H "Accept-Encoding:gzip" -H "User-Agent:python-requests.org" "http://httpbin.org/patch"' + r = requests.patch(httpbin('patch')) + self.assertEqual(curl_from_request(r.request), curl_str) + + + def test_curl_AUTH_HTTPS_OK_GET(self): + curl_str = 'curl -L -u "user:pass" -X GET -H "Accept-Encoding:gzip" -H "User-Agent:python-requests.org" "https://httpbin.ep.io/basic-auth/user/pass"' + auth = ('user', 'pass') + r = requests.get(httpsbin('basic-auth', 'user', 'pass'), auth=auth) + self.assertEqual(curl_from_request(r.request), curl_str) + + + def test_curl_POSTBIN_GET_POST_FILES(self): + curl_str = 'curl -L -X POST -H "Accept-Encoding:gzip" -H "User-Agent:python-requests.org" -d "some=data" "http://httpbin.org/post"' + post = requests.post(httpbin('post'), data={'some': 'data'}) + self.assertEqual(curl_from_request(post.request), curl_str) + + curl_str = 'curl -L -X POST -H "Accept-Encoding:gzip" -H "User-Agent:python-requests.org" -F "some=@test_requests.py" "https://httpbin.ep.io/post"' + post2 = requests.post(httpsbin('post'), files={'some': open('test_requests.py')}) + self.assertEqual(curl_from_request(post2.request), curl_str) + + #TODO - This doesn't seem right with \ \ + #curl_str = 'curl -L -X POST -H "Accept-Encoding:gzip" -H "User-Agent:python-requests.org" -d \'[{"some": "json"}]\' "http://httpbin.org/post"' + #post3 = requests.post(httpbin('post'), data='[{"some": "json"}]') + #self.assertEqual(curl_from_request(post3.request), curl_str) + if __name__ == '__main__': unittest.main() From 2aa32c16dcb905e303b2bc19ea95d616fba28adf Mon Sep 17 00:00:00 2001 From: Mike Waldner Date: Sat, 3 Sep 2011 20:54:55 -0400 Subject: [PATCH 3/3] Updated unit tests #139 --- test_requests.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/test_requests.py b/test_requests.py index b3f590cd..a4484c41 100755 --- a/test_requests.py +++ b/test_requests.py @@ -513,10 +513,9 @@ class RequestsTestSuite(unittest.TestCase): post2 = requests.post(httpsbin('post'), files={'some': open('test_requests.py')}) self.assertEqual(curl_from_request(post2.request), curl_str) - #TODO - This doesn't seem right with \ \ - #curl_str = 'curl -L -X POST -H "Accept-Encoding:gzip" -H "User-Agent:python-requests.org" -d \'[{"some": "json"}]\' "http://httpbin.org/post"' - #post3 = requests.post(httpbin('post'), data='[{"some": "json"}]') - #self.assertEqual(curl_from_request(post3.request), curl_str) + curl_str = 'curl -L -X POST -H "Accept-Encoding:gzip" -H "User-Agent:python-requests.org" -d \'[{"some": "json"}]\' "http://httpbin.org/post"' + post3 = requests.post(httpbin('post'), data='[{"some": "json"}]') + self.assertEqual(curl_from_request(post3.request), curl_str) if __name__ == '__main__':