Доступ к параметрам сокета для 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-запроса. Это не может быть разумной идеей, хотя и извращенной.

Другие вопросы по тегам