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>"
        );
    }
}

所以,这意味着 requestresponse 仍然是 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 请求)所需要的。