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