cURL pendurado por 15 segundos ao enviar solicitações HEAD
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
.
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