Eu estava assistindo o tipo de servidor engraçado de http://www.reddit.com com curl -I http://www.reddit.com
quando eu imaginado que curl -X HEAD http://www.reddit.com
faria o mesmo. Mas, de fato, não.
Estou curioso sobre o porquê.
Isto é o que eu observo executando os dois comandos:
curl -I
: funciona como esperado, gera o cabeçalho e existe.curl -X HEAD
: não mostra nada e parece aguardar a entrada do usuário.
Mas, farejando com tshark
, vejo o segundo comando, na verdade, envia a mesma consulta HTML e recebe a resposta correta, mas não mostra e não fecha a conexão.
curl -I
0.000000 333.33.33.33 -> 213.248.111.106 TCP 59675 > http [SYN] Seq=0 Win=5840 Len=0 MSS=1460 TSV=47267342 TSER=0 WS=6
0.045392 213.248.111.106 -> 333.33.33.33 TCP http > 59675 [SYN, ACK] Seq=0 Ack=1 Win=5792 Len=0 MSS=1460 TSV=2552532839 TSER=47267342 WS=1
0.045441 333.33.33.33 -> 213.248.111.106 TCP 59675 > http [ACK] Seq=1 Ack=1 Win=5888 Len=0 TSV=47267353 TSER=2552532839
0.045623 333.33.33.33 -> 213.248.111.106 HTTP HEAD / HTTP/1.1
0.091665 213.248.111.106 -> 333.33.33.33 TCP http > 59675 [ACK] Seq=1 Ack=155 Win=6432 Len=0 TSV=2552532886 TSER=47267353
0.861782 213.248.111.106 -> 333.33.33.33 HTTP HTTP/1.1 200 OK
0.861830 333.33.33.33 -> 213.248.111.106 TCP 59675 > http [ACK] Seq=155 Ack=321 Win=6912 Len=0 TSV=47267557 TSER=2552533656
0.862127 333.33.33.33 -> 213.248.111.106 TCP 59675 > http [FIN, ACK] Seq=155 Ack=321 Win=6912 Len=0 TSV=47267557 TSER=2552533656
0.910810 213.248.111.106 -> 333.33.33.33 TCP http > 59675 [FIN, ACK] Seq=321 Ack=156 Win=6432 Len=0 TSV=2552533705 TSER=47267557
0.910880 333.33.33.33 -> 213.248.111.106 TCP 59675 > http [ACK] Seq=156 Ack=322 Win=6912 Len=0 TSV=47267570 TSER=2552533705
curl -X HEAD
34.106389 333.33.33.33 -> 213.248.111.90 TCP 51690 > http [SYN] Seq=0 Win=5840 Len=0 MSS=1460 TSV=47275868 TSER=0 WS=6
34.149507 213.248.111.90 -> 333.33.33.33 TCP http > 51690 [SYN, ACK] Seq=0 Ack=1 Win=5792 Len=0 MSS=1460 TSV=3920268348 TSER=47275868 WS=1
34.149560 333.33.33.33 -> 213.248.111.90 TCP 51690 > http [ACK] Seq=1 Ack=1 Win=5888 Len=0 TSV=47275879 TSER=3920268348
34.149646 333.33.33.33 -> 213.248.111.90 HTTP HEAD / HTTP/1.1
34.191484 213.248.111.90 -> 333.33.33.33 TCP http > 51690 [ACK] Seq=1 Ack=155 Win=6432 Len=0 TSV=3920268390 TSER=47275879
34.192657 213.248.111.90 -> 333.33.33.33 TCP [TCP Dup ACK 15#1] http > 51690 [ACK] Seq=1 Ack=155 Win=6432 Len=0 TSV=3920268390 TSER=47275879
34.823399 213.248.111.90 -> 333.33.33.33 HTTP HTTP/1.1 200 OK
34.823453 333.33.33.33 -> 213.248.111.90 TCP 51690 > http [ACK] Seq=155 Ack=321 Win=6912 Len=0 TSV=47276048 TSER=3920269022
Alguma idéia de por que essa diferença de comportamento?
curl
http-headers
diff
chmeee
fonte
fonte
Respostas:
Parece que a diferença tem a ver com o
Content-Length
cabeçalho e como ele é tratado pelos dois comandos.Mas antes de entrar nisso,
curl -X HEAD
não dá saída porque, por padrão,curl
não imprime cabeçalhos se a opção-i
não for fornecida (-I
embora não seja necessário ).De qualquer forma,
curl -I
é a maneira correta de buscar os cabeçalhos. É só pedir o cabeçalho e fechar a conexão.Por outro lado
curl -X HEAD -i
, aguardará a transmissão do número de bytes indicado porContent-Length
. Caso nãoContent-Length
seja especificado, acho que ele aguardará alguns dados ou esse cabeçalho específico.Alguns exemplos que mostram esse comportamento:
Como
Content-Length
é 0, nesse caso, os dois comandos se comportam da mesma forma. E a conexão é fechada depois.Nesse caso, parece haver um tempo limite (provavelmente por verniz), portanto,
curl
protesta que a conexão foi fechada antes de receber oContent-Length
número de bytes.A propósito, observe os engraçados cabeçalhos do X-Bender (mostrados no exemplo) e do X-Fry (tente você mesmo) :).
fonte
CURLOPT_NOBODY
.Eu acho que isso é um bug no curl. Se eu especificar um método com -X, o curl deverá manipular a resposta de acordo com o RFC. Infelizmente, o mantenedor de curl não concorda. Alguém registrou um bug e até enviou um patch:
http://sourceforge.net/tracker/?func=detail&atid=100976&aid=1810273&group_id=976
mas o mantenedor de cachos a rejeitou. Aparentemente, uma opção "-X HEAD" quebrada está "funcionando como projetado".
--Jamshid
fonte
--head
nos fornece uma implementação válida de uma solicitação HEAD e-X <method>
simplesmente substitui o método HTTP na solicitação.-X HEAD
era a única maneira que eu poderia testá-lo ao tentar obter o servidor a aderir ao RFCDos documentos :
Em outras palavras,
-X
é para fins diferentes métodosGET
,HEAD
,POST
ePUT
. ParaHEAD
uso-I
.fonte
Encontro o mesmo problema ao escrever o código cpp no curl 7.34,
vai ficar lá por um longo tempo, parece que está esperando a transferência do corpo até que um tempo limite ocorra. depois de adicionar uma nova linha, esse problema foi resolvido.
do doc
essa linha forçaria o enrolamento a não esperar.
fonte