При попытке использовать PyCurl (последняя версия с Python2.7) для тестирования нескольких методов аутентификации один за другим, он отправляет только первые 2 соединения, а затем завершается неудачно, даже не пытаясь соединиться, при использовании Wireshark для просмотра запроса CONNECT Iможет видеть только первые 2.
Это небольшой пример кода для воспроизведения этого сценария:
import pycurl
AUTH_ALL_METHODS = [
pycurl.HTTPAUTH_NTLM,
pycurl.HTTPAUTH_NEGOTIATE,
pycurl.HTTPAUTH_DIGEST,
pycurl.HTTPAUTH_DIGEST_IE,
pycurl.HTTPAUTH_BASIC,
]
curl = pycurl.Curl()
curl.setopt(pycurl.URL, "https://www.google.com")
curl.setopt(pycurl.PROXY, "http://52.31.232.220:3128")
curl.setopt(pycurl.PROXYUSERPWD, "safebreach:safebreach")
for auth in AUTH_ALL_METHODS:
curl.setopt(pycurl.PROXYAUTH, auth)
try:
curl.perform()
except Exception as e:
print e, auth
curl.close()
При добавлении time.sleep(5)
в исключении все работает, как должно, и всезапросы присутствуют в Wireshark.
Я предполагаю, что существует некоторое внутреннее состояние PyCurl, которое необходимо сбросить, но я не мог понять это, даже создавая новый экземпляр pycurl.Curl()
для каждой попытки, которую я получаюрезультаты.
ОБНОВЛЕНИЕ
После дальнейшего изучения этого кажется, что, когда ошибка:
Proxy CONNECT aborted
, которую я получаю с первого разаpycurl.HTTPAUTH_NTLM
следующие вызовы не выполняются с ошибкой:
Failed to connect to xx.xx.xx.xx port xxxx: Connection refused
Протестирован тот же сценарий с curl
, и он ведет себя так же:
curl --proxy-ntlm -XGET -x http://xx.xx.xx.xx:xxxx -U username:password https://www.google.com
curl -XGET -x http://xx.xx.xx.xx:xxxx -U username:password https://www.google.com
Вывод:
curl: (56) Proxy CONNECT aborted
curl: (7) Failed to connect to xx.xx.xx.xx port xxxx: Connection refused
Есть ли способ преодолеть это?