http協議中content-length 以及chunked編碼分析
0.序
1.http/1.1協議中與chunked編碼的相關欄位
1)Entity Body 2)Content-length 3)Message Length 4)content-length欄位的作用2.chunked編碼 1)定義 2)說明: 3)格式: 4)chunked編碼的程式化表示 |
訊息實體長度:即Entity-length,壓縮之前的message-body的長度 訊息實體的傳輸長度:Content-length,壓縮後的message-body的長度。
在具體的HTTP互動中,客戶端是如何獲取訊息長度的呢,主要基於以下幾個規則:
|
4)chunked編碼的程式化表示 (1)c++ 詳見http://wuhua.iteye.com/blog/673841 (2)c語言Chunk編碼的格式如下:
Chunked-Body = *chunk
“0″ CRLF
footer
CRLF
chunk = chunk-size [ chunk-ext ] CRLF
chunk-data CRLFhex-no-zero = <HEX excluding “0″>
chunk-size = hex-no-zero *HEX
chunk-ext = *( “;” chunk-ext-name [ "=" chunk-ext-value ] )
chunk-ext-name = token
chunk-ext-val = token | quoted-string
chunk-data = chunk-size(OCTET)footer = *entity-header
即Chunk編碼由四部分組成: 1、0至多個chunk塊 ,2、“0″ CRLF ,3、footer ,4、CRLF . 而每個chunk塊由:chunk-size、chunk-ext(可選)、CRLF、chunk-data、CRLF組成。
char * chunkpart1 = "42\r\n" ; char * chunkpart2 = tmpuchar_body_data ; char * chunkpart3 = "\r\n0\r\n\r\n" ; int chunklen = 0; chunklen = strlen(chunkpart1) + strlen(chunkpart2) + strlen(chunkpart3); char * chunk = (char*)ngx_pcalloc(r->pool,chunklen+1); strncpy(chunk,chunkpart1,strlen(chunkpart1)); strncpy((chunk+strlen(chunkpart1)),chunkpart2, strlen(chunkpart2) ); strncpy((chunk+strlen(chunkpart1) + strlen(chunkpart2) ),chunkpart3, strlen(chunkpart3)); |