Soru Curl -I ve curl -X HEAD` arasındaki fark


Komik sunucu türünü izliyordum http://www.reddit.com ile curl -I http://www.reddit.com bunu tahmin ettiğimde curl -X HEAD http://www.reddit.com aynısını yapardı. Ama aslında öyle değil.

Nedenini merak ediyorum.

İki komutu çalıştırarak gözlemlediğim şey bu:

  • curl -I: beklendiği gibi çalışır, üstbilgiyi verir ve var olur.

  • curl -X HEAD: Hiçbir şey göstermiyor ve kullanıcı girişi için beklemek gibi görünüyor.

Ama, koklayarak tshark İkinci komutun aslında aynı HTML sorgusunu gönderdiğine ve doğru cevabı aldığını görüyorum, ancak bunu göstermiyor ve bağlantıyı kapatmıyor.

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

Davranıştaki bu farklılığın neden olduğu hakkında bir fikrin var mı?


54
2018-05-10 08:49


Menşei


Ayrıca bakınız daniel.haxx.se/blog/2015/09/11/unnecessary-use-of-curl-x - Abbafei


Cevaplar:


Bu farkın Content-Length başlık ve her iki komut tarafından nasıl ele alınır.

Ama buna girmeden önce, curl -X HEAD herhangi bir çıktı vermiyor çünkü varsayılan olarak curl anahtar varsa üstbilgi yazdırmaz -i sağlanmadı (gerekli değil -I gerçi).

Her durumda, curl -I üstbilgileri getirmenin doğru yolu. Sadece başlık için sor ve bağlantıyı kapat.

Diğer yandan curl -X HEAD -i tarafından belirtilen bayt sayısının iletimini bekleyecektir Content-Length. Durumda hayır Content-Length belirtilmemişse, bazı veriler için veya belirli bir başlık için bekleyeceğini tahmin ediyorum.

Bu davranışı gösteren bazı örnekler:

$ 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

Çünkü Content-Length 0, bu durumda her iki komut da aynı davranır. Ve sonra bağlantı kapatıldı.

$ 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

Bu durumda, bir zaman aşımı (muhtemelen Vernik tarafından) gibi görünüyor, yani curl Bağlantıyı almadan önce bağlantının kapatıldığını protesto eder Content-Length bayt sayısı.

Bu arada, komik X-Bender'a (örnekte gösterilmiştir) ve X-Fry'a bakın (kendiniz için deneyin) başlıklar :).


54
2018-05-12 06:49



Başka birinin buna bakması istendiğinde: PHP'nin curl kütüphanesinde ayarlama seçeneği CURLOPT_NOBODY. - Matthew Caruana Galizia


Bence bu kıvrımdaki bir böcek. -X ile bir yöntem belirtirsem, curl RFC'ye göre yanıtı işlemelidir. Ne yazık ki, kıvrımın koruyucusu kabul etmiyor. Birisi bir hata yaptı ve hatta bir yama gönderdi:

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

ama curl bakıcısı bunu reddetti. Görünüşe göre kırık bir "-X HEAD" seçeneği "tasarlandığı gibi çalışıyor".

--Jamshid


12
2018-03-29 20:59



Adil olmak gerekirse, bilet yanıtının mantığını takip edebilirim: --head BAŞVURULARIN BAŞVURULARININ UYGULANMASI -X <method> istekte HTTP yöntemini geçersiz kılar. - Hank
evet, bu aslında ihtiyacım olan şeydi. HEAD isteği verildiğinde içerik sunan bir buggy sunucum var. -X HEAD sunucunun RFC'ye bağlanmasını sağlamaya çalışırken test edebilmemin tek yolu buydu - Hashbrown


itibaren dokümanlar:

-X, - istek

(HTTP) HTTP sunucusu ile iletişim kurarken kullanılacak özel bir istek yöntemini belirtir. Aksi halde kullanılan (GET'e varsayılan) yöntem yerine belirtilen istek yöntemi kullanılacaktır. Ayrıntılar ve açıklamalar için HTTP 1.1 spesifikasyonunu okuyun. Ortak ek HTTP istekleri PUT ve DELETE içerir, ancak WebDAV gibi ilgili teknolojiler PROPFIND, COPY, MOVE ve daha fazlasını sunar.

Normalde bu seçeneğe ihtiyacınız yoktur. Her türlü GET, HEAD, POST ve PUT istekleri, özel komut satırı seçenekleri kullanılarak çağrılır.

Bu seçenek sadece gerçek kelimeyi değiştirir HTTP isteğinde kullanılır, kıvrılma davranış şeklini değiştirmez. Örneğin, eğer uygun bir HEAD isteği yapmak istiyorsanız, -X HEAD kullanmak yeterli olmayacaktır. -I, --head seçeneğini kullanmanız gerekir.

Diğer bir deyişle, -X dışındaki yöntemler içindir GET, HEAD, POST ve PUT. İçin HEAD kullanım -I.


2
2018-03-02 07:36





Curpp 7.34 üzerinde cpp kodu yazarken aynı sorunu karşılıyoruz,

curl_easy_setopt(curl_handle, CURLOPT_CUSTOMREQUEST, "HEAD");

Orada uzun süre asılı kalacak, zaman aşımı olana kadar vücut aktarımını bekliyor gibi görünüyor. Yeni bir satır ekledikten sonra bu sorun çözülüyor.

curl_easy_setopt(curl_handle, CURLOPT_NOBODY, 1L );

itibaren doktor

Vücudu almadan indirme isteğini yapmak

Bu çizgi beklememeyi zorlar.


0
2017-07-19 08:42