Je regardais le type de serveur drôle de http://www.reddit.com avec curl -I http://www.reddit.com
quand j'ai deviné que curl -X HEAD http://www.reddit.com
cela ferait la même chose. Mais en fait, ce n'est pas le cas.
Je suis curieux de savoir pourquoi.
Voici ce que j'observe lors de l'exécution des deux commandes:
curl -I
: fonctionne comme prévu, sort l'en-tête et existe.curl -X HEAD
: ne montre rien et semble attendre les entrées de l'utilisateur.
Cependant, si tshark
je vois la deuxième commande renifler envoie la même requête HTML et reçoit la réponse correcte, mais elle ne l’affiche pas et ne ferme pas la connexion.
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
Une idée sur pourquoi cette différence de comportement?
curl
http-headers
diff
chmeee
la source
la source
Réponses:
Il semble que la différence concerne l'en-
Content-Length
tête et son traitement par les deux commandes.Mais avant d'entrer dans cela,
curl -X HEAD
ne donne aucune sortie car, par défaut,curl
n'imprime pas les en-têtes si le commutateur-i
n'est pas fourni (pas nécessaire sur-I
).Dans tous les cas,
curl -I
est la bonne façon de récupérer les en-têtes. Il suffit de demander l'en-tête et de fermer la connexion.D'autre part
curl -X HEAD -i
attendra la transmission du nombre d'octets indiqué parContent-Length
. Dans le cas où nonContent-Length
n'est pas spécifié, je suppose qu'il attendra certaines données ou cet en-tête particulier.Quelques exemples montrant ce comportement:
Parce que
Content-Length
vaut 0, dans ce cas les deux commandes se comportent de la même manière. Et la connexion est fermée après.Dans ce cas, il semble y avoir un délai d'attente (probablement de Varnish), ce
curl
qui proteste donc que la connexion a été fermée avant d'avoir reçu leContent-Length
nombre d'octets.Au fait, regardez les en-têtes drôles X-Bender (montrés dans l'exemple) et X-Fry (essayez par vous-même) :).
la source
CURLOPT_NOBODY
.Je pense que c'est un bug dans curl. Si je spécifie une méthode avec -X, curl devrait gérer la réponse conformément à la RFC. Malheureusement, le responsable de curl n'est pas d'accord. Quelqu'un a déposé un bogue et même soumis un correctif:
http://sourceforge.net/tracker/?func=detail&atid=100976&aid=1810273&group_id=976
mais le responsable de la boucle l'a rejeté. Apparemment, une option "-X HEAD" cassée fonctionne "comme prévu".
--Jamshid
la source
--head
nous fournit une implémentation valide d'une requête HEAD et-X <method>
remplace simplement la méthode HTTP dans la requête.-X HEAD
était la seule façon que je pouvais le tester en essayant d'obtenir le serveur d'adhérer à la RFCDe la docs :
En d' autres termes,
-X
est des méthodes autres queGET
,HEAD
,POST
etPUT
. PourHEAD
utilisation-I
.la source
Je rencontre le même problème lorsque j'écris du code cpp sous curl 7.34,
y restera longtemps, semble attendre le transfert du corps jusqu’à l’expiration du délai. après avoir ajouté une nouvelle ligne, ce problème est résolu.
de la doc
cette ligne obligerait curl à ne pas attendre.
la source