Jetty 在格式错误的 HTTP POST 标头上返回“HTTP/1.1 400 Bad Request”。这是预期的吗?

Posted

技术标签:

【中文标题】Jetty 在格式错误的 HTTP POST 标头上返回“HTTP/1.1 400 Bad Request”。这是预期的吗?【英文标题】:Jetty returning "HTTP/1.1 400 Bad Request" on malformed HTTP POST header. Is this expected? 【发布时间】:2013-10-22 14:51:56 【问题描述】:

http post header 中有空格会导致请求错误吗??

我在其中一个请求中看到了这一点: 内容类型 "text/xml; c harset=utf-8"

我收到一个 HTTP/1.1 400 错误请求

但是如果发布相同的请求 内容类型 "text/xml; charset=utf-8"

即在字符集中没有空格它可以工作。

在我的实现中,我没有进行任何验证。 所以我假设我的 Jetty 服务器抛出了一个错误的请求,因为 charset 中有一个空格??

我是对的还是我的解释错了。

谢谢!!

【问题讨论】:

【参考方案1】:

是的,有一个放置空间的地方应该会导致错误的请求。

HTTP 1.1 是由标准定义的协议。通过参考标准文档,可以确定什么是有效请求,什么不是有效请求。

您可以在 RFC 2616 - Hypertext Transfer Protocol -- HTTP/1.1 找到 HTTP/1.1 的标准,并且您可能特别想查看 14.17 Content-Type 和 3.7 Media Types 部分。

基本上,通过将空格插入"charset",您正在创建一个无效的 HTTP 请求,因为该协议不理解 "c""harset" 部分。在该上下文中,这些未定义为有效文本。

此外,虽然协议知道什么看起来是有效的,什么是无效的,但它还不够聪明,无法推断出如何修复这种简单的错字。因此,服务器响应“400 Bad Request”是合适的并且符合协议标准。对于它的价值,您还可以找到HTTP status codes in the RFC。状态码400 Bad Request表示:

由于格式错误,服务器无法理解请求 句法。客户端不应该重复请求 修改。

即不要那样做。 :)

【讨论】:

以上是关于Jetty 在格式错误的 HTTP POST 标头上返回“HTTP/1.1 400 Bad Request”。这是预期的吗?的主要内容,如果未能解决你的问题,请参考以下文章

Zend_Http_Client - 为啥我的 POST 请求发送错误的内容类型标头?

用于分块编码 POST 的 HTTP 标头 - 错误 411

我应该如何配置我的标头以对 APNs 进行 HTTP/2 POST 以避免“收到重复的伪标头字段”错误?

使用 Angular 7 使用 HTTP API 进行 POST 和命令错误标头丢失

jquery $.ajax 自定义 http 标头问题

正在生成格式错误的标头