http - 是否允许符合标准 (RFC 7230) 的 HTTP 服务器仅响应 400 错误请求?
问题描述
阅读RFC 7230: Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing时出现的一个问题是“符合此标准的最简单的服务器是什么”。在文档中搜索“必须”,在我看来,服务器必须返回的唯一响应是 400 错误,如果请求格式不正确:
服务器必须拒绝任何接收到的请求消息,该消息包含标头字段名称和冒号之间的空格,响应代码为 400(错误请求)。
(3.2.4. 字段解析)
如果请求中存在 Transfer-Encoding 头字段,并且分块传输编码不是最终编码,则无法可靠地确定消息体长度;服务器必须响应 400(错误请求)状态码,然后关闭连接。
(3.3.3. 消息体长度 .3)
如果这是一个请求消息,服务器必须以 400(错误请求)状态码响应,然后关闭连接。
(3.3.3. 消息体长度 .4)
其中。
在某些情况下,标准规定服务器必须返回某个状态码,但它们似乎都被一些更强大的子句变成了可选的,例如:
如果服务器接收到带有“100-continue”期望的 Upgrade 和 Expect 头字段([RFC7231] 的第 5.1.1 节),服务器必须在发送 101(交换协议)响应之前发送 100(继续)响应.
(6.7 升级)
成为可选的
如果服务器希望继续在该连接上使用当前协议,则服务器可以忽略接收到的升级头字段。升级不能用于坚持协议更改。
(6.7 升级)
所有这一切让我相信标准技术上允许仅 400 台服务器。
这对我来说似乎很奇怪,我认为 400 标头意味着请求本身在某种程度上是错误的,并且如果请求格式正确但在其他方面无效,服务器必须以其他一些错误进行响应。
我是否遗漏了标准或其他相关标准中的某些内容,或者是否允许仅 400 个服务器?
(作为旁注,第 2.6 节指出
如果服务器出于任何原因希望拒绝客户端的主要协议版本的服务,它可以发送 505(不支持 HTTP 版本)响应。
这让我相信实际上会允许一个仅限 505 的服务器,虽然很无聊)
解决方案
推荐阅读
- python - keyerror:从 xlsx 导入后的“日期”
- oracle - 在 oracle 中使用 SELECT FOR UPDATE 进行并发编辑是否有替代方法
- python - Python列表索引整数或切片
- javascript - 在 JavaScript 对象(例如“__proto__”)上分配哪些键是不安全的?
- windows - 如何将文本插入预先存在的应用程序?
- r - 根据前一列的值替换多列中的值
- ansible - 使用多个嵌套主机变量时匹配单个自定义主机库存变量
- powershell - 用于将逗号分隔值转换为行并输出为新 CSV 文件的 Powershell 脚本
- ruby - 用于打印类中所有方法调用和返回的 Ruby 模块
- vb.net - VB.NET Linq 查询左外连接左为空