Доступ к параметрам сокета для twisted.web.client.Agent

1

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

Теги:
twisted
twisted.web

1 ответ

4
Лучший ответ

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

Ключ лежит здесь, в определении класса 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-запроса. Однако это может быть не очень умная идея.

  • 1
    Не забывайте, что _ означает "частный".
  • 0
    @JP: Прагматик во мне часто воюет с сопровождающим меня библиотекарем, который хочет не нарушать соглашения API. К сожалению, прагматик часто побеждает. Поскольку у вас есть более личные знания Twisted, вы случайно не знаете, почему в случае с клиентом атрибут «protocol» помечается как закрытый? Это несколько несовместимо со многими другими объектами фабричного типа.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню