From f70e89a163208076f12577cd98ce09650b9d1241 Mon Sep 17 00:00:00 2001 From: Kenneth Reitz Date: Mon, 14 Feb 2011 11:45:50 -0500 Subject: [PATCH 01/13] eventlet support. --- requests/core.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/requests/core.py b/requests/core.py index e46718dd..70e44d90 100644 --- a/requests/core.py +++ b/requests/core.py @@ -11,7 +11,10 @@ """ import urllib -import urllib2 +try: + from eventlet.green import urllib2 +except ImportError: + import urllib2 from .packages.poster.encode import multipart_encode from .packages.poster.streaminghttp import register_openers From d87bcce6ad9d28bf6fe642543238af61d1ddf132 Mon Sep 17 00:00:00 2001 From: Kenneth Reitz Date: Mon, 14 Feb 2011 11:46:04 -0500 Subject: [PATCH 02/13] Added release 0.2.2 info. --- HISTORY.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/HISTORY.rst b/HISTORY.rst index 41118bbe..d3e62326 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -1,6 +1,12 @@ History ------- +0.2.2 (2011-02-14) +++++++++++++++++++ +* Still handles request in the event of an HTTPError. (Issue #2) +* Cookie Support? (Issue #1) + + 0.2.1 (2011-02-14) ++++++++++++++++++ From bfe91296cbf990ce579639777412f5395e951247 Mon Sep 17 00:00:00 2001 From: Kenneth Reitz Date: Mon, 14 Feb 2011 11:57:12 -0500 Subject: [PATCH 03/13] monkey patchin' (will this suffice?) --- requests/core.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/requests/core.py b/requests/core.py index 70e44d90..c807e9a9 100644 --- a/requests/core.py +++ b/requests/core.py @@ -11,10 +11,20 @@ """ import urllib +import urllib2 + try: - from eventlet.green import urllib2 + from gevent import monkey + monkey.patch_all() except ImportError: - import urllib2 + pass + +try: + import eventlet + eventlet.monkey_patch() +except ImportError: + pass + from .packages.poster.encode import multipart_encode from .packages.poster.streaminghttp import register_openers From cde3b88f3e93a9503810acc0ded890025fcbc119 Mon Sep 17 00:00:00 2001 From: Kenneth Reitz Date: Mon, 14 Feb 2011 12:07:34 -0500 Subject: [PATCH 04/13] eventlet > gevent (i think) --- requests/core.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/requests/core.py b/requests/core.py index c807e9a9..f434d59a 100644 --- a/requests/core.py +++ b/requests/core.py @@ -13,18 +13,19 @@ import urllib import urllib2 -try: - from gevent import monkey - monkey.patch_all() -except ImportError: - pass - try: import eventlet eventlet.monkey_patch() except ImportError: pass +if not 'eventlet' in locals(): + try: + from gevent import monkey + monkey.patch_all() + except ImportError: + pass + from .packages.poster.encode import multipart_encode from .packages.poster.streaminghttp import register_openers From 2203c3bccd5e4888a16d73247d540fd6e359d29c Mon Sep 17 00:00:00 2001 From: Kenneth Reitz Date: Mon, 14 Feb 2011 12:23:55 -0500 Subject: [PATCH 05/13] Added CookieJar --- requests/core.py | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/requests/core.py b/requests/core.py index f434d59a..bd1472a7 100644 --- a/requests/core.py +++ b/requests/core.py @@ -73,7 +73,9 @@ class Request(object): self.params = {} self.data = {} self.response = Response() + self.auth = None + self.cookiejar = None self.sent = False @@ -98,20 +100,31 @@ class Request(object): def _get_opener(self): """Creates appropriate opener object for urllib2.""" - + + _handlers = [] + if self.auth: # create a password manager authr = urllib2.HTTPPasswordMgrWithDefaultRealm() authr.add_password(None, self.url, self.auth.username, self.auth.password) - handler = urllib2.HTTPBasicAuthHandler(authr) - opener = urllib2.build_opener(handler) + auth_handler = urllib2.HTTPBasicAuthHandler(authr) + + _handlers.append(auth_handler) # use the opener to fetch a URL - return opener.open - else: - return urllib2.urlopen +# return opener.open + if self.cookiejar: + + cookie_handler = urllib2.HTTPCookieProcessor(cookiejar) + _handlers.append(cookie_handler) + + opener = urllib2.build_opener(*_handlers) + + return opener.open +# else: +# return urllib2.urlopen def _build_response(self, resp): From c9b8750597ded352b367e9d308387b007c92ea50 Mon Sep 17 00:00:00 2001 From: Kenneth Reitz Date: Mon, 14 Feb 2011 12:24:03 -0500 Subject: [PATCH 06/13] Upated history --- HISTORY.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/HISTORY.rst b/HISTORY.rst index d3e62326..6f15dc91 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -4,7 +4,9 @@ History 0.2.2 (2011-02-14) ++++++++++++++++++ * Still handles request in the event of an HTTPError. (Issue #2) -* Cookie Support? (Issue #1) +* Eventlet and Gevent Monkeypatch support. +* Cookie Support (Issue #1) + 0.2.1 (2011-02-14) From 4452934929b3addd7c8188d4ea8132b41157daef Mon Sep 17 00:00:00 2001 From: Kenneth Reitz Date: Mon, 14 Feb 2011 12:25:44 -0500 Subject: [PATCH 07/13] cleanups --- requests/core.py | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/requests/core.py b/requests/core.py index bd1472a7..e5e55372 100644 --- a/requests/core.py +++ b/requests/core.py @@ -104,8 +104,7 @@ class Request(object): _handlers = [] if self.auth: - - # create a password manager + authr = urllib2.HTTPPasswordMgrWithDefaultRealm() authr.add_password(None, self.url, self.auth.username, self.auth.password) @@ -113,18 +112,14 @@ class Request(object): _handlers.append(auth_handler) - # use the opener to fetch a URL -# return opener.open if self.cookiejar: cookie_handler = urllib2.HTTPCookieProcessor(cookiejar) _handlers.append(cookie_handler) + opener = urllib2.build_opener(*_handlers) - return opener.open -# else: -# return urllib2.urlopen def _build_response(self, resp): From b09218d5aceff0062e59bb2d93150e0b48b1dcc2 Mon Sep 17 00:00:00 2001 From: Kenneth Reitz Date: Mon, 14 Feb 2011 12:33:12 -0500 Subject: [PATCH 08/13] temporary --- requests/core.py | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/requests/core.py b/requests/core.py index e5e55372..d04ef720 100644 --- a/requests/core.py +++ b/requests/core.py @@ -12,20 +12,20 @@ import urllib import urllib2 - -try: - import eventlet - eventlet.monkey_patch() -except ImportError: - pass - -if not 'eventlet' in locals(): - try: - from gevent import monkey - monkey.patch_all() - except ImportError: - pass - +# +#try: +# import eventlet +## eventlet.monkey_patch() +#except ImportError: +# pass +# +#if not 'eventlet' in locals(): +# try: +# from gevent import monkey +# monkey.patch_all() +# except ImportError: +# pass +# from .packages.poster.encode import multipart_encode from .packages.poster.streaminghttp import register_openers From 16e5119b2ad8be05673b5f8762cd71edaa0cd882 Mon Sep 17 00:00:00 2001 From: Kenneth Reitz Date: Mon, 14 Feb 2011 12:39:13 -0500 Subject: [PATCH 09/13] fixed gevent problem --- requests/core.py | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/requests/core.py b/requests/core.py index d04ef720..5f61416a 100644 --- a/requests/core.py +++ b/requests/core.py @@ -103,23 +103,27 @@ class Request(object): _handlers = [] - if self.auth: - - authr = urllib2.HTTPPasswordMgrWithDefaultRealm() + if self.auth or self.cookiejar: - authr.add_password(None, self.url, self.auth.username, self.auth.password) - auth_handler = urllib2.HTTPBasicAuthHandler(authr) + if self.auth: - _handlers.append(auth_handler) + authr = urllib2.HTTPPasswordMgrWithDefaultRealm() - if self.cookiejar: - - cookie_handler = urllib2.HTTPCookieProcessor(cookiejar) - _handlers.append(cookie_handler) + authr.add_password(None, self.url, self.auth.username, self.auth.password) + auth_handler = urllib2.HTTPBasicAuthHandler(authr) - - opener = urllib2.build_opener(*_handlers) - return opener.open + _handlers.append(auth_handler) + + if self.cookiejar: + + cookie_handler = urllib2.HTTPCookieProcessor(cookiejar) + _handlers.append(cookie_handler) + + opener = urllib2.build_opener(*_handlers) + return opener.open + + else: + return urllib2.urlopen def _build_response(self, resp): From 5fe24abfb99fd9850352329de9c4c091a8a71a05 Mon Sep 17 00:00:00 2001 From: Kenneth Reitz Date: Mon, 14 Feb 2011 12:40:41 -0500 Subject: [PATCH 10/13] Gevent / Eventlet is back! --- requests/core.py | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/requests/core.py b/requests/core.py index 5f61416a..b578b245 100644 --- a/requests/core.py +++ b/requests/core.py @@ -12,20 +12,21 @@ import urllib import urllib2 -# -#try: -# import eventlet -## eventlet.monkey_patch() -#except ImportError: -# pass -# -#if not 'eventlet' in locals(): -# try: -# from gevent import monkey -# monkey.patch_all() -# except ImportError: -# pass -# + + +try: + import eventlet + eventlet.monkey_patch() +except ImportError: + pass + +if not 'eventlet' in locals(): + try: + from gevent import monkey + monkey.patch_all() + except ImportError: + pass + from .packages.poster.encode import multipart_encode from .packages.poster.streaminghttp import register_openers From f023c81dad05fd8c5e9c1979b26c3c9ecfc4cf3b Mon Sep 17 00:00:00 2001 From: Kenneth Reitz Date: Mon, 14 Feb 2011 12:43:13 -0500 Subject: [PATCH 11/13] cookies system in place. --- requests/core.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/requests/core.py b/requests/core.py index b578b245..c2f0a770 100644 --- a/requests/core.py +++ b/requests/core.py @@ -282,7 +282,7 @@ class AuthObject(object): -def get(url, params={}, headers={}, auth=None): +def get(url, params={}, headers={}, cookies=None, auth=None): """Sends a GET request. Returns :class:`Response` object. :param url: URL for the new :class:`Request` object. @@ -297,6 +297,7 @@ def get(url, params={}, headers={}, auth=None): r.url = url r.params = params r.headers = headers + r.cookiejar = cookies r.auth = _detect_auth(url, auth) r.send() @@ -304,7 +305,7 @@ def get(url, params={}, headers={}, auth=None): return r.response -def head(url, params={}, headers={}, auth=None): +def head(url, params={}, headers={}, cookies=None, auth=None): """Sends a HEAD request. Returns :class:`Response` object. :param url: URL for the new :class:`Request` object. @@ -320,6 +321,7 @@ def head(url, params={}, headers={}, auth=None): # return response object r.params = params r.headers = headers + r.cookiejar = cookies r.auth = _detect_auth(url, auth) r.send() @@ -327,7 +329,7 @@ def head(url, params={}, headers={}, auth=None): return r.response -def post(url, data={}, headers={}, files=None, auth=None): +def post(url, data={}, headers={}, files=None, cookies=None, auth=None): """Sends a POST request. Returns :class:`Response` object. :param url: URL for the new :class:`Request` object. @@ -347,6 +349,7 @@ def post(url, data={}, headers={}, files=None, auth=None): r.files = files r.headers = headers + r.cookiejar = cookies r.auth = _detect_auth(url, auth) r.send() @@ -354,7 +357,7 @@ def post(url, data={}, headers={}, files=None, auth=None): return r.response -def put(url, data='', headers={}, files={}, auth=None): +def put(url, data='', headers={}, files={}, cookies=None, auth=None): """Sends a PUT request. Returns :class:`Response` object. :param url: URL for the new :class:`Request` object. @@ -371,6 +374,7 @@ def put(url, data='', headers={}, files={}, auth=None): r.data = data r.files = files r.headers = headers + r.cookiejar = cookies r.auth = _detect_auth(url, auth) r.send() @@ -378,7 +382,7 @@ def put(url, data='', headers={}, files={}, auth=None): return r.response -def delete(url, params={}, headers={}, auth=None): +def delete(url, params={}, headers={}, cookies=None, auth=None): """Sends a DELETE request. Returns :class:`Response` object. :param url: URL for the new :class:`Request` object. @@ -393,6 +397,7 @@ def delete(url, params={}, headers={}, auth=None): r.method = 'DELETE' r.headers = headers + r.cookiejar = cookies r.auth = _detect_auth(url, auth) r.send() From 397bd4b67688fe8b35b5c17a6f1d6f43ab076c18 Mon Sep 17 00:00:00 2001 From: Kenneth Reitz Date: Mon, 14 Feb 2011 12:45:03 -0500 Subject: [PATCH 12/13] spelling error --- requests/core.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/requests/core.py b/requests/core.py index c2f0a770..e9350327 100644 --- a/requests/core.py +++ b/requests/core.py @@ -93,7 +93,7 @@ class Request(object): def _checks(self): - """Deterministic checks for consistiency.""" + """Deterministic checks for consistency.""" if not self.url: raise URLRequired @@ -135,6 +135,7 @@ class Request(object): self.response.content = resp.read() self.response.url = resp.url + def send(self, anyway=False): """Sends the request. Returns True of successful, false if not. If there was an HTTPError during transmission, From 98c8a78c3e0f3827ef4ba304de9fa74666f0be0e Mon Sep 17 00:00:00 2001 From: Kenneth Reitz Date: Mon, 14 Feb 2011 12:52:15 -0500 Subject: [PATCH 13/13] Added Cookies documentation. --- README.rst | 15 ++++++++------- requests/core.py | 7 ++++++- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/README.rst b/README.rst index b18557df..9b987ef8 100644 --- a/README.rst +++ b/README.rst @@ -56,27 +56,28 @@ API **Requests:** All request functions return a Response object (see below). + +If a {filename: fileobject} dictionary is passed in (files=...), a multipart_encode upload will be performed. +If CookieJar object is is passed in (cookies=...), the cookies will be sent with the request. GET Requests - >>> request.get(url, params={}, headers={} auth=None) + >>> request.get(url, params={}, headers={}, cookies=None, auth=None) HEAD Requests - >>> request.head(url, params={}, headers={} auth=None) + >>> request.head(url, params={}, headers={}, cookies=None, auth=None) PUT Requests - >>> request.put(url, data='', headers={}, files={}, auth=None) + >>> request.put(url, data='', headers={}, files={}, cookies=None, auth=None) - # If files dictionary ( {filename: fileobject, ...} ) is given, a multi-part upload is performed. POST Requests - >>> request.post(url, data={}, headers={}, files={}, auth=None) + >>> request.post(url, data={}, headers={}, files={}, cookies=None, auth=None) - # If files dictionary ( {filename: fileobject, ...} ) is given, a multi-part upload is performed. DELETE Requests - >>> request.delete(url, params={}, headers={}, auth=None) + >>> request.delete(url, params={}, headers={}, cookies=None, auth=None) diff --git a/requests/core.py b/requests/core.py index e9350327..28d05053 100644 --- a/requests/core.py +++ b/requests/core.py @@ -288,7 +288,8 @@ def get(url, params={}, headers={}, cookies=None, auth=None): :param url: URL for the new :class:`Request` object. :param params: (optional) Dictionary of GET Parameters to send with the :class:`Request`. - :param headers: (optional) Dictionary of HTTP Headers to sent with the :class:`Request`. + :param headers: (optional) Dictionary of HTTP Headers to send with the :class:`Request`. + :param cookies: (optional) CookieJar object to send with the :class:`Request`. :param auth: (optional) AuthObject to enable Basic HTTP Auth. """ @@ -312,6 +313,7 @@ def head(url, params={}, headers={}, cookies=None, auth=None): :param url: URL for the new :class:`Request` object. :param params: (optional) Dictionary of GET Parameters to send with the :class:`Request`. :param headers: (optional) Dictionary of HTTP Headers to sent with the :class:`Request`. + :param cookies: (optional) CookieJar object to send with the :class:`Request`. :param auth: (optional) AuthObject to enable Basic HTTP Auth. """ @@ -337,6 +339,7 @@ def post(url, data={}, headers={}, files=None, cookies=None, auth=None): :param data: (optional) Dictionary of POST Data to send with the :class:`Request`. :param headers: (optional) Dictionary of HTTP Headers to sent with the :class:`Request`. :param files: (optional) Dictionary of 'filename': file-like-objects for multipart encoding upload. + :param cookies: (optional) CookieJar object to send with the :class:`Request`. :param auth: (optional) AuthObject to enable Basic HTTP Auth. """ @@ -365,6 +368,7 @@ def put(url, data='', headers={}, files={}, cookies=None, auth=None): :param data: (optional) Bytes of PUT Data to send with the :class:`Request`. :param headers: (optional) Dictionary of HTTP Headers to sent with the :class:`Request`. :param files: (optional) Dictionary of 'filename': file-like-objects for multipart encoding upload. + :param cookies: (optional) CookieJar object to send with the :class:`Request`. :param auth: (optional) AuthObject to enable Basic HTTP Auth. """ @@ -389,6 +393,7 @@ def delete(url, params={}, headers={}, cookies=None, auth=None): :param url: URL for the new :class:`Request` object. :param params: (optional) Dictionary of GET Parameters to send with the :class:`Request`. :param headers: (optional) Dictionary of HTTP Headers to sent with the :class:`Request`. + :param cookies: (optional) CookieJar object to send with the :class:`Request`. :param auth: (optional) AuthObject to enable Basic HTTP Auth. """