Фон
Я отслеживал некоторые HTTP-запросы через CLI с помощью time
и таких инструментов, как wget
и 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 в банке...) Мне нужно использовать 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
(FYI) до того, как я использовал curl: (18) transfer closed with 3 bytes remaining to read
, когда сервер неправильно обрабатывал HEAD
и возвращал Content-Length: 3
без возврата какого-либо контента, но не все выглядит нормально).
Я попытался сыграть с аргументами --max-time
и --speed-time
, чтобы иметь тайм-аут curl
сразу после получения 200 OK
, но это не имеет никакого значения.
В: Как я могу отправить запрос HEAD
с curl таким образом, что команда curl останавливается сразу после получения ответа от сервера?