Jetty 11 - HTTP/1.1 到 HTTP/2 升级,如何编写处理程序?
Jetty 11 - HTTP/1.1 to HTTP/2 upgrade, how to write the handler?
我很困惑,因为在使用 Jetty 11 时从 HTTP/1.1 升级到 HTTP/2。
AFAIK,HTTP/2 使用 stream
,但以防万一,请求已从 1.1 升级到 2,并且 curl
也告诉
Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0
但是,另一方面,handler
实现如下(根据 Jetty 的文档)
public class DummyHandler extends AbstractHandler {
@Override
public void handle(String target, Request jettyRequest, HttpServletRequest request, HttpServletResponse response) throws IOException {
jettyRequest.setHandled(true);
response.setStatus(HttpStatus.OK_200);
response.setContentType("text/html; charset=UTF-8");
response.getWriter().write(
"<!DOCTYPE html>" +
"<html>" +
"<head>" +
" <title>Jetty Hello World Handler</title>" +
"</head>" +
"<body>" +
" <p>Hello World</p>" +
"</body>" +
"</html>"
);
}
}
所以,这意味着 request
和 response
仍然是 HTTP/1.1,并且从 1.1 升级到 2 没有任何好处,因为上面的代码不是处理 HTTP2 的 stream
。
我的问题是如何编写 handler
来处理 HTTP2(升级后)或如何编写处理程序来处理 HTTP2 请求?我检查了 Jetty 的文档,但找不到任何线索。谢谢。
HTTP 有 2 层:语义 层,应用程序编写它们的逻辑,传输 层,HTTP 语义被转换 from/to 字节并通过网络传输。
上面的Handler
是在语义层
这意味着可以在 HTTP/1.1 或 HTTP/2 中接收请求,但接收到的字节随后会转换为 HttpServletRequest
object 并传递给Handler.handle(...)
方法。
同样,您在 HttpServletResponse
object 中写入的内容(headers 或 body 内容)将由 Jetty 透明地转换为 HTTP/1 .1 或 HTTP/2.
通常情况下,应用程序应该只与语义层一起工作,因为这样它们就可以同时为 HTTP/1.1 和 HTTP/2.
工作
您可以将 Jetty 配置为在同一网络端口上同时接受 HTTP/1.1 和 HTTP/2; HTTP/2 合规客户将在 HTTP/2 中与 Jetty 交谈,然后 Jetty 将呼叫您的 Handler
;不支持 HTTP/2 的旧客户端将使用 HTTP/1.1,Jetty 仍会调用相同的 Handler
.
如果您真的想处理 HTTP/2 帧,Jetty 提供了 low-level HTTP/2 API,记录在案 here.
总之,如果您正确配置了 Jetty,上面的 Handler
已经是您处理 HTTP/2 请求(以及 HTTP/1.1 请求)所需要的。
我很困惑,因为在使用 Jetty 11 时从 HTTP/1.1 升级到 HTTP/2。
AFAIK,HTTP/2 使用 stream
,但以防万一,请求已从 1.1 升级到 2,并且 curl
也告诉
Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0
但是,另一方面,handler
实现如下(根据 Jetty 的文档)
public class DummyHandler extends AbstractHandler {
@Override
public void handle(String target, Request jettyRequest, HttpServletRequest request, HttpServletResponse response) throws IOException {
jettyRequest.setHandled(true);
response.setStatus(HttpStatus.OK_200);
response.setContentType("text/html; charset=UTF-8");
response.getWriter().write(
"<!DOCTYPE html>" +
"<html>" +
"<head>" +
" <title>Jetty Hello World Handler</title>" +
"</head>" +
"<body>" +
" <p>Hello World</p>" +
"</body>" +
"</html>"
);
}
}
所以,这意味着 request
和 response
仍然是 HTTP/1.1,并且从 1.1 升级到 2 没有任何好处,因为上面的代码不是处理 HTTP2 的 stream
。
我的问题是如何编写 handler
来处理 HTTP2(升级后)或如何编写处理程序来处理 HTTP2 请求?我检查了 Jetty 的文档,但找不到任何线索。谢谢。
HTTP 有 2 层:语义 层,应用程序编写它们的逻辑,传输 层,HTTP 语义被转换 from/to 字节并通过网络传输。
上面的Handler
是在语义层
这意味着可以在 HTTP/1.1 或 HTTP/2 中接收请求,但接收到的字节随后会转换为 HttpServletRequest
object 并传递给Handler.handle(...)
方法。
同样,您在 HttpServletResponse
object 中写入的内容(headers 或 body 内容)将由 Jetty 透明地转换为 HTTP/1 .1 或 HTTP/2.
通常情况下,应用程序应该只与语义层一起工作,因为这样它们就可以同时为 HTTP/1.1 和 HTTP/2.
工作您可以将 Jetty 配置为在同一网络端口上同时接受 HTTP/1.1 和 HTTP/2; HTTP/2 合规客户将在 HTTP/2 中与 Jetty 交谈,然后 Jetty 将呼叫您的 Handler
;不支持 HTTP/2 的旧客户端将使用 HTTP/1.1,Jetty 仍会调用相同的 Handler
.
如果您真的想处理 HTTP/2 帧,Jetty 提供了 low-level HTTP/2 API,记录在案 here.
总之,如果您正确配置了 Jetty,上面的 Handler
已经是您处理 HTTP/2 请求(以及 HTTP/1.1 请求)所需要的。