美文网首页
http chunked编码格式

http chunked编码格式

作者: 伏特加 | 来源:发表于2017-02-04 10:55 被阅读1366次

http的响应数据由下面2部分构成:
响应头 + 数据部分
数据部分的格式由响应头说明
一般情况下,HTTP的响应头包含Content-Length域来指明数据的长度,例如:
有时候,服务器生成HTTP响应时,不好确定响应数据的大小,可能是大文件的下载或后台需要复杂的逻辑处理生成页面,这样一般就使用chunked编码进行传输。使用chunked编码进行传输不用事先说明要传输的页面内容的大小,通过一定的规则指明传输结束。

通常使用chunked编码进行传输的时候,会先将数据进行压缩。HTTP响应头中的Content-Encoding域指明了压缩格式。


当数据很大的时候,还会分多个块(chunk)传输。chunked编码的格式如下:

注意chunk数据长度的单位是字节,不包括后面的\r\n。以一个长度为0的块作为结尾。
把所有的chunk数据部分组合起来存入文件,就是一个标准的gzip压缩文件。

怎么样把所有chunk数据部分提取出来呢?明白了上面的格式,其实就很简单了。
如果我们是通过TCP接收的数据,首先要解决一个问题:找到chunk数据开始的地方,上面提到chunk前面是HTTP响应头。其它先不管,响应头是以连续的\r\n\r\n结尾的,这之后就是响应的数据部分。
假设我们有一个buffer
char *m_contentData;
里面存储着按序收到的所有响应数据。
可以通过如下方式移动到数据部分,即chunked数据开始的地方(下图所示:从A移动到B)

 int n=0;
while(*m_contentData)
{
                 if (*m_contentData=='\r' || *m_contentData=='\n')
                                n++;
                 else
                                n=0;
                 if (n==4)
                                 break;
                m_contentData++;
}

定义char *m_gzipContentData保存gzip数据,可以通过如下方式获取到gzip数据,然后写入文件。

 int len=0;
char ss[10];
char *p = m_contentData;
char *q = m_gzipData;
int gzip_len = 0;
while(1)
{
                sscanf(p, "%s", ss);
                 //read chunk-size
                len = HexToDecimal(ss); //convert hex to decimal
                 if (len == 0) //to chunk end
                                 break;
                p+=2; //read \r\n
                memcpy(q, p, len);
                q += len;
                p += len;
                gzip_len += len;
                p += 2; //read \r\n
}

fwrite(m_gzipData, 1, gzip_len, fp);

相关文章

  • http chunked编码格式

    http的响应数据由下面2部分构成:响应头 + 数据部分数据部分的格式由响应头说明一般情况下,HTTP的响应头包含...

  • chunked编码

    定义 分块传输编码(Chunked transfer encoding)是超文本传输协议(HTTP)中的一种数据传...

  • 网络(三):应用层HTTP

    目录一、字符编码和各个码表二、HTTP 1、HTTP的数据格式  1.1 HTTP请求的数据格式 = 请求行 + ...

  • http chunked和Trailer

    一. 分块编码 分块编码传输应该是和持久连接配合使用的.因为如果不是持久连接的话那也不需要知道长度等信息了,只需要...

  • 小程序设置背景图片

    1、直接使用http 2、Base64编码格式 3、定位

  • Python-06-爬虫--urlbin的用法

    1.urllib.parse.urlencode()方法: 一般HTTP请求提交数据,需要编码成 URL编码格式,...

  • python爬虫----urllib的基本用法

    1.urllib.parse.urlencode()方法: 一般HTTP请求提交数据,需要编码成 URL编码格式,...

  • urllib用法

    1.urllib.parse.urlencode()方法: 一般HTTP请求提交数据,需要编码成 URL编码格式,...

  • HTTP协议 (一) 格式与编码

    无论你用AJAX还是Request库,都可以用很简单的方式向一个服务器发送一个HTTP请求。但是你如果做这样的尝试...

  • webUploader大文件分片上传

    webUploader配置: 主要是开启chunked:true,其他配置见官网:http://fex.baidu...

网友评论

      本文标题:http chunked编码格式

      本文链接:https://www.haomeiwen.com/subject/uvujittx.html