HTTP2_Plain node-http2 模块不工作?

HTTP2_Plain in node-http2 module is not working?

我想使用 node-http2 模块创建一个没有 TLS 的 http2 服务器。我的代码如下:

http2 = require('http2');
const bunyan = require('bunyan');

var log = bunyan.createLogger({name: "HTTP2 server without TLS!"});

var options = {
    log: log
}

var server = http2.raw.createServer(options, function(request, response) {
    console.log("Receiving HTTP2 request!");
    // response.writeHead(200);
    response.end('Hello world from HTTP2!');
});

server.listen(8000);

但是,它不起作用。当从 chrome 连接到此服务器时,它显示正在下载一些东西。当我关闭服务器时,下载完成并显示空白文件(26 字节)。

有人知道这里出了什么问题吗?我需要配置浏览器吗?提前致谢!

Chrome 和所有其他浏览器仅支持 HTTP/2 over TLS (h2) 而不是普通的 HTTP/2 (h2c)。所以你的浏览器不理解服务器返回的内容,显然 node-http2 在收到非 http2 请求时没有发送正确的错误响应。

问题似乎不仅仅来自浏览器。在 http:// URL 上使用支持 http2 的 [curl] curllink 也不起作用。以下是 curl 的输出:

$ curl -I --http2 http://54.208.83.136:8000/ -v -k
*   Trying 54.208.83.136...
* Connected to 54.208.83.136 (54.208.83.136) port 8000 (#0)
> HEAD / HTTP/1.1
> Host: 54.208.83.136:8000
> User-Agent: curl/7.47.1
> Accept: */*
> Connection: Upgrade, HTTP2-Settings
> Upgrade: h2c
> HTTP2-Settings: AAMAAABkAAQAAP__
> 

正如我们从 curl 输出中看到的那样。它发送 http/1.1 升级请求,并根据 [http2 rfc] rfclink.

设置正确的 headers

在服务器端,日志很长,所以这里只展示相关的三个日志中msg的内容。

New incoming HTTP/2 connection

Client connection header prelude does not match

PROTOCOL ERROR, Fatal error, closing connection

所以基本上服务器关闭连接是因为客户端连接header前奏不匹配。通过检查代码,我发现错误来自[endpoint.js] endpointlink的readPrelude函数。是读取客户端header的函数,但不知道客户端header有什么问题:(.

因此,也许我可以说 node-http2 模块不支持纯文本上的 http2。

更新: 原来我错了。 node-http2 模块确实支持直接连接的纯文本上的 http2,它 不支持 HTTP/2 从 HTTP/1.1 升级的服务器。问题是由于客户端使用升级机制连接到不支持升级的服务器。使用 nghttp 客户端连接服务器与先验知识工作如下。

$ nghttp http://127.0.0.1:8000/ 
Hello world from HTTP2!

nghttpd 服务器还支持没有 TLS 的 HTTP2,即使它不支持 HTTP 升级。

$ nghttpd -d /Documents/Proxy 8080 --no-tls -v

所以我强烈建议当你想在没有 TLS 的情况下测试 HTTP2 时使用 nghttp。