我正在尝试在Node中运行以下示例.它可以在HTTP/1.1上正常运行,但在HTTP2上失败:
I'm trying to run the following example in Node. It runs properly with HTTP/1.1 but fails with HTTP2:
// Get an HTTP/1.1 tunnel: const req = http.request({ method: 'CONNECT', host: proxy.host, // This is a remote proxy which works properly with http/1.1 port: proxy.port, path: 'example' }); req.end(); const tunnelledSocket = await new Promise((resolve) => { req.on('connect', (_res, socket) => resolve(socket)); }); // We can now read/write to our raw TCP socket to example: const client = http2.connect('example', { // Tunnel this request through the HTTP/1.1 tunnel: createConnection: () => tunnelledSocket }); // Until here all is good, the problem comes when trying to load the url. const proxiedRequest = client.request({ ':path': '/test' });我从节点收到以下无用的错误:
I'm getting the following unhelpful error from node:
Error [ERR_HTTP2_ERROR]: Protocol error at new NghttpError (node:internal/http2/util:550:5) at Http2Session.onSessionInternalError (node:internal/http2/core:776:26) { code: 'ERR_HTTP2_ERROR', errno: -505 }我找不到解决方法的明确答案.
I couldn't find any clear answer on how to solve it.
推荐答案所以我找到了可能的答案.
So I found a possible answer.
在创建连接时,您需要将tls连接到HTTP2,因为它是HTTPS请求,但是您需要忽略证书错误,否则tls会抱怨您正在连接到您不拥有证书的域.至少那是我设法做到的唯一方法.
When creating the connection, you need to connect HTTP2 with tls as it's an HTTPS request, but you need to ignore the certificate errors as otherwise, tls will complain that you are connecting to a domain where you don't own a certificate. At least that is the only way I managed to do it.
我愿意听到更好的解决方案.
I'm open to hear better solutions.
const client = http2.connect('example', { createConnection: () => tls.connect({ socket: tunnelledSocket, rejectUnauthorized: false, ALPNProtocols: ['h2'], }), });更多推荐
带有远程代理的节点HTTP2请求
发布评论