POOL PARTY!!!!!!!!!!!!!!!
authorKenneth Reitz <me@kennethreitz.com>
Mon, 26 Sep 2011 01:23:04 +0000 (21:23 -0400)
committerKenneth Reitz <me@kennethreitz.com>
Mon, 26 Sep 2011 01:23:04 +0000 (21:23 -0400)
requests/_config.py
requests/api.py
requests/models.py
requests/sessions.py

index a9cfbec802c37332ceaa4b4d6517e59b26a54d5f..12aad6af971af9f92f4404c9d205f120cc2af54c 100644 (file)
@@ -47,5 +47,6 @@ defaults['timeout'] = None
 defaults['max_redirects'] = 30
 defaults['decode_unicode'] = True
 defaults['keepalive'] = True
+defaults['max_connections'] = 10
 
 
index e08e530a07c13d33478a556150b7927b9a45399a..5debae1f0114bd7c2ac6c5f50c4c16618051edbf 100644 (file)
@@ -24,7 +24,7 @@ __all__ = ('request', 'get', 'head', 'post', 'patch', 'put', 'delete')
 def request(method, url,
     params=None, data=None, headers=None, cookies=None, files=None, auth=None,
     timeout=None, allow_redirects=False, proxies=None, hooks=None,
-    config=None, _connection=None):
+    config=None, _pools=None):
 
     """Constructs and sends a :class:`Request <Request>`.
     Returns :class:`Response <Response>` object.
@@ -40,7 +40,7 @@ def request(method, url,
     :param timeout: (optional) Float describing the timeout of the request.
     :param allow_redirects: (optional) Boolean. Set to True if POST/PUT/DELETE redirect following is allowed.
     :param proxies: (optional) Dictionary mapping protocol to the URL of the proxy.
-    :param _connection: (optional) An HTTP Connection to re-use.
+    :param _pools: (optional) An HTTP PoolManager to use.
     """
 
     method = str(method).upper()
@@ -80,7 +80,7 @@ def request(method, url,
     r = dispatch_hook('pre_request', hooks, r)
 
     # Send the HTTP Request.
-    r.send(connection=_connection)
+    r.send(pools=_pools)
 
     # Post-request hook.
     r = dispatch_hook('post_request', hooks, r)
index a5bfc8d5f65bc2d0246f8ec3111157a33213222f..820fc438194d2c9aebef0482e5945e00db767013 100644 (file)
@@ -227,7 +227,7 @@ class Request(object):
 
 
 
-    def send(self, connection=None, anyway=False):
+    def send(self, pools=None, anyway=False):
         """Sends the shit."""
 
         # Safety check.
@@ -254,12 +254,13 @@ class Request(object):
 
             try:
                 # Create a new HTTP connection, since one wasn't passed in.
-                if not connection:
+                if not pools:
                     connection = urllib3.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, timeout=self.timeout)
                     # Part of a connection pool, so no fancy stuff. Sorry!
                     do_block = True
 
index 69306596ee450c3562b6a0b0405115a9292df314..38e6c50163ab6c6eded0d1e1b22c3e7f6ca19e0f 100644 (file)
@@ -14,6 +14,7 @@ import cookielib
 from . import api
 from ._config import get_config
 from .utils import add_dict_to_cookiejar
+from .packages.urllib3.poolmanager import PoolManager
 
 
 def merge_kwargs(local_kwarg, default_kwarg):
@@ -64,6 +65,10 @@ class Session(object):
         self.hooks = hooks
         self.config = get_config(config)
 
+        self.__pool = PoolManager(
+            num_pools=self.config.get('max_connections')
+        )
+
         # Map and wrap requests.api methods.
         self._map_api_methods()
 
@@ -105,6 +110,10 @@ class Session(object):
                     if k not in _kwargs:
                         _kwargs[k] = v
 
+                # Add in PoolManager, if neccesary.
+                if self.config.get('keepalive'):
+                    _kwargs['_pool'] = self.__pool
+
                 # TODO: Persist cookies.
 
                 return func(*args, **_kwargs)