curlのテストでHTTPステータスとして000が出力された場合、報告できる最終的なHTTPレスポンスコードを取得していません。Webサイトが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欄はトンネルを使う場合に意味を持つもので、Webサイトの2つ目の最終ステータスではありません。

値を組み合わせて読む

  • プロキシへの接続に失敗すると、HTTP欄が000のままになることがあります。
  • レスポンスを受信する前のタイムアウトでも同じ結果になり得ます。
  • CONNECTのレスポンスが成功しても、その後にTLSエラーが起きると、connect=200、http=000になることがあります。
  • 403など、Webサイトからのレスポンスを受信できた場合は別です。調べられる実際のHTTPレスポンスがあります。

正確な終了コードとメッセージで原因を絞り込みます。プロキシの検索、ポートへの接続、トンネルのネゴシエーション、接続先の検証のどこで失敗したのかを確認してください。

どの結果もステータス確認だけで済ませない

http_codeしか保存しないスクリプトは、通信上のエラーを捨ててしまいます。プロセスの実行結果と、機密情報を取り除いたエラーメッセージも保存してください。逆に、適切なfailオプションを使わなければ、Webサイトがエラーステータスを返してもcurlの転送は正常終了することがあります。HTTPレスポンスとクライアントの実行結果は、それぞれ別のことを示します。

TLS検証を無効にしたり、適当なヘッダーを追加したりして000を直そうとしないでください。まず、どの処理が最終レスポンスに到達していないのかを特定します。

関連記事