Преобразование URL HTTP-прокси в конечную точку Twisted
Разберите обычный URL HTTP-прокси на хост и порт, вместо того чтобы передавать его как грамматику описания конечной точки Twisted.
Обычное значение прокси, например http://proxy.example:8080, — это URL. clientFromString в Twisted принимает описание конечной точки, например tcp:host=proxy.example:port=8080. Две строки описывают связанную информацию с разными грамматиками.
Если приложение принимает обычный URL HTTP-прокси, разберите его перед созданием конечной точки:
import os
from urllib.parse import urlsplit
from twisted.internet.endpoints import HostnameEndpoint
from twisted.web.client import ProxyAgent
proxy = urlsplit(os.environ['http_proxy'])
if proxy.scheme != 'http' or not proxy.hostname:
raise ValueError('Expected an HTTP proxy URL')
port = proxy.port if proxy.port is not None else 80
endpoint = HostnameEndpoint(reactor, proxy.hostname, port, timeout=5)
agent = ProxyAgent(endpoint, reactor=reactor)
Фрагмент предполагает, что у приложения уже есть свой reactor. Укажите реальный порт прокси в конфигурации, когда он не является стандартным для URL HTTP. Список HTTP-прокси предлагает кандидатов в конечные точки для разрешённого публичного HTTP-запроса без учётной записи прокси. HostnameEndpoint также избегает встраивания имени хоста в другую строку конфигурации, разделённую двоеточиями.
Это преобразует только входные данные маршрутизации. Учётные данные, встроенные в URL, не становятся заголовком авторизации только потому, что хост и порт были разобраны. Предоставьте любую требуемую поддерживаемую аутентификацию прокси через схему аутентификации запроса. Для простого HTTP-назначения и посредника, предлагающего Basic, заголовки запроса Basic в ProxyAgent дают одну такую схему.
URL HTTPS-прокси требует соединения с прокси, поддерживающего TLS. URL SOCKS требует согласования SOCKS. Ни то, ни другое не реализуется отправкой этих схем в простое преобразование конечной точки HTTP ProxyAgent.