如何判断HTTP响应结束(何时可关闭HTTP连接)

news/2025/1/16 1:44:29/

如何判断一个HTTP连接的结束?

case 1:有Content-Length

依据Content-Length判断接收数据完成,来结束连接。

case2: 请求头带Connection字段

2.1 close

表明客户端或服务器想要关闭该网络连接,这是 HTTP/1.0 请求的默认值。

由server负责主动关闭。

2.2 keep-alive

表明客户端想要保持该网络连接打开,HTTP/1.1 的请求默认使用一个持久连接。

由server负责主动关闭。

case3:chunked响应

3.1 终止块

HTTP/1.1 200 OK

Content-Type: text/plain

Transfer-Encoding: chunked

7\r\n

Mozilla\r\n

9\r\n

Developer\r\n

7\r\n

Network\r\n

0\r\n

\r\n

终止块是一个长度为0的分块,即其是0后面跟着两个CRLF。没有Trailer,则可以认为结束。(但chunk内容可能是二进制,所以不能直接匹配最后的两个CRLF,需要先匹配每个chunk的长度,然后再偏移,逐步找到最后结束。

3.2 有trailer

HTTP/1.1 200 OK

Content-Type: text/plain

Transfer-Encoding: chunked

Trailer: Expires

7\r\n

Mozilla\r\n

9\r\n

Developer\r\n

7\r\n

Network\r\n

0\r\n

Expires: Wed, 21 Oct 2015 07:28:00 GMT\r\n

\r\n

如果携带了trailer(消息头中可以搜索到Trailer字段),则在终止块(此时是单个CRLF)后,还需要再寻找一个结束符(两个CRLF)。处理完Trailer之后,可以认为结束。

Trailer头中绝不能有以下三个字段:

      . Transfer-Encoding

      . Content-Length

      . Trailer

case4:  range请求

4.1 206 Partial Content响应

4.1.1 包含一个区间

有Content-Range,但Content-Type中没有multipart。有Content-Length且是resp的完整长度。可以依据content-length来判断结束并做close。

HTTP/1.1 206 Partial Content

Content-Range: bytes 21010-47021/47022

Content-Length: 26012

Content-Type: image/gif

4.1.2包含多个区间

Content-Type中指明了multipart/byteranges

HTTP/1.1 206 Partial Content

Accept-Ranges: bytes

Content-Type: multipart/byteranges; boundary=3d6b6a416f9b5

Content-Length: 385

--3d6b6a416f9b5

Content-Type: text/html

Content-Range: bytes 100-200/1270

eta http-equiv="Content-type" content="text/html; charset=utf-8" />

    <meta name="vieport" content

--3d6b6a416f9b5

Content-Type: text/html

Content-Range: bytes 300-400/1270

-color: #f0f0f2;

        margin: 0;

        padding: 0;

        font-family: "Open Sans", "Helvetica

--3d6b6a416f9b5--

如何判断结束?

1. 要判断是multipart/byteranges,然后获取到boundary

Content-Type: multipart/byteranges; boundary=3d6b6a416f9b5

2. 利用“--boundary”分割每个部分(每个部分内容还有content-range字段标识长度)

最后一个boundary之后,如何判断结束???

在协议层无法判断结束,只能在业务层(比如数据本身是结构化的,可判断结束的)判断。

问题

1、Transfer-Length和Content-Length不能同时出现?

Transfer-Length不是HTTP头字段?是表达动态长度的?

2、Transfer-Length和Transfer-Encoding一定同时出现?

总结

1、有Transfer-Encoding字段(其值不是identity),则Content-Length字段被忽略。

2、一个HTTP请求,如果有消息体,但没有Content-Length,那么server就应该回复400。

If a request contains a message-body and a Content-Length is not given, the server SHOULD respond with 400 (bad request).

3、Transfer-Encoding vs Content-Encoding

Transfer-Encoding 是一个逐跳传输消息首部,即仅应用于两个节点之间的消息传递,而不是所请求的资源本身。要将压缩后的数据应用于整个连接,要使用端到端传输消息首部 Content-Encoding 。


http://www.ppmy.cn/news/350210.html

相关文章

Nginx访问报错 (123: The filename, directory name, or volume label syntax is incorrect)

Windows上用nginx部署本地nodejs前端项目&#xff0c;一直报错&#xff0c;通过查看日志&#xff0c;找到问题所在并解决掉。 error.log 2022/03/24 09:43:27 [crit] 10204#6208: *1 GetFileAttributesEx() "C: ginx\webapp\test" failed (123: The filename, dire…

Nginx访问异常的解决方法

Nginx访问异常的解决方法 项目场景问题描述原因分析及解决方案 项目场景 项目使用前端Vue后端SpringBoot进行开发&#xff0c;今天试图将前端项目打包部署到本地Windows nginx上进行访问。 问题描述 于是&#xff0c;在nginx配置文件nginx.conf中进行了如下的配置&#xff1a…

IBM System x3650 M3_RAID服务器找不到ctrl+H,要进入阵列卡配置界面(webBIOS)

http://www.hugesky.com/showarticle.php?id6208 加电启动&#xff1a; 按 F1 进入 UEFI 选择“System Settings”-“Adapters and UEFI Drivers” “Please press ENTER to compile the list of drivers”&#xff0c; 然候选择“LSI EFI SAS Driver”下面那一行&#xff0…

【dp】UvaLive 6201 6204 6205 6208

6201 Wedding of Sultan https://icpcarchive.ecs.baylor.edu/index.php?optioncom_onlinejudge&Itemid8&pageshow_problem&problem4212 本题只要想到用Stack做的话&#xff0c;会很简单。如果当前的节点已经入过栈了&#xff0c;则pop出来同时给栈顶元素的值加…

Echarts实现系统监控

效果图 页面代码 <!DOCTYPE html> <html style"height: 100%"><head> <meta charset"utf-8"> <title>Echarts</title> <script type"text/javascript"src"http://echarts.baidu.com/gallery/vendo…

Lambda表达式使用详细讲解

目录 1.新思想 1.1函数式编程思想 1.2.函数式接口 2.通往lambda之路 2.1.什么是lambda表示式&#xff1f; 2.2. lambda表示式有哪些特点&#xff1f; 2.3.lambda表示式使用场景 2.4.lambda表示式语法 2.5.Lambda简化写法 2.6.Lambda表达式结构 3.Stream流 3.1概述 …

UVALive 6208

离散DP 由于状态转移需要记录三维&#xff0c;第三维是之前的高度&#xff0c;而这个变量取值只有离散的几个&#xff0c;故用map来存。 不过一开始一直T啊&#xff0c;最后加些剪枝终于过了。。。 #include <iostream> #include <cstdio> #include <string&g…

[LeetCode周赛复盘] 第 89 场双周赛20221015

[LeetCode周赛复盘] 第 89 场双周赛20221015 一、本周周赛总结二、 [Easy] 6208. 有效时间的数目1. 题目描述2. 思路分析3. 代码实现 三、[Medium] 6209. 二的幂数组中查询范围内的乘积1. 题目描述2. 思路分析3. 代码实现 四、[Medium] 6210. 最小化数组中的最大值1. 题目描述…