Если при проверке curl выводит HTTP-статус 000, значит, он не получил окончательный код HTTP-ответа, который мог бы показать. Сайт не присылал настоящего HTTP-статуса с названием 000.

Сохраните и сообщение об ошибке

Этот пример для POSIX-оболочки выводит итоговое HTTP-поле, поле CONNECT и код завершения процесса curl:

curl --proxy http://203.0.113.10:8080 --noproxy '' --connect-timeout 5 --max-time 15 --silent --show-error --output /dev/null --write-out 'http=%{http_code} connect=%{http_connect}\n' https://example.com/
result=$?
printf 'curl_exit=%s\n' "$result"

Замените адрес из примера своим HTTP-прокси или кандидатом из списка HTTP-прокси. Оставьте show-error включённым: сообщение об ошибке часто полезнее всего. Поле CONNECT имеет значение при использовании туннеля; это не второй итоговый статус сайта.

Читайте значения в совокупности

  • Неудачное подключение к прокси может оставить в HTTP-поле 000.
  • Тайм-аут до получения ответа может дать тот же результат.
  • Успешный ответ CONNECT, за которым следует ошибка TLS, может дать connect=200 и http=000.
  • Полностью полученный ответ сайта, например 403, — другая ситуация: есть настоящий HTTP-ответ, который можно изучить.

Точный код завершения и сообщение сужают круг причин. Выясните, возникла ли ошибка при поиске прокси, подключении к его порту, согласовании туннеля или проверке назначения.

Не сводите каждый результат к проверке статуса

Скрипт, сохраняющий только http_code, теряет ошибку транспорта. Сохраняйте также результат процесса и сообщение об ошибке с удалёнными конфиденциальными данными. И наоборот: curl может успешно завершить передачу, хотя сайт вернул ошибочный статус, если не используется подходящая опция fail. HTTP-ответ и результат выполнения клиента отвечают на разные вопросы.

Не пытайтесь исправить 000 отключением проверки TLS или добавлением случайного заголовка. Сначала определите, какая операция так и не дошла до итогового ответа.

Похожие статьи