Node.js HTTP/2 caur HTTP CONNECT ar createConnection
Pabeidziet CONNECT, saskaņojiet galamērķa TLS ar h2, pēc tam izmantojiet createConnection, lai http2.connect paliktu uz šīs plūsmas.
HTTP/1.1 starpniekserveris var pārnest galamērķa HTTP/2 kadrus CONNECT iekšienē. Starpniekserverim nav jāievieš šie iekšējie kadri, bet klientam protokolu nodošana jāveic secīgi.
Pēc pilnīgas CONNECT atbildes validēšanas un tunnelSocket saglabāšanas pievienojiet galamērķa TLS un nododiet izveidoto plūsmu 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 atgriež TLS plūsmu, ko starpniekserveris jau pārnēsā, nevis atver vēl vienu tiešu socket. Galamērķa servername nodrošina SNI un sertifikāta identitāti, validācijai esot ieslēgtai. ALPN pārbaude noraida galamērķi, kas nav saskaņojis h2.
failRoute jānotīra maršruts; useSession pārvalda pieprasījumus un sesijas aizvēršanu. Ap šo fragmentu iestatiet savienojuma un darbības termiņus.
Ārējais savienotājs joprojām pārvalda host:port CONNECT mērķēšanu, autentifikāciju pret starpniekserveri, noraidījumu apstrādi un baitus, kas buferēti pēc galvenēm. Pabeidziet tos pirms socket nodošanas TLS; HTTP/2 ievads, kas nosūtīts tieši HTTP/1.1 starpniekservera klausītājam, sākas nepareizajā slānī.