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
왜 이런 행동의 차이에 대한 아이디어가 있습니까?
답변
차이점은 Content-Length
헤더와 관련이 있으며 두 명령으로 처리되는 방식입니다.
그러나 그것에 들어가기 전에 스위치 가 제공되지 않으면 (필요 하지는 않지만) curl -X HEAD
기본적으로 curl
헤더를 인쇄하지 않기 때문에 출력을 제공 하지 않습니다 .-i
-I
어쨌든 curl -I
헤더를 가져 오는 올바른 방법입니다. 헤더를 요청하고 연결을 닫습니다.
반면에로 표시된 curl -X HEAD -i
바이트 수의 전송을 기다립니다 Content-Length
. no Content-Length
를 지정하지 않으면 일부 데이터 또는 특정 헤더를 기다릴 것입니다.
이 동작을 보여주는 몇 가지 예 :
$ 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
때문에 Content-Length
0,이 경우 두 명령은 동일한 동작합니다. 연결은 나중에 닫힙니다.
$ 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
이 경우 시간 초과 (아마도 Varnish에 의한)가있는 것으로 보이므로 바이트 수를 curl
받기 전에 연결이 닫 혔음을 항의합니다 Content-Length
.
그건 그렇고, 재미있는 X-Bender (예제 참조)와 X-Fry (직접 시도해보십시오) 헤더를보십시오 :).
답변
나는 이것이 컬의 버그라고 생각합니다. -X로 메소드를 지정하면 curl은 RFC에 따라 응답을 처리해야합니다. 불행히도 컬 관리자는 동의하지 않습니다. 누군가 버그를 제기하고 패치를 제출했습니다.
http://sourceforge.net/tracker/?func=detail&atid=100976&aid=1810273&group_id=976
그러나 컬 관리자는 그것을 거부했습니다. 깨진 “-X HEAD”옵션은 “디자인 된대로 작동”하는 것 같습니다.
-잼 시드
답변
에서 워드 프로세서 :
-X,-요청
(HTTP) HTTP 서버와 통신 할 때 사용할 사용자 정의 요청 방법을 지정합니다. 달리 지정된 방법 대신 지정된 요청 방법이 사용됩니다 (기본값은 GET). 자세한 내용과 설명은 HTTP 1.1 사양을 읽으십시오. 일반적인 추가 HTTP 요청에는 PUT 및 DELETE가 포함되지만 WebDAV와 같은 관련 기술은 PROPFIND, COPY, MOVE 등을 제공합니다.
일반적으로이 옵션은 필요하지 않습니다. 모든 종류의 GET, HEAD, POST 및 PUT 요청은 전용 명령 줄 옵션을 사용하여 호출됩니다.
이 옵션 은 HTTP 요청에 사용 된 실제 단어 만 변경하고 curl 동작 방식을 변경하지는 않습니다 . 예를 들어 적절한 HEAD 요청을하려면 -X HEAD를 사용하면 충분하지 않습니다. -I, –head 옵션을 사용해야합니다.
즉, -X
이외의 방법입니다 GET
, HEAD
, POST
와 PUT
. 위해 HEAD
사용 -I
.
답변
curl 7.34에서 cpp 코드를 작성할 때도 같은 문제가 발생합니다.
curl_easy_setopt(curl_handle, CURLOPT_CUSTOMREQUEST, "HEAD");
시간이 초과 될 때까지 신체 전이를 기다리는 것 같습니다. 줄 바꿈을 추가하면이 문제가 해결됩니다.
curl_easy_setopt(curl_handle, CURLOPT_NOBODY, 1L );
의사 로부터
본문을 얻지 않고 다운로드 요청을 수행
이 줄은 컬이 기다리지 않도록 강제합니다.