正在做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

解决方案 »

  1.   

    浏览器访问一个页面的时候,这个页面返回的数据经过CHUNKED编码,
    经过抓包查看,数据长度是900字节多一点,在浏览器中显示的是一个图片,
    如果把这个图片存到硬盘上,发现这个图片的大小是2K多一点,50X20的一
    个位图,如果我编程直接吧这个返回的数据存成一个BMP文件,那么这个文
    件的大小是900多字节,有时候能正确地显示图片内容,有时候图片就发生
    变形(用WINDOWS的图片查看器查看),如果用PHOTOSHOP编辑会提示无法
    解析文件内容。
    我的问题是,服务器返回的数据到浏览器之后再到我存储的硬盘上,这中间
    的2个过程分别发生了哪些变化,为什么数据的长度会发生改变,如果我自己
    编程来实现HTTP协议,下载并显示这个图片,在这两个过程中需要注意的有哪
    些问题。RFC我看了一下,CHUNK的解码过程大概就是去掉每个包的编码长度行,取出包的
    内容,然后把每个包的内容拼凑起来,但是这个过程不会有任何数据长度的变化,
    甚至只变短不变长。实在是很困惑,希望哪位达人能够指点一二。
      

  2.   

    两点注意:1、chunk长度是ASCII码表示的16进制。
              2、chunk编码有时会和gzip压缩编码同时使用,chunk解密后,还要进行gzip解码。
      

  3.   

    此题得解!!结论就是它娘的IE是骗人的,回来的chunked部分根本就是个jpg文件的的完整数据,这个是我在用firefox的时候发现的。