Much better exception handling
authorKenneth Reitz <me@kennethreitz.com>
Mon, 14 Feb 2011 03:50:45 +0000 (22:50 -0500)
committerKenneth Reitz <me@kennethreitz.com>
Mon, 14 Feb 2011 03:50:45 +0000 (22:50 -0500)
requests/core.py

index f33003f54f437cbcbc57dceaa33cfe0ee18a9b2f..0fa5fd1decd9d5629af5c888910cf185b1dde012 100644 (file)
@@ -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,81 +97,79 @@ 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:
-                               try:
-                                       # url encode GET params if it's a dict
-                                       if isinstance(self.params, dict):
-                                               params = urllib.urlencode(self.params)
-                                       else:
 
-                                               params = self.params
+                               # url encode GET params if it's a dict
+                               if isinstance(self.params, dict):
+                                       params = urllib.urlencode(self.params)
+                               else:
 
-                                       req = _Request(("%s?%s" % (self.url, params)), method=self.method)
+                                       params = self.params
 
-                                       if self.headers:
-                                               req.headers = self.headers
+                               req = _Request(("%s?%s" % (self.url, params)), method=self.method)
 
-                                       opener = self._get_opener()
-                                       resp = opener(req)
+                               if self.headers:
+                                       req.headers = self.headers
 
+                               opener = self._get_opener()
+
+                               try:
+                                       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:
 
-                               try:
-                                       try:
+                               req = _Request(self.url, method='PUT')
 
-                                               req = _Request(self.url, method='PUT')
+                               if self.headers:
+                                       req.headers = self.headers
 
-                                               if self.headers:
-                                                       req.headers = self.headers
+                               req.data = self.data
+
+                               try:
+                                       opener = self._get_opener()
+                                       resp =  opener(req)
 
-                                               req.data = self.data
+                                       self.response.status_code = resp.code
+                                       self.response.headers = resp.info().dict
+                                       self.response.content = resp.read()
 
-                                               opener = self._get_opener()
-                                               resp =  opener(req)
+                                       success = True
 
-                                               self.response.status_code = resp.code
-                                               self.response.headers = resp.info().dict
-                                               self.response.content = resp.read()
+                               except urllib2.HTTPError, why:
+                                       self.response.status_code = why.code
 
-                                               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:
-                               try:
 
-                                       req = _Request(self.url, method='POST')
+                               req = _Request(self.url, method='POST')
 
-                                       if self.headers:
-                                               req.headers = self.headers
+                               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
+                               # 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:
 
                                        opener = self._get_opener()
                                        resp =  opener(req)
@@ -176,11 +177,11 @@ class Request(object):
                                        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.