在有時(shí)服務(wù)器生成HTTP回應(yīng)是無法確定消息大小的,這時(shí)用Content-Length就無法事先寫入長度,而需要實(shí)時(shí)生成消息長度,這時(shí)服務(wù)器一般采用Chunked編碼。
在進(jìn)行Chunked編碼傳輸時(shí),在回復(fù)消息的頭部有transfer-coding并定為Chunked,表示將用Chunked編碼傳輸內(nèi)容。采用以下方式編碼:
Chunked-Body=*chunk
"0"CRLF
footer
CRLF
chunk=chunk-size[chunk-ext]CRLF
chunk-dataCRLF
hex-no-zero=<HEXexcluding"0">
chunk-size=hex-no-zero*HEX
chunk-ext=*(";"chunk-ext-name["="chunk-ext-value])
chunk-ext-name=token
chunk-ext-val=tokenquoted-string
chunk-data=chunk-size(OCTET)
footer=*entity-header
編碼使用若干個(gè)Chunk組成,由一個(gè)標(biāo)明長度為0的chunk結(jié)束,每個(gè)Chunk有兩部分組成,第一部分是該Chunk的長度和長度單位(一般不寫),第二部分就是指定長度的內(nèi)容,每個(gè)部分用CRLF隔開。在最后一個(gè)長度為0的Chunk中的內(nèi)容是稱為footer的內(nèi)容,是一些沒有寫的頭部內(nèi)容。
下面給出一個(gè)Chunked的解碼過程(RFC文檔中有)
length:=0
readchunk-size,chunk-ext(ifany)andCRLF
while(chunk-size>0){
readchunk-dataandCRLF
appendchunk-datatoentity-body
length:=length+chunk-size
readchunk-sizeandCRLF
}
readentity-header
while(entity-headernotempty){
appendentity-headertoexistingheaderfields
readentity-header
}
Content-Length:=length
Remove"chunked"fromTransfer-Encoding
下一次將會討論一些小問題,如POST方法的數(shù)據(jù)傳輸?shù)取?br /> 最后,還有一點(diǎn)要說的是,似乎NetAnt的一個(gè)版本不支持Chunked編碼,會顯示無法確定內(nèi)容長度,或許是版本太低的緣故,假如你也碰到這種問題,可以改用NetVampire或其它支持Chunked編碼的下載程序試試。
新聞熱點(diǎn)
疑難解答
圖片精選