java - 如何让 Jetty 返回错误响应而不是假设 HTTP/0.9 请求?

标签 java servlets jetty embedded-jetty

损坏的 HTTP 客户端向我们基于 Jetty 的 HTTP 服务器发送了一些请求,其中 URL 中包含换行符。 Jetty 将此视为 HTTP/0.9 请求,在换行符处截断 URL,忽略请求 header ,并发回不带 header 或状态行的响应。

我相信根据 spec 这基本上是正确的,尽管 Jetty 不需要 CRLF 并且很乐意对 GET 以外的请求执行此操作。但是newer specs请注意,HTTP/0.9 请求主要表明客户端感到困惑。在我们的例子中,如果发送错误消息,客户(和我们)可以避免一些困惑的故障排除。

如何让 Jetty 对 URL 中带有换行符的请求返回错误响应?我很乐意使用 Jetty 级配置或 Web 应用程序级代码。

最佳答案

首先,support for HTTP/0.9 has been completely removed in Jetty 9.3+ .

让我们看看行为是什么......

Jetty 发行版 9.2.7.v20150116,运行演示库:

正常 HTTP/1.0 请求:

$ printf "GET / HTTP/1.0\r\n\r\n" | nc localhost 8080
HTTP/1.1 200 OK
Set-Cookie: visited=yes
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Accept-Ranges: bytes
Content-Type: text/html
Last-Modified: Sat, 17 Jan 2015 00:25:03 GMT
Content-Length: 2773
Server: Jetty(9.2.7.v20150116)

<html xmlns=\ "http://www.w3.org/1999/xhtml\" xml:lang=\"en\">

那里有 header ,看起来也像 HTTP/1.0 响应 header 。

正常 HTTP/1.1 请求:

$ printf "GET / HTTP/1.1\r\nHost: localhost\r\nConnection: close\r\n\r\n" | nc localhost 8080
HTTP/1.1 200 OK
Set-Cookie: visited=yes
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Accept-Ranges: bytes
Content-Type: text/html
Last-Modified: Sat, 17 Jan 2015 00:25:03 GMT
Content-Length: 2773
Connection: close
Server: Jetty(9.2.7.v20150116)

<html xmlns=\ "http://www.w3.org/1999/xhtml\" xml:lang=\"en\">

看起来也很正常。 甚至包括 HTTP/1.1 特定 header 。

现在让我们尝试使用嵌入的 CRLF 的 HTTP/1.0:

 $ printf "GET /\r\nHTTP/1.0\r\n\r\n" | nc localhost 8080
 <html xmlns=\ "http://www.w3.org/1999/xhtml\" xml:lang=\"en\">

没有响应 header 。

为什么会发生这种情况?

嗯,Jetty 无法确定 HTTP 版本,因此它没有可以响应的有效 header 集。所以它的响应没有 header 。令人惊讶的是 1.0 之前的 HTTP 规范的行为方式。

现在让我们尝试 Jetty Distribution 9.3.x,以及具有相同 CRLF 问题的演示基础配置。

$ printf "GET /\r\nHTTP/1.0\r\n\r\n" | nc localhost 8080
HTTP/1.1 400 HTTP/0.9 not supported
Content-Length: 0
Connection: close
Server: Jetty(9.3.0-SNAPSHOT)

现在,在现代,HTTP/2 即将到来,这更有意义。

关于java - 如何让 Jetty 返回错误响应而不是假设 HTTP/0.9 请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28504970/

相关文章:

javascript - 尝试使用 jQuery 的 get 方法填充 html 选项列表

java - Java 中的库 "endorse"是什么意思?

java - Spring 容器如何引用我们作为参数传递给方法的接口(interface)或类类型

java - Tomcat 无法实例化 org.apache.log4j.varia.LevelMatchFilter 类

unit-testing - 我可以将用于测试的过滤器附加到 httpunit ServletRunner 吗?

servlets - Jetty:检测 Webapp 是否启动失败

jakarta-ee - 如何将 Weld 嵌入 jetty 9 以在我的 java maven 项目中使用 cdi?

internet-explorer - 如何在 jetty 或 tomcat 中添加自定义 header ...以进行 IE 边缘仿真?

java - 为什么不将 com.fasterxml.jackson.databind.ObjectMapper 中的某些方法设为静态?

java图像卷积