12

バックグラウンド

次のようtimeなツールwgetを使用して、CLI を介していくつかの HTTP 要求のタイミングを計っています。curl

/usr/bin/time -v wget --spider http://localhost/index
/usr/bin/time -v curl http://localhost/index 2>&1 > /dev/null

私が気付いたのは、 を使用すると、最初のリクエストのみcurlと同様の応答時間が得られwget、その後のリクエストでは、応答curlがキャッシュから提供され、wgetそうでなかったかのように、はるかに短い時間であるということです。

調査した結果、 を指定する--spiderと、以下に追加されwgetたリクエストが発行HEADされ、キャッシュが でバイパスされる理由を説明できることがわかりましたwget

リクエスト

HEAD /index HTTP/1.0
User-Agent: Wget/1.12 (linux-gnu)
Accept: */*
Host: localhost
Connection: Keep-Alive

応答

HTTP/1.1 200 OK
Date: Mon, 28 Nov 2011 14:45:59 GMT
Server: Apache/2.2.14 (Ubuntu)
Content-Location: index.php
Vary: negotiate,Accept-Encoding
TCN: choice
X-Powered-By: PHP/5.3.2-1ubuntu4.10
Set-Cookie: SESS421aa90e079fa326b6494f812ad13e79=16oqmug3loekjlb1tlvmsrtcr2; expires=Wed, 21-Dec-2011 18:19:19 GMT; path=/
Expires: Sun, 19 Nov 1978 05:00:00 GMT
Last-Modified: Mon, 28 Nov 2011 14:45:59 GMT
Cache-Control: store, no-cache, must-revalidate
Cache-Control: post-check=0, pre-check=0
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=utf-8

私はより高度なことをしているので(本文とヘッダーを別々のファイルに書き込み、データを投稿し、Cookieをjarに保存します...)、curl代わりにwget. HEADしたがって、リクエストをエミュレートしようとしていcurlます。

問題

次のようにHEADリクエストを送信できました。curl

curl "http://localhost/index" --request "HEAD" -H "Connection: Keep-Alive" -0

リクエスト

HEAD /index HTTP/1.0
User-Agent: curl/7.19.7 (x86_64-pc-linux-gnu) libcurl/7.19.7 OpenSSL/0.9.8k zlib/1.2.3.3 libidn/1.15
Host: localhost
Accept: */*
Connection: Keep-Alive

応答

HTTP/1.1 200 OK
Date: Mon, 28 Nov 2011 15:44:02 GMT
Server: Apache/2.2.14 (Ubuntu)
Content-Location: index.php
Vary: negotiate,Accept-Encoding
TCN: choice
X-Powered-By: PHP/5.3.2-1ubuntu4.10
Set-Cookie: SESS421aa90e079fa326b6494f812ad13e79=4001hcmhdbnkb9e2v8nok9lii1; expires=Wed, 21-Dec-2011 19:17:22 GMT; path=/
Expires: Sun, 19 Nov 1978 05:00:00 GMT
Last-Modified: Mon, 28 Nov 2011 15:44:02 GMT
Cache-Control: store, no-cache, must-revalidate
Cache-Control: post-check=0, pre-check=0
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=utf-8

要求/応答は一見問題ないように見えますがcurl、スニッフィング中に上記のコマンドを実行するtcpdumpと、サーバーがすぐに応答することがわかりますがcurlコマンドが常に正確に 15 秒間ハングしたままになります。私のコマンドの時間を調べてください(サーバーが適切に処理されず、コンテンツを返さずに返されcurlたときに取得する前に参考までに、すべてが正常に見えるわけではありません)。curl: (18) transfer closed with 3 bytes remaining to readHEADContent-Length: 3

--max-time--speed-time引数を使用してcurl、 を受信するとすぐにタイムアウトになるようにしようとしました200 OKが、違いはありません。

HEADQ:サーバーからの応答を受信するとすぐに curl コマンドが停止するように、curl で要求を送信するにはどうすればよいですか?

4

1 に答える 1

23

-Iオプションを使用しないのはなぜですか?

-I/--head
    (HTTP/FTP/FILE) Fetch the HTTP-header only! HTTP-servers feature
    the command HEAD which this uses to get nothing but  the  header
    of  a  document.  When used on a FTP or FILE file, curl displays
    the file size and last modification time only
于 2011-11-28T19:53:10.057 に答える