cURL pendurado por 15 segundos ao enviar solicitações HEAD

Fund

Eu cronometrei algumas solicitações HTTP via CLI usandotime e ferramentas comowget ecurl do seguinte modo

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

O que eu notei é que ao usarcurl, Obtive tempos de resposta semelhantes aos dewget somente na primeira solicitação e tempos muito mais baixos nas solicitações subsequentes, como se as respostas acurl foram servidos do cache ewget não estivessem

Depois de investigar, descobri que, ao especificar--spider, wget emite umHEAD, conforme anexado abaixo, o que poderia explicar por que o cache é ignorado comwget:

Solicitaçã

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

Respost

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

Como estou fazendo coisas mais avançadas (escrevendo corpo e cabeçalhos em arquivos separados, postando dados, salvando cookies no jar ...) preciso usar ocurl ao invés dewget. Portanto, estou tentando emular umHEAD solicitação comcurl.

Questã

Eu consegui enviar umHEAD solicitação comcurl do seguinte modo

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

Solicitaçã

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

Respost

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

Apesar da solicitação / resposta estar aparentemente correta, quando executo o procedimento acimacurl enquanto fareja comtcpdump Percebo que o servidor responde imediatamente, porémmeucurl comando @ sempre permanece suspenso por exatamente 15 segundos, o que obviamente é um grande problema, já que estou tentando cronometrar meucurl (FYI antes de eu obter umcurl: (18) transfer closed with 3 bytes remaining to read quando o servidor não estava lidando comHEAD corretamente e estava retornandoContent-Length: 3 sem retornar nenhum conteúdo, mas nem tudo parece bem

Tentei brincar com o--max-time e--speed-time argumentos para tercurl timeout imediatamente após receber o200 OK mas não faz diferença.

Q: Como posso enviar umHEAD request com curl de forma que o comando curl pare imediatamente após receber a resposta do servido

questionAnswers(1)

yourAnswerToTheQuestion