Node.js HTTP/2 per HTTP CONNECT su createConnection
Užbaikite CONNECT, suderėkite paskirties TLS su h2, tada naudokite createConnection, kad http2.connect liktų tame sraute.
HTTP/1.1 tarpinis serveris gali perduoti paskirties HTTP/2 kadrus CONNECT viduje. Tarpiniam serveriui nereikia įgyvendinti tų vidinių kadrų, bet klientas turi atlikti protokolų perėmimus iš eilės.
Patvirtinę visą CONNECT atsakymą ir išsaugoję tunnelSocket, pridėkite paskirties TLS ir perduokite nustatytą srautą 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 grąžina TLS srautą, kurį tarpinis serveris jau perduoda, o ne atidaro dar vieną tiesioginį socket. Paskirties servername suteikia SNI ir sertifikato tapatybę, patikra įjungta. ALPN patikra atmeta paskirtį, kuri nesuderėjo h2.
failRoute turi išvalyti maršrutą; useSession valdo užklausas ir sesijos uždarymą. Šio fragmento aplinkoje nustatykite ryšio ir operacijų terminus.
Išorinis jungiklis vis dar valdo host:port CONNECT taikinimą, autentifikaciją tarpiniam serveriui, atmetimų apdorojimą ir baitus, sukauptus po antraščių. Užbaikite tai prieš perduodami socketą TLS; HTTP/2 įžanga, išsiųsta tiesiai HTTP/1.1 tarpinio serverio klausytojui, pradedama netinkamame sluoksnyje.