2017-06-14 25 views
1

TL做出含義;博士「什麼將HTTP標頭的結尾和HTTP響應主體的開始之間的字節0x330x390x0d0x0a指什麼?」看明白的HTTP請求的兩個字節,捲曲--trace

我正在使用徹底出色的libcurl向各種第三方終端發出HTTP請求。這些端點不在我的控制之下,並且需要實施規範。爲了幫助調試和開發這些端點我已經實現了文本輸出功能,你可能會看到,如果你使用curl.setopt(pycurl.VERBOSE, 1)curl.setopt(pycurl.DEBUGFUNCTION, debug_function)

這使得從與-v標誌在命令行卷曲請求已被偉大的工作,但最近我碰到一個請求,我的調試功能不能像curl的調試輸出那樣處理。我相信是由於我不瞭解HTTP規範。

如果從命令行使用--verbose發出curl請求,我會返回以下內容。

# redacted headers 
< Via: 1.1 vegur 
< 
{"code":"InvalidCredentials","message":"Bad credentials"}* 

Connection #0 to host redacted left intact 

如果做同樣的請求與--trace返回

0000: 56 69 61 3a 20 31 2e 31 20 76 65 67 75 72 0d 0a Via: 1.1 vegur.. 
<= Recv header, 2 bytes (0x2) 
0000: 0d 0a           .. 
<= Recv data, 1 bytes (0x1) 
0000: 33            3 
<= Recv data, 62 bytes (0x3e) 
0000: 39 0d 0a 7b 22 63 6f 64 65 22 3a 22 49 6e 76 61 9..{"code":"Inva 
0010: 6c 69 64 43 72 65 64 65 6e 74 69 61 6c 73 22 2c lidCredentials", 
0020: 22 6d 65 73 73 61 67 65 22 3a 22 42 61 64 20 63 "message":"Bad c 
0030: 72 65 64 65 6e 74 69 61 6c 73 22 7d 0d 0a  redentials"}.. 
<= Recv data, 1 bytes (0x1) 
0000: 30            0 
<= Recv data, 4 bytes (0x4) 
0000: 0d 0a 0d 0a          .... 
== Info: Connection #0 to host redacted left intact 

我測試過不包含字節在響應身體這些部位,所以我所有的HTTP客戶端庫以下猜測這些是我不知道的HTTP規範的一部分,但我找不到對它們的引用,我不知道如何處理它們。

如果它有助於我認爲捲曲使用該https://github.com/curl/curl/blob/master/src/tool_cb_dbg.c建設輸出的第一個例子位,我不是一個真正的C/C++程序員,我一直無法進行反向工程的邏輯。

有誰知道這些字節是什麼?

回答

2

0d 0aASCII control characters分別代表carriage returnline feed。 CRLF用於HTTP到mark the end of a header field(這裏有一些歷史性的例外,你不應該擔心)。雙CRLF應該是mark the end of the fields section的一條消息。

你觀察到的33 39在ascii中有「39」。這是chunk size indicator - 作爲十六進制數字處理。響應頭中存在Transfer-Encoding: chunked可能會支持這一點。

+0

Thanks @DaSourcerer。我相信你是對的。 「Transfer-Encoding:chunked」頭文件存在,我不認爲這是一個巧合,0x39是十進制的57,它是響應主體的長度。好一個。 – squareproton

+0

哦,我的。感謝@DanielStenberg糾正我:是的,塊的大小確實是ASCII編碼的十六進制。我不知何故陷入二進制。 – DaSourcerer