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。
我想使用 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。