¿Cómo establecer el indicador TCP_NODELAY al cargar la URL con urllib2?

Estoy usando urllib2 para cargar una página web, mi código es:

httpRequest = urllib2.Request("http:/www....com") pageContent = urllib2.urlopen(httpRequest) pageContent.readline() 

¿Cómo puedo obtener las propiedades del socket para establecer TCP_NODELAY ?

En socket normal estaría usando la función:

 socket.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) 

Si necesita acceder a dicha propiedad de bajo nivel en el zócalo utilizado, deberá sobrecargar algunos objetos.

Primero, deberá crear una subclase de HTTPHandler , que en la biblioteca estándar haga:

 class HTTPHandler(AbstractHTTPHandler): def http_open(self, req): return self.do_open(httplib.HTTPConnection, req) http_request = AbstractHTTPHandler.do_request_ 

Como puede ver, usa una conexión HTTPConnection para abrir la conexión … También deberá HTTPConnection 😉 para actualizar el método connect() .

Algo como esto debería ser un buen comienzo:

 class LowLevelHTTPConnection(httplib.HTTPConnection): def connect(self): httplib.HTTPConnection.connect(self) self.sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) class LowLevelHTTPHandler(HTTPHandler): def http_open(self, req): return self.do_open(LowLevelHTTPConnection, req) 

urllib2 es lo suficientemente inteligente como para permitirte subclasificar un controlador y luego usarlo, urllib2.build_opener está hecho para esto:

 urllib2.install_opener(urllib2.build_opener(LowLevelHTTPHandler)) # tell urllib2 to use your HTTPHandler in replacement of the standard HTTPHandler httpRequest = urllib2.Request("http:/www....com") pageContent = urllib2.urlopen(httpRequest) pageContent.readline() 

Para las solicitudes, las clases parecen estar en request.packages.urllib3 ; hay 2 clases, HTTPConnection y HTTPSConnection. Deben ser compatibles en su lugar en el nivel superior del módulo:

 from requests.packages.urllib3 import connectionpool _HTTPConnection = connectionpool.HTTPConnection _HTTPSConnection = connectionpool.HTTPSConnection class HTTPConnection(_HTTPConnection): def connect(self): _HTTPConnection.connect(self) self.sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) class HTTPSConnection(_HTTPSConnection): def connect(self): _HTTPSConnection.connect(self) self.sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) connectionpool.HTTPConnection = HTTPConnection connectionpool.HTTPSConnection = HTTPSConnection 

¿Tienes que usar urllib2?

Alternativamente, puede usar httplib2, que tiene configurada la opción TCP_NODELAY.

https://code.google.com/p/httplib2/

Agrega una dependencia a su proyecto, pero parece menos frágil que los parches de mono.