# HG changeset patch -- Bitbucket.org # Project django-roa # URL http://bitbucket.org/david/django-roa/overview # User David Larlet # Date 1254169699 -7200 # Node ID 6fb5496bda07a776a0ab452aeb0e580148ff9cd7 # Parent fe8c29bac8f89d05d6af710bd7c5c8655759e462 Update to the latest restkit's tip --- a/restkit/httpc.py +++ b/restkit/httpc.py @@ -121,7 +121,9 @@ class HttpClient(object): if conn_key in self.connections: pool = self.connections[conn_key] else: - pool = self.connections[conn_key] = self.pool_class(uri, self.use_proxy) + pool = self.connections[conn_key] = self.pool_class(uri, + use_proxy=self.use_proxy, min_size=self.min_size, + max_size=self.max_size) connection = pool.get() return connection @@ -131,7 +133,9 @@ class HttpClient(object): if conn_key in self.connections: pool = self.connections[conn_key] else: - pool = self.connections[conn_key] =self.pool_class(uri, self.use_proxy) + pool = self.connections[conn_key] =self.pool_class(uri, + use_proxy=self.use_proxy, min_size=self.min_size, + max_size=self.max_size) pool.put(connection) @@ -184,9 +188,11 @@ class HttpClient(object): except socket.gaierror: connection.close() + self._release_connection(uri, connection) raise errors.ResourceNotFound("Unable to find the server at %s" % connection.host, 404) except (socket.error, httplib.HTTPException): connection.close() + self._release_connection(uri, connection) if i == 0: continue else: @@ -265,7 +271,8 @@ class HttpClient(object): resp.final_url = self.final_url if method == "HEAD": - connection.close() + response.close() + self._release_connection(uri, connection) return resp, "" else: return resp, _decompress_content(resp, response, @@ -300,6 +307,7 @@ def _decompress_content(resp, response, release_callback() return data except Exception, e: + release_callback() raise errors.ResponseError("Decompression failed %s" % str(e)) --- a/restkit/pool.py +++ b/restkit/pool.py @@ -135,10 +135,6 @@ class Pool(object): try: if self.free_items: return self.free_items.popleft() - if self.current_size < self.max_size: - created = self.create() - self.current_size += 1 - return created try: return self.channel.get(False) @@ -146,7 +142,7 @@ class Pool(object): created = self.create() self.current_size += 1 return created - + finally: self.lock.release() @@ -186,7 +182,7 @@ class Pool(object): def waiting(self): """Return the number of routines waiting for a pool item. """ - return self.max_size - self.channel.qsize() + return (self.channel.qsize() < self.max_size) def create(self): """Generate a new pool item @@ -203,14 +199,25 @@ class ConnectionPool(Pool): return make_connection(self.uri, self.use_proxy) def put(self, connection): - # close the connection if needed - if connection.sock is not None: - connection.close() - if self.current_size > self.max_size: self.lock.acquire() self.current_size -= 1 + # close the connection if needed + if connection.sock is not None: + connection.close() self.lock.release() return - Pool.put(self, self.create()) + try: + response = connection.getresponse() + response.read() + except httplib.ResponseNotReady: + pass + except: + connection.close() + + + if connection.sock is None: + connection = self.create() + + Pool.put(self, connection) --- a/restkit/ext/eventlet_pool.py +++ b/restkit/ext/eventlet_pool.py @@ -99,4 +99,21 @@ class ConnectionPool(Pool): return make_connection(self.uri, self.use_proxy) def put(self, connection): - Pool.put(self, self.create()) + if self.current_size > self.max_size: + self.current_size -= 1 + # close the connection if needed + if connection.sock is not None: + connection.close() + return + + try: + response = connection.getresponse() + response.read() + except httplib.ResponseNotReady: + pass + except: + connection.close() + + if connection.sock is None: + connection = self.create() + Pool.put(self, connection)