正在做HTTP协议方面的东西,遇到这个问题,
RFC和一些文章都看过了,不是很明白,哪位
前辈做过这方面的东西能否指点一二,在下不胜感激最好能有C++的实现
我找到的例子不知道是什么代码,看不太懂附:我找到的说明如下在有时服务器生成HTTP回应是无法确定消息大小的,这时用Content-Length就无法事先写入长度,而需要实时生成消息长度,这时服务器一般采用Chunked编码。
在进行Chunked编码传输时,在回复消息的头部有transfer-coding并定为Chunked,表示将用Chunked编码传输内容。采用以下方式编码:
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=token|quoted-string
chunk-data=chunk-size(OCTET) footer=*entity-header
编码使用若干个Chunk组成,由一个标明长度为0的chunk结束,每个Chunk有两部分组成,第一部分是该Chunk的长度和长度单位(一般不写),第二部分就是指定长度的内容,每个部分用CRLF隔开。在最后一个长度为0的Chunk中的内容是称为footer的内容,是一些没有写的头部内容。
下面给出一个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
RFC和一些文章都看过了,不是很明白,哪位
前辈做过这方面的东西能否指点一二,在下不胜感激最好能有C++的实现
我找到的例子不知道是什么代码,看不太懂附:我找到的说明如下在有时服务器生成HTTP回应是无法确定消息大小的,这时用Content-Length就无法事先写入长度,而需要实时生成消息长度,这时服务器一般采用Chunked编码。
在进行Chunked编码传输时,在回复消息的头部有transfer-coding并定为Chunked,表示将用Chunked编码传输内容。采用以下方式编码:
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=token|quoted-string
chunk-data=chunk-size(OCTET) footer=*entity-header
编码使用若干个Chunk组成,由一个标明长度为0的chunk结束,每个Chunk有两部分组成,第一部分是该Chunk的长度和长度单位(一般不写),第二部分就是指定长度的内容,每个部分用CRLF隔开。在最后一个长度为0的Chunk中的内容是称为footer的内容,是一些没有写的头部内容。
下面给出一个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
经过抓包查看,数据长度是900字节多一点,在浏览器中显示的是一个图片,
如果把这个图片存到硬盘上,发现这个图片的大小是2K多一点,50X20的一
个位图,如果我编程直接吧这个返回的数据存成一个BMP文件,那么这个文
件的大小是900多字节,有时候能正确地显示图片内容,有时候图片就发生
变形(用WINDOWS的图片查看器查看),如果用PHOTOSHOP编辑会提示无法
解析文件内容。
我的问题是,服务器返回的数据到浏览器之后再到我存储的硬盘上,这中间
的2个过程分别发生了哪些变化,为什么数据的长度会发生改变,如果我自己
编程来实现HTTP协议,下载并显示这个图片,在这两个过程中需要注意的有哪
些问题。RFC我看了一下,CHUNK的解码过程大概就是去掉每个包的编码长度行,取出包的
内容,然后把每个包的内容拼凑起来,但是这个过程不会有任何数据长度的变化,
甚至只变短不变长。实在是很困惑,希望哪位达人能够指点一二。
2、chunk编码有时会和gzip压缩编码同时使用,chunk解密后,还要进行gzip解码。