Node.js HTTP/2 fia HTTP CONNECT mei createConnection
Meitsje CONNECT dien, ûnderhannelje doel-TLS mei h2, brûk dan createConnection om http2.connect op dy stream te hâlden.
In HTTP/1.1-proxy kin HTTP/2-ramen fan it doel binnen CONNECT drage. De proxy hoecht dy binnenste ramen net te ymplemintearjen, mar de klient moat de protokol-oerdrachten yn oarder dwaan.
Nei it falidearjen fan it folsleine CONNECT-antwurd en it behâlden fan tunnelSocket, foegje doel-TLS ta en jou de oprjochte stream oan 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 jout de TLS-stream werom dy't de proxy al draacht, ynstee fan noch in direkte socket te iepenjen. De servername fan it doel leveret SNI en sertifikaatidentiteit, mei falidaasje oan. De ALPN-kontrôle wiist in doel ôf dat h2 net ûnderhannele hat.
failRoute moat de rûte opromje; useSession hat de oanfragen en it sluten fan de sesje. Pas ferbining- en operaasjeterminen om dit fragmint hinne ta.
De bûtenste konnektor hat noch altyd it host:port CONNECT-doel, proxy-autentikaasje, ôfwizingen en de bytes dy't nei de kopteksten bufferje. Meitsje dy dien foardat de socket oan TLS jûn wurdt; in HTTP/2-ynlieding dy't streekrjocht nei in HTTP/1.1-proxylistener stjoerd wurdt, begjint op 'e ferkearde laach.