curl 테스트에서 HTTP 상태로 000이 출력되면 보고할 최종 HTTP 응답 코드를 얻지 못했다는 뜻입니다. 웹사이트가 000이라는 실제 HTTP 상태를 보낸 것은 아닙니다.

오류도 함께 기록하기

다음 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만 저장하는 스크립트는 전송 오류를 버립니다. 프로세스 실행 결과와 민감한 정보를 제거한 오류 메시지도 저장하세요. 반대로 적절한 fail 옵션을 사용하지 않으면 웹사이트가 오류 상태를 반환해도 curl은 전송을 성공적으로 마칠 수 있습니다. HTTP 응답과 클라이언트 실행 결과는 서로 다른 질문에 답합니다.

TLS 검증을 끄거나 임의의 헤더를 추가해 000을 해결하려 하지 마세요. 먼저 어떤 작업이 최종 응답에 도달하지 못했는지 파악하세요.

관련 글