【问题标题】:Jetty 11 - HTTP/1.1 to HTTP/2 upgrade, how to write the handler?Jetty 11 - HTTP/1.1 到 HTTP/2 升级,handler 怎么写?
【发布时间】:2021-09-24 07:01:22
【问题描述】:

我很困惑,因为在使用 Jetty 11 时从 HTTP/1.1 升级到了 HTTP/2。

AFAIK,HTTP/2 使用stream,但以防万一,请求已从 1.1 升级到 2,curl 也告诉

升级后将流缓冲区中的 HTTP/2 数据复制到连接缓冲区: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

我的问题是如何编写处理 HTTP2(升级后)的handler 或如何编写处理程序来处理 HTTP2 请求?我检查了 Jetty 的文件,但找不到任何线索。谢谢。

【问题讨论】:

    标签: java jetty http2


    【解决方案1】:

    HTTP 有 2 层:语义 层,应用程序在其中编写逻辑;传输 层,HTTP 语义在其中从/到字节转换并传播通过网络。

    上面的Handler在语义层。

    这意味着可以在 HTTP/1.1 或 HTTP/2 中接收请求,但接收到的字节随后会转换为 HttpServletRequest 对象并传递给 Handler.handle(...) 方法。

    同样,您在HttpServletResponse 对象中写入的内容(标头或正文内容)将被 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 提供了低级 HTTP/2 API,记录在 here

    总而言之,只要您正确配置了 Jetty,您上面的 Handler 就已经是您处理 HTTP/2 请求(以及 HTTP/1.1 请求)所需要的了。

    【讨论】:

      猜你喜欢
      • 2017-07-08
      • 2017-09-30
      • 2019-10-10
      • 2019-06-28
      • 2015-11-03
      • 1970-01-01
      • 2018-11-05
      • 1970-01-01
      • 2016-09-10
      相关资源
      最近更新 更多