虽然最初我决定创建一个仅 HTTP/2 的服务器,但我发现兼容性 API 是一个不错的选择,可以支持不支持或不支持 HTTP/2 的客户端(fetch
在react-native
?)。
但是,我很难理解如何处理 HTTP/1x 处理程序上的传入请求,即报告req.httpVersion === "2.0"
。ALPN negotiation section
以下代码是文档中的摘录nodejs
:
function onRequest(req, res) {
// Detects if it is a HTTPS request or HTTP/2
const { socket: { alpnProtocol } } = req.httpVersion === '2.0' ?
req.stream.session : req;
// HERE: OK, say we have req.httpVersion === '2.0'
// Now, what?
res.writeHead(200, { 'content-type': 'application/json' });
res.end(JSON.stringify({
alpnProtocol,
httpVersion: req.httpVersion
}));
}
首先,我不明白上面的代码应该做什么。就像,我知道它做了什么,但它没有什么特别的——似乎只是通用的 HTTP/1x 请求处理程序,它发送一些 JSON,仅此而已。我错过了什么吗?
除此之外:
- 一旦 HTTP/1x 处理程序报告
req.httpVersion = "2.0"
,我该怎么办?
它也会由 HTTP/2 处理程序 (server.on("stream", ()=>{ ... })
) 处理,所以我应该在 HTTP/1x 处理程序中忽略它吗? - 如果它不会由 HTTP/2 处理程序自动处理,我可以而且应该手动将请求转发给 HTTP/2 处理程序吗?
function http2handler(stream, headers){ ... }
function http1xhandler(req, res) {
if (req.httpVersion === "2.0") {
// handle as HTTP/2
return http2handler(req.stream, req.headers);
}
// handle as HTTP/1x ...
}
const server = createSecureServer(
{ cert, key, allowHTTP1: true },
http1xhandler
).listen(4443);
server.on("stream", http2handler);
- 如果以上都不是,示例中的响应 JSON 是否在向客户端指示它应该切换到 HTTP/2 方面发挥作用?如果是这样,客户究竟应该怎么做?
抱歉,如果这可能是一个愚蠢的问题,nodejs 文档很糟糕......似乎他们的每一点文档都必须以悬念结束......