mirror of
https://github.com/kennethreitz/requests.git
synced 2026-06-05 22:50:18 +00:00
Much better exception handling
This commit is contained in:
+58
-57
@@ -66,9 +66,12 @@ class Request(object):
|
||||
|
||||
|
||||
def _checks(self):
|
||||
pass
|
||||
"""Deterministic checks for consistiency."""
|
||||
|
||||
|
||||
if not self.url:
|
||||
raise URLRequired
|
||||
|
||||
|
||||
def _get_opener(self):
|
||||
""" Creates appropriate opener object for urllib2.
|
||||
"""
|
||||
@@ -94,93 +97,91 @@ class Request(object):
|
||||
:param anyway: If True, request will be sent, even if it has already been sent.
|
||||
"""
|
||||
self._checks()
|
||||
|
||||
success = False
|
||||
|
||||
if self.method in ('GET', 'HEAD', 'DELETE'):
|
||||
if (not self.sent) or anyway:
|
||||
|
||||
# url encode GET params if it's a dict
|
||||
if isinstance(self.params, dict):
|
||||
params = urllib.urlencode(self.params)
|
||||
else:
|
||||
|
||||
params = self.params
|
||||
|
||||
req = _Request(("%s?%s" % (self.url, params)), method=self.method)
|
||||
|
||||
if self.headers:
|
||||
req.headers = self.headers
|
||||
|
||||
opener = self._get_opener()
|
||||
|
||||
try:
|
||||
# url encode GET params if it's a dict
|
||||
if isinstance(self.params, dict):
|
||||
params = urllib.urlencode(self.params)
|
||||
else:
|
||||
|
||||
params = self.params
|
||||
|
||||
req = _Request(("%s?%s" % (self.url, params)), method=self.method)
|
||||
|
||||
if self.headers:
|
||||
req.headers = self.headers
|
||||
|
||||
opener = self._get_opener()
|
||||
resp = opener(req)
|
||||
|
||||
self.response.status_code = resp.code
|
||||
self.response.headers = resp.info().dict
|
||||
if self.method.lower() == 'get':
|
||||
self.response.content = resp.read()
|
||||
|
||||
success = True
|
||||
except urllib2.HTTPError, why:
|
||||
self.response.status_code = why.code
|
||||
|
||||
except RequestException:
|
||||
raise RequestException
|
||||
|
||||
|
||||
elif self.method == 'PUT':
|
||||
if (not self.sent) or anyway:
|
||||
|
||||
req = _Request(self.url, method='PUT')
|
||||
|
||||
if self.headers:
|
||||
req.headers = self.headers
|
||||
|
||||
req.data = self.data
|
||||
|
||||
try:
|
||||
try:
|
||||
opener = self._get_opener()
|
||||
resp = opener(req)
|
||||
|
||||
req = _Request(self.url, method='PUT')
|
||||
self.response.status_code = resp.code
|
||||
self.response.headers = resp.info().dict
|
||||
self.response.content = resp.read()
|
||||
|
||||
success = True
|
||||
|
||||
except urllib2.HTTPError, why:
|
||||
self.response.status_code = why.code
|
||||
|
||||
if self.headers:
|
||||
req.headers = self.headers
|
||||
|
||||
req.data = self.data
|
||||
|
||||
opener = self._get_opener()
|
||||
resp = opener(req)
|
||||
|
||||
self.response.status_code = resp.code
|
||||
self.response.headers = resp.info().dict
|
||||
self.response.content = resp.read()
|
||||
|
||||
success = True
|
||||
except urllib2.HTTPError:
|
||||
self.resonse.status_code = 405
|
||||
|
||||
except Exception:
|
||||
# TODO: Fix this shit
|
||||
raise RequestException
|
||||
|
||||
|
||||
|
||||
elif self.method == 'POST':
|
||||
if (not self.sent) or anyway:
|
||||
|
||||
req = _Request(self.url, method='POST')
|
||||
|
||||
if self.headers:
|
||||
req.headers = self.headers
|
||||
|
||||
# url encode form data if it's a dict
|
||||
if isinstance(self.data, dict):
|
||||
req.data = urllib.urlencode(self.data)
|
||||
else:
|
||||
req.data = self.data
|
||||
|
||||
try:
|
||||
|
||||
req = _Request(self.url, method='POST')
|
||||
|
||||
if self.headers:
|
||||
req.headers = self.headers
|
||||
|
||||
# url encode form data if it's a dict
|
||||
if isinstance(self.data, dict):
|
||||
req.data = urllib.urlencode(self.data)
|
||||
else:
|
||||
req.data = self.data
|
||||
|
||||
|
||||
opener = self._get_opener()
|
||||
resp = opener(req)
|
||||
|
||||
self.response.status_code = resp.code
|
||||
self.response.headers = resp.info().dict
|
||||
self.response.content = resp.read()
|
||||
|
||||
|
||||
success = True
|
||||
|
||||
except Exception:
|
||||
raise RequestException
|
||||
except urllib2.HTTPError, why:
|
||||
self.response.status_code = why.code
|
||||
|
||||
|
||||
self.sent = True if success else False
|
||||
@@ -191,12 +192,12 @@ class Request(object):
|
||||
class Response(object):
|
||||
"""The :class:`Request` object. It's awesome.
|
||||
"""
|
||||
|
||||
|
||||
def __init__(self):
|
||||
self.content = None
|
||||
self.status_code = None
|
||||
self.headers = dict()
|
||||
|
||||
|
||||
|
||||
class AuthObject(object):
|
||||
"""The :class:`AuthObject` is a simple HTTP Authentication token.
|
||||
|
||||
Reference in New Issue
Block a user