perfection.
authorKenneth Reitz <me@kennethreitz.com>
Mon, 26 Sep 2011 04:01:53 +0000 (00:01 -0400)
committerKenneth Reitz <me@kennethreitz.com>
Mon, 26 Sep 2011 04:01:53 +0000 (00:01 -0400)
requests/api.py
requests/core.py
requests/models.py
requests/sessions.py

index 5debae1f0114bd7c2ac6c5f50c4c16618051edbf..653f82d36493cec78bf5e36a540be29a078f6a9f 100644 (file)
@@ -68,6 +68,7 @@ def request(method, url,
         timeout=timeout or config.get('timeout'),
         allow_redirects=allow_redirects,
         proxies=proxies or config.get('proxies'),
+        _pools=_pools
     )
 
     # Arguments manipulation hook.
@@ -80,7 +81,7 @@ def request(method, url,
     r = dispatch_hook('pre_request', hooks, r)
 
     # Send the HTTP Request.
-    r.send(pools=_pools)
+    r.send()
 
     # Post-request hook.
     r = dispatch_hook('post_request', hooks, r)
index 0278f337399c8918ef75583a033b9e7f1652b9c7..e111c69990412c769afc23b48607f2e5cdce66c8 100644 (file)
@@ -18,6 +18,8 @@ __author__ = 'Kenneth Reitz'
 __license__ = 'ISC'
 __copyright__ = 'Copyright 2011 Kenneth Reitz'
 
+import logging
+logging.basicConfig()
 
 from api import *
 from exceptions import *
index adca38fab4b65dee53436f2ddf42777a0307d6b9..adf292750057607d4af20bc68d43a00a488d9e1b 100644 (file)
@@ -20,6 +20,7 @@ from .structures import CaseInsensitiveDict
 from .utils import *
 from .status_codes import codes
 from .exceptions import RequestException, Timeout, URLRequired, TooManyRedirects
+from .packages.urllib3.poolmanager import PoolManager
 
 
 REDIRECT_STATI = (codes.moved, codes.found, codes.other, codes.temporary_moved)
@@ -33,7 +34,7 @@ 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, config=None):
+        allow_redirects=False, proxies=None, config=None, _pools=None):
 
         #: Float describ the timeout of the request.
         #  (Use socket.setdefaulttimeout() as fallback)
@@ -43,10 +44,10 @@ class Request(object):
         self.url = url
 
         #: Dictonary of HTTP Headers to attach to the :class:`Request <Request>`.
-        self.headers = headers
+        self.headers = headers or {}
 
         #: Dictionary of files to multipart upload (``{filename: content}``).
-        self.files = files
+        self.files = files or {}
 
         #: HTTP Method to use.
         self.method = method
@@ -105,6 +106,8 @@ class Request(object):
 
         self.headers = headers
 
+        self._pools = _pools
+
     def __repr__(self):
         return '<Request [%s]>' % (self.method)
 
@@ -164,15 +167,11 @@ class Request(object):
                 (self.allow_redirects))
             ):
 
-                # print r.headers['location']
-                # print dir(r.raw._original_response.fp)
-                # print '--'
-
                 # We already redirected. Don't keep it alive.
                 # r.raw.close()
 
                 # Woah, this is getting crazy.
-                if len(history) >= settings.max_redirects:
+                if len(history) >= self.config.get('max_redirects'):
                     raise TooManyRedirects()
 
                 # Add the old request to the history collector.
@@ -212,6 +211,8 @@ class Request(object):
                     params=None,
                     auth=self.auth,
                     cookies=self.cookies,
+                    _pools=self._pools,
+                    config=self.config,
 
                     # Flag as part of a redirect loop.
                     redirect=True
@@ -232,7 +233,7 @@ class Request(object):
 
 
 
-    def send(self, pools=None, anyway=False):
+    def send(self, anyway=False):
         """Sends the shit."""
 
         # Safety check.
@@ -258,13 +259,25 @@ class Request(object):
 
             try:
                 # Create a new HTTP connection, since one wasn't passed in.
-                if not pools:
-                    connection = urllib3.connection_from_url(url, timeout=self.timeout)
+                if not self._pools:
+                    # Create a pool manager for this one connection.
+                    pools = PoolManager(
+                        num_pools=self.config.get('max_connections'),
+                        maxsize=1
+                    )
+
+                    # Create a connection.
+                    connection = pools.connection_from_url(url, timeout=self.timeout)
 
                     # One-off request. Delay fetching the content until needed.
                     do_block = False
                 else:
-                    connection = pools.connection_from_url(url)
+                    # Create a connection.
+                    connection = self._pools.connection_from_url(url)
+
+                    # Syntax sugar.
+                    pools = self._pools
+
                     # Part of a connection pool, so no fancy stuff. Sorry!
                     do_block = True
 
@@ -276,12 +289,14 @@ class Request(object):
                     headers=self.headers,
                     redirect=False,
                     assert_same_host=False,
-                    # preload_content=True
-                    # preload_content=False
                     preload_content=do_block,
                     decode_content=False
                 )
 
+                # Set the pools manager for redirections, if allowed.
+                if self.config.get('keepalive') and pools:
+                    self._pools = pools
+
                 # Extract cookies.
                 # if self.cookiejar is not None:
                     # self.cookiejar.extract_cookies(resp, req)
index 993d8bbedcf34f08ef4153295c31797d610e0264..83bfb1ea206f6b355d0d738c7153cf699589d5e5 100644 (file)
@@ -65,8 +65,9 @@ class Session(object):
         self.hooks = hooks
         self.config = get_config(config)
 
-        self.__pool = PoolManager(
-            num_pools=self.config.get('max_connections')
+        self.__pools = PoolManager(
+            num_pools=10,
+            maxsize=1
         )
 
         # Map and wrap requests.api methods.
@@ -112,7 +113,7 @@ class Session(object):
 
                 # Add in PoolManager, if neccesary.
                 if self.config.get('keepalive'):
-                    _kwargs['_pools'] = self.__pool
+                    _kwargs['_pools'] = self.__pools
 
                 # TODO: Persist cookies.