I było oglądać śmieszne typ serwera z http://www.reddit.com ze curl -I http://www.reddit.com
kiedy przypuszczał, że curl -X HEAD http://www.reddit.com
zrobi to samo. Ale tak nie jest.
Jestem ciekawy dlaczego.
Oto, co obserwuję, uruchamiając dwa polecenia:
curl -I
: działa zgodnie z oczekiwaniami, wyświetla nagłówek i istnieje.curl -X HEAD
: nic nie pokazuje i wydaje się czekać na dane wejściowe użytkownika.
Ale węsząc z tshark
, widzę, że drugie polecenie faktycznie wysyła to samo zapytanie HTML i otrzymuje poprawną odpowiedź, ale nie pokazuje go i nie zamyka połączenia.
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
Masz pojęcie o tym, dlaczego ta różnica w zachowaniu?
curl
http-headers
diff
chmeee
źródło
źródło
Odpowiedzi:
Wygląda na to, że różnica dotyczy
Content-Length
nagłówka i sposobu, w jaki są traktowane przez oba polecenia.Ale przed przejściem do tego
curl -X HEAD
nie daje żadnych wyników, ponieważ domyślniecurl
nie drukuje nagłówków, jeśli przełącznik-i
nie jest dostępny (-I
choć nie jest potrzebny ).W każdym razie
curl -I
jest to właściwy sposób na pobranie nagłówków. Wystarczy poprosić o nagłówek i zamknąć połączenie.Z drugiej strony
curl -X HEAD -i
będzie czekać na przesłanie liczby bajtów podanej przezContent-Length
. W przypadku, gdyContent-Length
nie podano nie, chyba będzie czekać na jakieś dane lub na ten konkretny nagłówek.Kilka przykładów pokazujących to zachowanie:
Ponieważ
Content-Length
wynosi 0, w tym przypadku oba polecenia zachowują się tak samo. Połączenie zostaje następnie zamknięte.W tym przypadku wydaje się, że upłynął limit czasu (prawdopodobnie przez Varnish), więc
curl
protestuje, że połączenie zostało zamknięte przed otrzymaniemContent-Length
liczby bajtów.Nawiasem mówiąc, spójrz na zabawne nagłówki X-Bender (pokazane w przykładzie) i X-Fry (spróbuj sam) nagłówki :).
źródło
CURLOPT_NOBODY
.Myślę, że to błąd w zwijaniu. Jeśli podam metodę z -X, curl powinien obsłużyć odpowiedź zgodnie z RFC. Niestety opiekun curl się nie zgadza. Ktoś zgłosił błąd, a nawet przesłał łatkę:
http://sourceforge.net/tracker/?func=detail&atid=100976&aid=1810273&group_id=976
ale opiekun loków odrzucił to. Najwyraźniej zepsuta opcja „-X HEAD” działa „zgodnie z przeznaczeniem”.
- Jamshid
źródło
--head
zapewnia nam prawidłową implementację żądania HEAD i-X <method>
po prostu zastępuje metodę HTTP w żądaniu.-X HEAD
był to jedyny sposób, w jaki mogłem to przetestować, próbując zmusić serwer do przestrzegania RFCZ dokumentów :
Innymi słowy,
-X
jest dla metod innych niżGET
,HEAD
,POST
iPUT
. DoHEAD
użytku-I
.źródło
Ten sam problem występuje podczas pisania kodu CPP w curl 7.34,
zawiesi się tam długo, wygląda na to, że czeka na przeniesienie ciała, aż dojdzie do limitu czasu. po dodaniu nowej linii problem został rozwiązany.
z dokumentu
ta linia zmusiłaby curl do nie czekania.
źródło