use config throughout models
authorKenneth Reitz <me@kennethreitz.com>
Sun, 23 Oct 2011 00:28:06 +0000 (20:28 -0400)
committerKenneth Reitz <me@kennethreitz.com>
Sun, 23 Oct 2011 00:28:06 +0000 (20:28 -0400)
requests/models.py

index d58e4ad..ac235a7 100644 (file)
@@ -9,22 +9,22 @@ requests.models
 import urllib
 import urllib2
 import socket
-import codecs
 import zlib
 
-
 from urllib2 import HTTPError
 from urlparse import urlparse, urlunparse, urljoin
 from datetime import datetime
 
-from .config import settings
-from .monkeys import Request as _Request, HTTPBasicAuthHandler, HTTPForcedBasicAuthHandler, HTTPDigestAuthHandler, HTTPRedirectHandler
 from .structures import CaseInsensitiveDict
 from .packages.poster.encode import multipart_encode
 from .packages.poster.streaminghttp import register_openers, get_handlers
-from .utils import dict_from_cookiejar, get_unicode_from_response, stream_decode_response_unicode, decode_gzip, stream_decode_gzip
+from .utils import (dict_from_cookiejar, get_unicode_from_response, stream_decode_response_unicode, decode_gzip, stream_decode_gzip)
 from .status_codes import codes
 from .exceptions import Timeout, URLRequired, TooManyRedirects
+from .monkeys import Request as _Request
+from .monkeys import (
+    HTTPBasicAuthHandler, HTTPForcedBasicAuthHandler,
+    HTTPDigestAuthHandler, HTTPRedirectHandler)
 
 
 REDIRECT_STATI = (codes.moved, codes.found, codes.other, codes.temporary_moved)
@@ -37,9 +37,20 @@ class Request(object):
     """
 
     def __init__(self,
-        url=None, headers=dict(), files=None, method=None, data=dict(),
-        params=dict(), auth=None, cookies=None, timeout=None, redirect=False,
-        allow_redirects=False, proxies=None, hooks=None):
+        url=None,
+        headers=dict(),
+        files=None,
+        method=None,
+        data=dict(),
+        params=dict(),
+        auth=None,
+        cookies=None,
+        timeout=None,
+        redirect=False,
+        allow_redirects=False,
+        proxies=None,
+        hooks=None,
+        config=None):
 
         #: Float describes the timeout of the request.
         #  (Use socket.setdefaulttimeout() as fallback)
@@ -93,6 +104,9 @@ class Request(object):
         #: CookieJar to attach to :class:`Request <Request>`.
         self.cookies = cookies
 
+        #: Dictionary of configurations for this request.
+        self.config = config
+
         #: True if Request has been sent.
         self.sent = False
 
@@ -100,16 +114,15 @@ class Request(object):
         self.hooks = hooks
 
         # Header manipulation and defaults.
-
-        if settings.accept_gzip:
-            settings.base_headers.update({'Accept-Encoding': 'gzip'})
+        if self.config.get('accept_gzip'):
+            self.headers.update({'Accept-Encoding': 'gzip'})
 
         if headers:
             headers = CaseInsensitiveDict(self.headers)
         else:
             headers = CaseInsensitiveDict()
 
-        for (k, v) in settings.base_headers.items():
+        for (k, v) in self.config.get('base_headers', {}).items():
             if k not in headers:
                 headers[k] = v
 
@@ -185,6 +198,7 @@ class Request(object):
         def build(resp):
 
             response = Response()
+            response.config = self.config
             response.status_code = getattr(resp, 'code', None)
 
             try:
@@ -219,7 +233,7 @@ class Request(object):
 
                 r.raw.close()
 
-                if not len(history) < settings.max_redirects:
+                if not len(history) < self.config.get('max_redirects'):
                     raise TooManyRedirects()
 
                 history.append(r)
@@ -243,9 +257,16 @@ class Request(object):
                     method = self.method
 
                 request = Request(
-                    url, self.headers, self.files, method,
-                    self.data, self.params, self.auth, self.cookies,
-                    redirect=True
+                    url=url,
+                    headers=self.headers,
+                    files=self.files,
+                    method=method,
+                    # data=self.data,
+                    # params=self.params,
+                    auth=self.auth,
+                    cookies=self.cookies,
+                    redirect=True,
+                    config=self.config
                 )
                 request.send()
                 r = request.response
@@ -313,8 +334,8 @@ class Request(object):
         self._checks()
 
         # Logging
-        if settings.verbose:
-            settings.verbose.write('%s   %s   %s\n' % (
+        if self.config.get('verbose'):
+            self.config.get('verbose').write('%s   %s   %s\n' % (
                 datetime.now().isoformat(), self.method, self.url
             ))
 
@@ -353,14 +374,14 @@ class Request(object):
                     if not 'timeout' in str(err):
                         raise
 
-                    if settings.timeout_fallback:
+                    if self.config.get('timeout_fallback'):
                         # fall-back and use global socket timeout (This is not thread-safe!)
                         old_timeout = socket.getdefaulttimeout()
                         socket.setdefaulttimeout(self.timeout)
 
                     resp = opener(req)
 
-                    if settings.timeout_fallback:
+                    if self.config.get('timeout_fallback'):
                         # restore global timeout
                         socket.setdefaulttimeout(old_timeout)
 
@@ -429,6 +450,9 @@ class Response(object):
         #: A dictionary of Cookies the server sent back.
         self.cookies = None
 
+        #: Dictionary of configurations for this request.
+        self.config = None
+
 
     def __repr__(self):
         return '<Response [%s]>' % (self.status_code)
@@ -460,7 +484,7 @@ class Response(object):
         if 'gzip' in self.headers.get('content-encoding', ''):
             gen = stream_decode_gzip(gen)
         if decode_unicode is None:
-            decode_unicode = settings.decode_unicode
+            decode_unicode = self.config.get('decode_unicode')
         if decode_unicode:
             gen = stream_decode_response_unicode(gen, self)
         return gen
@@ -489,7 +513,7 @@ class Response(object):
                 pass
 
         # Decode unicode content.
-        if settings.decode_unicode:
+        if self.config.get('decode_unicode'):
             self._content = get_unicode_from_response(self)
 
         self._content_consumed = True