HTTP协议,头部不存在 Content-Length 时

本文探讨了HTTP响应头中Content-Length和Transfer-Encoding字段的作用及应用场景,特别是当服务器未提供Content-Length时,如何通过Transfer-Encoding:chunked来传递数据,并讨论了数据压缩的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 参考 Tomcat 中响应头信息(Http Response Header) Content-Length 和 Transfer-Encoding 之种种

http://blog.youkuaiyun.com/shootyou/article/details/6135669 

此前遇到这个问题,HTTP头部没有Content-Length字段。一位朋友通过修改服务器的配置解决。

他使用的方法是:

this.getResponse().setBufferSize(402800); 

        然而,当他们安装新的服务器时,又使用了默认的配置,程序再次出现故障。为了解决这个问题,最好的方法自然是在客户端处理。于是:大致总结如下:

        如果没有Content-Length,而改用Tansfer-Encoding:chunke,则:

        以"\r\n\r\n“作为HTTP头部的结束符号。其后,追加的是16进制的数据正文长度。接着是"\r\n“。接着是数据正文,再接着是"\r\n0\r\n\r\n"。即:

"\r\n\r\n“+十六进制的长度(字符串)+"\r\n“+数据正文+"\r\n0\r\n\r\n"

 

        但这不是绝对的。比如,我的HTML内容是"a 0",那么,没有指定长度时,客户端应该收到"\r\n\r\n3\r\na 0\r\n0\r\n\r\n",而事实上结果可能不是这样,而是"\r\n\r\n3\r\na 0\r\n\r\n"。这点就比较恼人了。——我的处理方法是:假设收到的数据经过计算,发现内容长度(例如3个字节)都已传送完毕,就认为接收完毕。至于后面是"\r\n0\r\n\r\n"还是"\r\n\r\n",都不是我们所关心的问题。

 

        然而,这也不是绝对的!因为上面的数据是未经过压缩的!有些HTTP服务器支持数据压缩,比如“Content-Encoding: gzip”,这时候,收到的数据,首先是根据上面的方法取得真实长度和数据内容,然后解压缩。

### HTTP Content-Length 头部字段的含义 `Content-Length` 是 HTTP 协议中的一个头部字段,用于指定消息主体(即 body)的长度,单位为字节。接收方可以通过该字段得知需要读取的数据量,从而能够正确解析整个消息[^2]。 当 `Content-Length` 的值为 3874 ,表示当前 HTTP 请求或响应的消息主体部分总共有 3874 字节的数据[^1]。这意味着客户端或服务器在接收到这 3874 字节之后,就可以认为已经完成了对该消息主体的读取操作。 如果未提供 `Content-Length` 或者其值与实际数据长度符,则可能会引发一系列问题。例如,在持久连接(Keep-Alive)的情况下,如果没有明确指示消息体结束的位置,可能导致后续通信混乱,甚至出现粘包现象[^3]。 另外需要注意的是,并非所有场景下都需要设置 `Content-Length`。对于某些动态生成的内容或者流媒体传输而言,可能采用分块编码(Chunked Transfer Encoding),此无需提前声明具体的长度信息;而对于那些无法预知大小且支持分块传输的情况,则通常会关闭持续链接并依靠断开 TCP 连接的方式来表明传输完成状态[^4]。 ```python # 示例 Python 代码展示如何计算文件大小作为 Content-Length 值 def get_content_length(file_path): with open(file_path, 'rb') as file: data = file.read() content_length = len(data) return content_length file_size_in_bytes = get_content_length('example.txt') print(f"The size of the file is {file_size_in_bytes} bytes.") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值