If you need to access to such low level property on the socket used, you'll have to overload some objects.
First, you'll need to create a subclass of HTTPHandler, that in the standard library do :
class HTTPHandler(AbstractHTTPHandler): def http_open(self, req): return self.do_open(httplib.HTTPConnection, req) http_request = AbstractHTTPHandler.do_request_
As you can see, it uses a HTTPConnection to open connection... You'll have to override it too ;) to upgrade the connect() method.
Something like this should be a good start :
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 is smart enough to allow you to subclass some handler and then use it, the urllib2.build_opener is made for this :
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()
write()orsend(), the socket stack does not know that, and Nagle delays sending the TCP packet in order to combine it with anotherwrite()/send()call that isn't coming.