Как я могу получить доступ к базовому сокету из twisted.web.client.Agent? Мне нужно включить TCP_NODELAY в этом сокете.
К сожалению, агент не делает это так просто, как если бы вы работали напрямую с экземпляром протокола, но это тоже не невозможно.
Ключ лежит здесь, в определении класса Agent:
_protocol = HTTP11ClientProtocol
Чтобы получить доступ к транспорту, вы можете переопределить connectionMade в HTTP11ClientProtocol, а также Agent.
Итак, у вас получится что-то вроде:
from twisted.web import client
class MyHTTPClient(client.HTTP11ClientProtocol):
def connectionMade(self):
self.transport.setTcpNoDelay(True)
client.HTTP11ClientProtocol.connectionMade(self) # call the super-class connectionMade
class MyAgent(client.Agent):
_protocol = MyHTTPClient
Теперь используйте MyAgent вместо агента, и вы получите TCP nodelay на клиенте.
** Примечание **, это не единственный способ сделать это, но один из способов сделать это и продолжать использовать Agent.request. В качестве альтернативы напишите свой собственный агент, который обрабатывает запрос и подключает его к клиенту, и связывает ваш запрос вместе с TCP nodelay в отложенной цепочке.
** Примечание 2 ** В этом случае, чтобы предположить, что "транспорт" имеет метод setTcpNoDelay(), потому что он довольно разумный Предположим, вы будете использовать TCP в качестве транспорта для HTTP-запроса. Однако это может быть не очень умная идея.
_
означает "частный".