Saya menonton jenis server lucu dari http://www.reddit.com dengan curl -I http://www.reddit.com
ketika saya kira itu curl -X HEAD http://www.reddit.com
akan melakukan hal yang sama. Tetapi kenyataannya tidak.
Saya ingin tahu mengapa.
Inilah yang saya amati menjalankan dua perintah:
curl -I
: berfungsi seperti yang diharapkan, menampilkan tajuk dan ada.curl -X HEAD
: tidak menunjukkan apa-apa dan tampaknya menunggu input pengguna.
Tapi, mengendus dengan tshark
saya melihat perintah kedua sebenarnya mengirimkan permintaan HTML yang sama dan menerima jawaban yang benar, tetapi tidak menunjukkannya dan tidak menutup koneksi.
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
Adakah yang tahu mengapa perbedaan perilaku ini?
curl
http-headers
diff
chmeee
sumber
sumber
Jawaban:
Tampaknya perbedaannya ada pada
Content-Length
header dan bagaimana diperlakukan oleh kedua perintah.Tapi sebelum masuk ke sana,
curl -X HEAD
tidak memberikan output apa pun karena, secara default,curl
tidak mencetak header jika saklar-i
tidak disediakan (tidak diperlukan-I
meskipun).Bagaimanapun,
curl -I
adalah cara yang tepat untuk mengambil header. Hanya meminta header dan menutup koneksi.Di sisi lain
curl -X HEAD -i
akan menunggu pengiriman jumlah byte yang dinyatakan olehContent-Length
. Dalam hal tidakContent-Length
ada tidak ditentukan, saya kira itu akan menunggu beberapa data atau untuk header tertentu.Beberapa contoh yang menunjukkan perilaku ini:
Karena
Content-Length
0, dalam hal ini kedua perintah berperilaku sama. Dan koneksi ditutup setelahnya.Dalam hal ini, tampaknya ada batas waktu (mungkin oleh Varnish), jadi
curl
protes bahwa koneksi ditutup sebelum menerimaContent-Length
jumlah byte.Omong-omong, lihat header X-Bender yang lucu (ditunjukkan pada contoh) dan X-Fry (coba sendiri) :).
sumber
CURLOPT_NOBODY
.Saya pikir ini adalah bug di curl. Jika saya menentukan metode dengan -X, curl harus menangani respons sesuai dengan RFC. Sayangnya, pengelola curl tidak setuju. Seseorang mengajukan bug dan bahkan mengirimkan tambalan:
http://sourceforge.net/tracker/?func=detail&atid=100976&aid=1810273&group_id=976
tapi pengelola ikal menolaknya. Rupanya opsi "-X HEAD" yang rusak adalah "berfungsi seperti yang dirancang".
- Jamshid
sumber
--head
apakah memberi kami implementasi yang valid dari permintaan HEAD, dan-X <method>
cukup mengganti metode HTTP dalam permintaan.-X HEAD
adalah satu-satunya cara saya bisa mengujinya ketika mencoba untuk mendapatkan server untuk mematuhi RFCDari dokumen :
Dengan kata lain,
-X
adalah untuk metode selainGET
,HEAD
,POST
danPUT
. UntukHEAD
penggunaan-I
.sumber
Saya bertemu masalah yang sama ketika menulis kode cpp pada curl 7.34,
akan bertahan lama di sana, sepertinya sedang menunggu transfer tubuh sampai timeout terjadi. setelah menambahkan baris baru, masalah ini teratasi.
dari doc
baris ini akan memaksa curl untuk tidak menunggu.
sumber