Node.js HTTP/2 prin HTTP CONNECT cu createConnection
Finalizează CONNECT, negociază TLS-ul destinației cu h2, apoi folosește createConnection pentru a menține http2.connect pe acel flux.
Un proxy HTTP/1.1 poate transporta cadre HTTP/2 ale destinației în interiorul CONNECT. Proxy-ul nu trebuie să implementeze acele cadre interne, dar clientul trebuie să facă predările de protocol în ordine.
După validarea răspunsului CONNECT complet și păstrarea lui tunnelSocket, adaugă TLS-ul destinației și predă fluxul stabilit către 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 returnează fluxul TLS deja transportat de proxy în loc să deschidă un alt socket direct. servername al destinației furnizează SNI și identitatea certificatului, cu verificarea activată. Verificarea ALPN respinge o destinație care nu a negociat h2.
failRoute trebuie să curețe ruta; useSession deține cererile și închiderea sesiunii. Aplică termene de conectare și de operare în jurul acestui fragment.
Conectorul exterior deține în continuare țintirea CONNECT host:port, autentificarea la proxy, tratarea refuzurilor și octeții memorizați după antete. Termină-le înainte de a preda socketul către TLS; un preambul HTTP/2 trimis direct către un listener proxy HTTP/1.1 începe la stratul greșit.