निम्नलिखित कोड ncat -v -l 127.0.0.1 8000
समस्या
तथ्य उपयोग कर रहा है Git (विशेष रूप से requests.packages.urllib3.poolmanager.PoolManager._new_pool()
)
मैं इसे परीक्षण किया से अनुरोध की जरूरत है, कि कनेक्शन मानक पुस्तकालय से urllib3 द्वारा खोला नहीं है, लेकिन httplib द्वारा ।
import socket
import requests
from requests.adapters import HTTPAdapter
from requests.packages.urllib3 import PoolManager, HTTPConnectionPool
try:
from http.client import HTTPConnection
except ImportError:
from httplib import HTTPConnection
class MyAdapter(HTTPAdapter):
def init_poolmanager(self, connections, maxsize):
self.poolmanager = MyPoolManager(num_pools=connections,
maxsize=maxsize)
class MyPoolManager(PoolManager):
def _new_pool(self, scheme, host, port):
# Important!
if scheme == 'http' and host == my_host and port == my_port:
return MyHTTPConnectionPool(host, port, **self.connection_pool_kw)
return super(PoolManager, self)._new_pool(self, scheme, host, port)
class MyHTTPConnectionPool(HTTPConnectionPool):
def _new_conn(self):
self.num_connections += 1
return MyHTTPConnection(host=self.host,
port=self.port,
strict=self.strict)
class MyHTTPConnection(HTTPConnection):
def connect(self):
"""Connect to the host and port specified in __init__."""
# Original
# self.sock = socket.create_connection((self.host, self.port),
# self.timeout, self.source_address)
# Important!
self.sock = my_socket
if self._tunnel_host:
self._tunnel()
if __name__ == '__main__':
import time
my_host = '127.0.0.1'
my_port = 8000
my_socket = socket.create_connection((my_host, my_port))
time.sleep(4)
s = requests.Session()
s.mount('http://', MyAdapter())
s.get('http://127.0.0.1:8000/foo')
संपादित करें:
या प्रत्यक्ष connectionpool की monkeypatching:
class MyHTTPConnection(HTTPConnection):
def connect(self):
self.sock = my_socket
if self._tunnel_host:
self._tunnel()
requests.packages.urllib3.connectionpool.HTTPConnection = MyHTTPConnection
if __name__ == '__main__':
my_host = '127.0.0.1'
my_port = 8000
my_socket = socket.create_connection((my_host, my_port))
requests.get('http://127.0.0.1:8000/foo')
स्रोत
2013-02-03 09:33:11
यह monkeypatching मेरे लिए काम नहीं करता। मुझे यकीन नहीं है कि यह कभी काम नहीं करता है या यदि पिछले चार वर्षों में अनुरोध बदल गए हैं, लेकिन मेरी कक्षा का उपयोग नहीं किया जाता है (कम से कम, इसकी '__init__' और' कनेक्ट' विधियों को कभी नहीं कहा जाता है)। मैं अजगर 3.5 का उपयोग कर रहा हूं और 2.18.1 अनुरोध करता हूं। – Tom