cURL зависает на 15 секунд при отправке запросов HEAD

Background

Я синхронизировал некоторые HTTP-запросы через интерфейс командной строки, используя 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 «Соединение: 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) передача закрыта с 3 байтами, оставшимися для чтения , когда сервер не обрабатывал HEAD должным образом и возвращал Content-Length: 3 , не возвращая никакого содержимого, но не все выглядит нормально).

Я попытался поиграть с аргументами - max-time и - speed-time , чтобы иметь таймаут curl сразу после получения 200 ОК , но это не имеет значения.

В: Как я могу отправить запрос HEAD с помощью curl таким образом, чтобы команда curl останавливалась сразу после получения ответа от сервера?

12
задан Eric Platon 28 November 2014 в 03:49
поделиться