Content-Length是什么
Content-Length 是一个实体消息首部,用来指明发送给接受方的消息主体的大小。Content-Length如果存在并且有效地话,则必须和消息内容的传输长度完全一致。否则就会导致异常 (特别地, HTTP1.0中这个字段可有可无)
Content-Length
首部指示出报文中实体主体的字节大小。这个大小是包含了所有内容编码的, 比如,对文本文件进行了gzip
压缩的话,Content-Length
首部指的就是压缩后的大小而不是原始大小。
看下以下几种情况:
Content-Length == 实际长度
const http = require('http');
const server = http.createServer();
server.on('request', (req, res) => {
if(req.url === '/') {
res.setHeader('Content-Type', 'text/plain');
res.setHeader('Content-Length', 10);
res.write("helloworld");
}
});
server.listen(8081, () => {
console.log("成功启动");
});
Content-Length < 实际长度
res.setHeader('Content-Length', 8);
此时输出结果为 hellowor
那后面的字符哪里去了?实际上在http的响应体中直接被截取了。
Content-Length > 实际长度
如果Content-Length 比 实际长度大,服务端/客户端读取到消息结尾后,会等待下一个字节,自然会无响应直到超时。
res.setHeader('Content-Length', 12);
此时浏览器显示结果:
不确定Content-Length的值怎么办
如果不确定Content-Length的值怎么办,此时我们应该使用Transfer-Encoding:chunked
该字段表示分块传输数据,设置这个字段会自动产生两个效果:
- Content-Length 字段会被忽略
- 基于长连接持续推送动态内容
参考资料: