HTTP之Content-Length

在HTTP协议中,有Content-Length的详细解读。Content-Length用于描述HTTP消息实体的传输长度the transfer-length of the message-body。在HTTP协议中,消息实体长度和消息实体的传输长度是有区别,比如说gzip压缩下,消息实体长度是压缩前的长度,消息实体的传输长度是gzip压缩后的长度。
在具体的HTTP交互中,客户端是如何获取消息长度的呢,主要基于以下几个规则:
响应为1xx,204,304相应或者head请求,则直接忽视掉消息实体内容。
如果有Transfer-Encoding,则优先采用Transfer-Encoding里面的方法来找到对应的长度。比如说Chunked模式。
“如果head中有Content-Length,那么这个Content-Length既表示实体长度,又表示传输长度。如果实体长度和传输长度不相等(比如说设置了Transfer-Encoding),那么则不能设置Content-Length。如果设置了Transfer-Encoding,那么Content-Length将被忽视”。这句话翻译的优点饶,其实关键就一点:有了Transfer-Encoding,则不能有Content-Length。
Range传输。不关注,没详细看了:)
通过服务器关闭连接能确定消息的传输长度。(请求端不能通过关闭连接来指明请求消息体的结束,因为这样可以让服务器没有机会继续给予响应)。这种情况主要对应为短连接,即非keep-alive模式。
HTTP1.1必须支持chunk模式。因为当不确定消息长度的时候,可以通过chunk机制来处理这种情况。
在包含消息内容的header中,如果有content-length字段,那么该字段对应的值必须完全和消息主题里面的长度匹配。
“The entity-length of a message is the length of the message-body before any transfer-codings have been applied”
也就是有chunk就不能有content-length 。

其实后面几条几乎可以忽视,简单总结后如下:
1、Content-Length如果存在并且有效的话,则必须和消息内容的传输长度完全一致。(经过测试,如果过短则会截断,过长则会导致超时。)
2、如果存在Transfer-Encoding(重点是chunked),则在header中不能有Content-Length,有也会被忽视。
3、如果采用短连接,则直接可以通过服务器关闭连接来确定消息的传输长度。(这个很容易懂)
结合HTTP协议其他的特点,比如说Http1.1之前的不支持keep alive。那么可以得出以下结论:
1、在Http 1.0及之前版本中,content-length字段可有可无。
2、在http1.1及之后版本。如果是keep alive,则content-length和chunk必然是二选一。若是非keep alive,则和http1.0一样。content-length可有可无。

时间: 2024-10-29 01:19:08

HTTP之Content-Length的相关文章

WCF常见异常-The maximum string content length quota (8192) has been exceeded while reading XML data

异常信息:The maximum string content length quota (8192) has been exceeded while reading XML data 问题:调用第三方的WCF服务,产生上述异常信息 分析: 在公布WCF host端时,要确保host端以及客户端的设置允许一定大小的数据传输. 如果未设置传输大小,maxStringContentLength默认大小为8192. 1)如果第三方服务未设置maxStringContentLength或者设置的maxS

The maximum string content length quota (8192) has been exceeded while reading XML data

原文:The maximum string content length quota (8192) has been exceeded while reading XML data 问题场景:在我们WCF服务发布后,我们要确保服务端以及客户端的配置文件允许合适大小的传输设置.笔者在发布WCF服务时,服务端的绑定未做传输大小的设置(采用了默认,maxStringContentLength默认大小为8192),而我们在传输序列化的数据时,大小超过了这个限制. 读取 XML 数据时,超出最大字符串内容

hiho_1059_string matching content length

题目大意 两个字符串strA和strB(长度最大为2100),他们中按照顺序有一些公共的子串,且公共子串的长度大于等于3,否则不认为是合法的,比如 abcdef 和 abcxcdef, 按照顺序有合法公共子串abc def 或者 cdef.     按照顺序取出一些公共子串,有不同的取法,求这些取法中公共子串长度之和的最大值. 题目分析 字符串长度最大为2100,因此直接枚举搜索会超时,考虑使用动态规划,且复杂度要降到 O(n^3) 甚至 O(n^2). 用状态 dp[i][j][0] 表示st

HttpClient使用详解 (一)

Http协议的重要性相信不用我多说了,HttpClient相比传统JDK自带的URLConnection,增加了易用性和灵活性(具体区别,日后我们再讨论),它不仅是客户端发送Http请求变得容易,而且也方便了开发人员测试接口(基于Http协议的),即提高了开发的效率,也方便提高代码的健壮性.因此熟练掌握HttpClient是很重要的必修内容,掌握HttpClient后,相信对于Http协议的了解会更加深入. 一.简介 HttpClient是Apache Jakarta Common下的子项目,用

Hadoop学习笔记(3) Hadoop文件系统二

1 查询文件系统 (1) 文件元数据:FileStatus,该类封装了文件系统中文件和目录的元数据,包括文件长度.块大小.备份.修改时间.所有者以及版权信息.FileSystem的getFileStatus()方法用于获取文件或目录的FileStatus对象. 例:展示文件状态信息 public class ShowFileStatusTest{ private MiniDFSCluster cluster; private FileSystem fs; @Before public void

通过重建Hosting系统理解HTTP请求在ASP.NET Core管道中的处理流程[下]:管道是如何构建起来的?

在<中篇>中,我们对管道的构成以及它对请求的处理流程进行了详细介绍,接下来我们需要了解的是这样一个管道是如何被构建起来的.总的来说,管道由一个服务器和一个HttpApplication构成,前者负责监听请求并将接收的请求传递给给HttpApplication对象处理,后者则将请求处理任务委托给注册的中间件来完成.中间件的注册是通过ApplicationBuilder对象来完成的,所以我们先来了解一下这究竟是个怎样的对象.[本文已经同步到<ASP.NET Core框架揭秘>之中] [

spring源码阅读之Bean的加载(二)

在正式分析源码之前,先来了解一下SpringBeans里面最核心的两个类  DefaultListableBeanFactory XMLBean继承自 DefaultListableBeanFactory,而 DefaultListableBeanFactory是整个Bean加载的核心部分,是Sprin注册及加载Bean的默认实现,而对于XmlBeanFactory与 DefaultListableBeanFactory不同的地方其实就是在XmlBeanFactory中使用了自定义的XML读取器

js分享3

(function (window) { var _WFCFrame = function () { } // $.extend(_WFCFrame, { // Param: {//公共参数,若为组件私有参数,可定义在compName.Param中 // windcode: '600000.SH', // resizable: getParameter('resizable') != 0, // sortable: getParameter('sortable') != 0, // custTy

如何通过Java程序提交yarn的mapreduce计算任务

由于项目需求,需要通过Java程序提交Yarn的MapReduce的计算任务.与一般的通过Jar包提交MapReduce任务不同,通过程序提交MapReduce任务需要有点小变动,详见以下代码. 以下为MapReduce主程序,有几点需要提一下: 1.在程序中,我将文件读入格式设定为WholeFileInputFormat,即不对文件进行切分. 2.为了控制reduce的处理过程,map的输出键的格式为组合键格式.与常规的<key,value>不同,这里变为了<TextPair,Valu

长短信与短信签名

长短信一般是指超过70个汉字的短信内容,由于长短信需要加增加长短信的协议头(6个字节),所以,每条短信就不是70个了,而是67个汉字[即字符长度是134].6个字节的协力头如: 6位协议头格式:05 00 03 XX MM NN. C++实现如下: char bHead[20] = {0}; sprintf(bHead,"%c%c%c%c%c%c",5,0,3,1,SmsCount,getSmsIndex() +1);  //SmsCount 拆分后短信的数量,getSmsIndex(