Я смотрел забавный тип сервера с http://www.reddit.com с, curl -I http://www.reddit.com
когда я догадался, что curl -X HEAD http://www.reddit.com
будет то же самое. Но на самом деле это не так.
Мне интересно, почему.
Вот что я наблюдаю, запустив две команды:
curl -I
: работает как положено, выводит заголовок и существует.curl -X HEAD
: ничего не показывает и, кажется, ждет ввода пользователя.
Но, нюхая, tshark
я вижу, что вторая команда фактически отправляет тот же HTML-запрос и получает правильный ответ, но он не показывает его и не закрывает соединение.
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
Есть идеи о том, почему такая разница в поведении?
curl
http-headers
diff
chmeee
источник
источник
Ответы:
Кажется, разница связана с
Content-Length
заголовком и тем, как он обрабатывается обеими командами.Но перед этим
curl -X HEAD
не выдает никаких выходных данных, потому что по умолчаниюcurl
не печатает заголовки, если переключатель-i
не предусмотрен (-I
хотя он и не нужен ).В любом случае,
curl -I
это правильный способ получить заголовки. Это просто попросить заголовок и закрыть соединение.С другой стороны,
curl -X HEAD -i
будет ожидать передачи числа байтов, указанногоContent-Length
. В случае, если нетContent-Length
не указано, я думаю, он будет ждать некоторые данные или для этого конкретного заголовка.Некоторые примеры, демонстрирующие это поведение:
Поскольку
Content-Length
это 0, в этом случае обе команды ведут себя одинаково. И связь закрыта впоследствии.В этом случае, похоже, истекло время ожидания (вероятно, от Varnish), поэтому
curl
протестует, что соединение было закрыто до полученияContent-Length
количества байтов.Кстати, посмотрите на забавные заголовки X-Bender (показано в примере) и X-Fry (попробуйте сами) :).
источник
CURLOPT_NOBODY
.Я думаю, что это ошибка в curl. Если я указываю метод с -X, curl должен обрабатывать ответ в соответствии с RFC. К сожалению, сопровождающий curl не согласен. Кто-то подал ошибку и даже представил патч:
http://sourceforge.net/tracker/?func=detail&atid=100976&aid=1810273&group_id=976
но хранитель локонов отверг это. Видимо, неработающая опция "-X HEAD" - это "работа, как задумано".
--Jamshid
источник
--head
он предоставляет нам правильную реализацию HEAD-запроса и-X <method>
просто переопределяет HTTP-метод в запросе.-X HEAD
это был единственный способ, которым я мог проверить это, пытаясь заставить сервер придерживаться RFCИз документов :
Другими словами,
-X
для других , чем методыGET
,HEAD
,POST
иPUT
. ДляHEAD
использования-I
.источник
Я сталкиваюсь с той же проблемой при написании кода cpp на curl 7.34,
будет зависать там долгое время, кажется, он ожидает переноса тела, пока не произойдет тайм-аут после добавления новой строки эта проблема решена.
из документа
эта линия заставит локон не ждать.
источник