Frage Unterschied zwischen `curl -I` und` curl -X HEAD`


Ich beobachtete den lustigen Servertyp von http://www.reddit.com mit curl -I http://www.reddit.com als ich das vermutete curl -X HEAD http://www.reddit.com würde das Gleiche tun. Aber in der Tat nicht.

Ich bin neugierig warum.

Dies ist, was ich beobachte, die zwei Befehle auszuführen:

  • curl -I: funktioniert wie erwartet, gibt den Header aus und existiert.

  • curl -X HEAD: zeigt nichts an und scheint auf Benutzereingaben zu warten.

Aber schnüffeln mit tshark Ich sehe, dass der zweite Befehl tatsächlich dieselbe HTML-Abfrage sendet und die richtige Antwort empfängt, aber sie zeigt sie nicht an und sie schließt die Verbindung nicht.

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

Irgendeine Idee darüber, warum dieser Unterschied im Verhalten?


54
2018-05-10 08:49


Ursprung


Siehe auch daniel.haxx.se/blog/2015/09/11/unncessary-use-of-curl-x - Abbafei


Antworten:


Es scheint, der Unterschied hat mit dem zu tun Content-Length Header und wie es von beiden Befehlen behandelt wird.

Aber bevor wir darauf eingehen, curl -X HEAD gibt keine Ausgabe, weil standardmäßig curl druckt Header nicht, wenn Schalter -i wird nicht bereitgestellt (wird nicht benötigt) -I obwohl).

Auf jeden Fall, curl -I ist der richtige Weg, um die Header zu holen. Es fragt nur nach dem Header und schließt die Verbindung.

Auf der anderen Seite curl -X HEAD -i wird auf die Übertragung der angegebenen Anzahl von Bytes warten Content-Length. Im Fall Nr Content-Length ist nicht angegeben, ich denke, es wird auf einige Daten oder für diesen bestimmten Header warten.

Einige Beispiele, die dieses Verhalten zeigen:

$ curl -X HEAD -i http://www.elpais.es
HTTP/1.1 301 Moved Permanently
Server: AkamaiGHost
Content-Length: 0
Location: http://www.elpais.com/
Date: Wed, 12 May 2010 06:35:57 GMT
Connection: keep-alive

weil Content-Length ist 0, in diesem Fall verhalten sich beide Befehle gleich. Und die Verbindung ist danach geschlossen.

$ curl -X HEAD -i http://slashdot.org
HTTP/1.1 200 OK
Server: Apache/1.3.41 (Unix) mod_perl/1.31-rc4
SLASH_LOG_DATA: shtml
X-Powered-By: Slash 2.005001296
X-Bender: Since I love you all so much, I'd like to give everyone hugs.
X-XRDS-Location: http://slashdot.org/slashdot.xrds
Cache-Control: no-cache
Pragma: no-cache
Content-Type: text/html; charset=iso-8859-1
Content-Length: 115224
Date: Wed, 12 May 2010 06:37:20 GMT
X-Varnish: 1649060825 1649060810
Age: 1
Connection: keep-alive

curl: (18) transfer closed with 115224 bytes remaining to read

In diesem Fall scheint es eine Auszeit zu geben (wahrscheinlich von Varnish), also curl protestiert, dass die Verbindung geschlossen wurde, bevor sie die Content-Length Anzahl der Bytes.

Sieh dir übrigens die witzigen X-Bender (im Beispiel gezeigt) und X-Fry (versuche es selbst an) Header :).


53
2018-05-12 06:49



Falls jemand anderes danach sucht: Die Option, in die Curl-Bibliothek von PHP zu setzen, ist CURLOPT_NOBODY. - Matthew Caruana Galizia


Ich denke, das ist ein Bug in Curl. Wenn ich eine Methode mit -X angeben, sollte curl die Antwort gemäß RFC behandeln. Leider ist der Verwalter der Locke nicht einverstanden. Jemand hat einen Fehler gemeldet und sogar einen Patch eingereicht:

http://sourceforge.net/tracker/?func=detail&atid=100976&aid=1810273&group_id=976

aber der Curl Maintainer lehnte es ab. Anscheinend funktioniert eine kaputte "-X HEAD" -Option "wie geplant".

- Jamshid


12
2018-03-29 20:59



Um fair zu sein, kann ich der Logik der Ticketantwort folgen: --head liefert uns eine gültige Implementierung einer HEAD-Anfrage, und -X <method> Überschreibt einfach die HTTP-Methode in der Anfrage. - Hank
Ja, das war genau das, was ich brauchte. Ich habe einen fehlerhaften Server, der Inhalte anbietet, wenn er eine HEAD-Anfrage erhält. -X HEAD war der einzige Weg, wie ich es testen konnte, wenn ich versuchte, den Server dazu zu bringen, dem RFC zu folgen - Hashbrown


Von die Dokumente:

-X, --Anfrage

(HTTP) Gibt eine benutzerdefinierte Anforderungsmethode an, die bei der Kommunikation mit dem HTTP-Server verwendet werden soll. Die angegebene Anforderungsmethode wird anstelle der sonst verwendeten Methode verwendet (standardmäßig GET). Lesen Sie die HTTP 1.1-Spezifikation für Details und Erklärungen. Häufige zusätzliche HTTP-Anfragen umfassen PUT und DELETE, aber verwandte Technologien wie WebDAV bietet PROPFIND, COPY, MOVE und mehr.

Normalerweise benötigen Sie diese Option nicht. Alle Arten von GET-, HEAD-, POST- und PUT-Anforderungen werden mit dedizierten Befehlszeilenoptionen aufgerufen.

Diese Option ändert nur das eigentliche Wort in der HTTP-Anfrage verwendet ändert nicht die Art, wie sich Curl verhält. Wenn Sie also zum Beispiel eine HEAD-Anfrage machen wollen, reicht die Verwendung von -X HEAD nicht aus. Sie müssen die Option -I, --head verwenden.

Mit anderen Worten, -X ist für andere Methoden als GET, HEAD, POST und PUT. Zum HEAD benutzen -I.


2
2018-03-02 07:36





Ich begegne dem gleichen Problem beim Schreiben von cpp code auf curl 7.34,

curl_easy_setopt(curl_handle, CURLOPT_CUSTOMREQUEST, "HEAD");

wird lange dort hängen, scheint es auf Körperübertragung warten, bis eine Zeitüberschreitung auftritt. Nach dem Hinzufügen einer neuen Zeile wurde dieses Problem behoben.

curl_easy_setopt(curl_handle, CURLOPT_NOBODY, 1L );

von der Arzt

Mach die Download-Anfrage, ohne den Body zu erhalten

Diese Linie würde zwingen, nicht zu warten.


0
2017-07-19 08:42