Доступ к параметрам сокета для twisted.web.client.Agent - PullRequest
1 голос
/ 28 апреля 2011

Как я могу получить доступ к базовому сокету из twisted.web.client.Agent? Мне нужно включить TCP_NODELAY на этом сокете.

1 Ответ

4 голосов
/ 28 апреля 2011

К сожалению, Agent не делает это так просто, как если бы вы работали напрямую с экземпляром Protocol, но это также невозможно.

Ключ лежит здесь, в определении класса Agent:

_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-узел на клиенте.

** Примечание **, это не единственный способ сделать это, но один из способовможете сделать это и продолжать использовать Agent.request.Кроме того, напишите свой собственный агент, который обрабатывает запрос и соединяет его с клиентом и связывает ваш запрос вместе с нодлаем TCP в отложенной цепочке.

** Примечание 2 ** В этом случае все нормальноПредполагается, что у «transport» есть метод setTcpNoDelay () , поскольку вполне разумно предположить, что вы будете использовать TCP в качестве транспорта для HTTP-запроса.Это может быть не очень разумной идеей.

...