Navigation Menu

Skip to content

Commit

Permalink
Merge branch 'release/0.2.2'
Browse files Browse the repository at this point in the history
  • Loading branch information
Kenneth Reitz committed Feb 14, 2011
2 parents e09efc4 + d511e6f commit ed909ea
Show file tree
Hide file tree
Showing 5 changed files with 106 additions and 45 deletions.
13 changes: 13 additions & 0 deletions AUTHORS
@@ -0,0 +1,13 @@
Requests is written and maintained by Kenneth Reitz and
various contributors:

Development Lead
````````````````

- Kenneth Reitz <me@kennethreitz.com>


Patches and Suggestions
```````````````````````

- Various Pocoo Members
8 changes: 8 additions & 0 deletions HISTORY.rst
@@ -1,6 +1,14 @@
History
-------

0.2.2 (2011-02-14)
++++++++++++++++++

* Still handles request in the event of an HTTPError. (Issue #2)
* Eventlet and Gevent Monkeypatch support.
* Cookie Support (Issue #1)


0.2.1 (2011-02-14)
++++++++++++++++++

Expand Down
17 changes: 10 additions & 7 deletions README.rst
Expand Up @@ -14,6 +14,8 @@ Features
+ Simple HTTP Header Request Attachment
+ Simple Data/Params Request Attachment
+ Simple Multipart File Uploads
+ CookieJar Support

- Simple Basic HTTP Authentication
+ Simple URL + HTTP Auth Registry

Expand Down Expand Up @@ -56,27 +58,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)
<request object>

HEAD Requests
>>> request.head(url, params={}, headers={} auth=None)
>>> request.head(url, params={}, headers={}, cookies=None, auth=None)
<request object>

PUT Requests
>>> request.put(url, data='', headers={}, files={}, auth=None)
>>> request.put(url, data='', headers={}, files={}, cookies=None, auth=None)
<request object>
# 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)
<request object>
# 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)
<request object>


Expand Down
111 changes: 74 additions & 37 deletions requests/core.py
Expand Up @@ -13,13 +13,28 @@
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


from .packages.poster.encode import multipart_encode
from .packages.poster.streaminghttp import register_openers


__title__ = 'requests'
__version__ = '0.2.1'
__build__ = 0x000201
__version__ = '0.2.2'
__build__ = 0x000202
__author__ = 'Kenneth Reitz'
__license__ = 'ISC'
__copyright__ = 'Copyright 2011 Kenneth Reitz'
Expand Down Expand Up @@ -59,7 +74,9 @@ def __init__(self):
self.params = {}
self.data = {}
self.response = Response()

self.auth = None
self.cookiejar = None
self.sent = False


Expand All @@ -76,32 +93,51 @@ def __setattr__(self, name, value):


def _checks(self):
"""Deterministic checks for consistiency."""
"""Deterministic checks for consistency."""

if not self.url:
raise URLRequired


def _get_opener(self):
"""Creates appropriate opener object for urllib2."""

if self.auth:

# create a password manager
authr = urllib2.HTTPPasswordMgrWithDefaultRealm()
_handlers = []

if self.auth or self.cookiejar:

if self.auth:

authr = urllib2.HTTPPasswordMgrWithDefaultRealm()

authr.add_password(None, self.url, self.auth.username, self.auth.password)
auth_handler = urllib2.HTTPBasicAuthHandler(authr)

_handlers.append(auth_handler)

authr.add_password(None, self.url, self.auth.username, self.auth.password)
handler = urllib2.HTTPBasicAuthHandler(authr)
opener = urllib2.build_opener(handler)
if self.cookiejar:

# use the opener to fetch a URL
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):
"""Build internal Response object from given response."""

self.response.status_code = resp.code
self.response.headers = resp.info().dict
self.response.content = resp.read()
self.response.url = resp.url


def send(self, anyway=False):
"""Sends the request. Returns True of successfull, false if not.
"""Sends the request. Returns True of successful, false if not.
If there was an HTTPError during transmission,
self.response.status_code will contain the HTTPError code.
Expand Down Expand Up @@ -135,15 +171,12 @@ def send(self, anyway=False):

try:
resp = opener(req)
self.response.status_code = resp.code
self.response.headers = resp.info().dict
if self.method == 'GET':
self.response.content = resp.read()
self.response.url = resp.url

self._build_response(resp)
success = True

except urllib2.HTTPError as why:
self.response.status_code = why.code
self._build_response(why)
success = False


elif self.method == 'PUT':
Expand All @@ -170,15 +203,12 @@ def send(self, anyway=False):
opener = self._get_opener()
resp = opener(req)

self.response.status_code = resp.code
self.response.headers = resp.info().dict
self.response.content = resp.read()
self.response.url = resp.url

self._build_response(resp)
success = True

except urllib2.HTTPError as why:
self.response.status_code = why.code
self._build_response(why)
success = False


elif self.method == 'POST':
Expand Down Expand Up @@ -207,15 +237,12 @@ def send(self, anyway=False):
opener = self._get_opener()
resp = opener(req)

self.response.status_code = resp.code
self.response.headers = resp.info().dict
self.response.content = resp.read()
self.response.url = resp.url

self._build_response(resp)
success = True

except urllib2.HTTPError as why:
self.response.status_code = why.code
self._build_response(why)
success = False


self.sent = True if success else False
Expand Down Expand Up @@ -256,12 +283,13 @@ def __init__(self, username, password):



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.
: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.
"""

Expand All @@ -271,19 +299,21 @@ 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()

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.
: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.
"""

Expand All @@ -294,20 +324,22 @@ 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()

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.
: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.
"""

Expand All @@ -321,20 +353,22 @@ 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()

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.
: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.
"""

Expand All @@ -345,19 +379,21 @@ 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()

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.
: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.
"""

Expand All @@ -367,6 +403,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()
Expand Down
2 changes: 1 addition & 1 deletion setup.py
Expand Up @@ -22,7 +22,7 @@

setup(
name='requests',
version='0.2.1',
version='0.2.2',
description='Awesome Python HTTP Library that\'s actually usable.',
long_description=open('README.rst').read() + '\n\n' +
open('HISTORY.rst').read(),
Expand Down

0 comments on commit ed909ea

Please sign in to comment.