Node.js HTTP/2 a través d'HTTP CONNECT amb createConnection
Completeu CONNECT, negocieu el TLS de destinació amb h2 i feu servir createConnection per mantenir http2.connect en aquest flux.
Un proxy HTTP/1.1 pot transportar les trames HTTP/2 de destinació dins de CONNECT. El proxy no ha d'implementar aquestes trames internes, però el client ha de fer els trànsits de protocol en ordre.
Després de validar la resposta CONNECT completa i conservar tunnelSocket, afegiu el TLS de destinació i lliureu el flux establert a HTTP/2:
import tls from 'node:tls';
import http2 from 'node:http2';
const secureSocket = tls.connect({
socket: tunnelSocket,
servername: 'api.example',
ALPNProtocols: ['h2'],
});
secureSocket.once('error', failRoute);
secureSocket.once('secureConnect', () => {
if (secureSocket.alpnProtocol !== 'h2') {
secureSocket.destroy();
failRoute(new Error('Destination did not negotiate h2'));
return;
}
const session = http2.connect('https://api.example', {
createConnection: () => secureSocket,
});
session.on('error', failRoute);
useSession(session);
});createConnection retorna el flux TLS que el proxy ja transporta en lloc d'obrir un altre sòcol directe. El servername de destinació proporciona SNI i identitat del certificat, amb la verificació activada. La comprovació ALPN rebutja una destinació que no ha negociat h2.
failRoute ha de netejar la ruta; useSession posseeix les peticions i el tancament de la sessió. Apliqueu terminis de connexió i d'operació al voltant d'aquest fragment.
El connector extern encara s'encarrega de l'objectiu CONNECT host:port, de l'autenticació del proxy, del tractament de rebuigs i dels bytes memoritzats després de les capçaleres. Acabeu-ho abans de lliurar el sòcol a TLS; un preàmbul HTTP/2 enviat directament a un oient de proxy HTTP/1.1 comença a la capa equivocada.