Ответ 1
Если вам нужен доступ к такому низкоуровневому свойству в используемом сокете, вам придется перегрузить некоторые объекты.
Сначала вам нужно создать подкласс HTTPHandler, который в стандартной библиотеке:
class HTTPHandler(AbstractHTTPHandler):
def http_open(self, req):
return self.do_open(httplib.HTTPConnection, req)
http_request = AbstractHTTPHandler.do_request_
Как вы можете видеть, он использует HTTPConnection
для открытия соединения... Вам также придется переопределить его;), чтобы обновить метод connect()
.
Что-то вроде этого должно быть хорошим началом:
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 достаточно умен, чтобы вы могли подклассифицировать некоторый обработчик, а затем использовать его, urllib2.build_opener для этого:
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()