Node.js HTTP/2 prek HTTP CONNECT s createConnection
Dokončajte CONNECT, izpogajajte TLS cilja s h2, nato uporabite createConnection, da http2.connect ostane na tem toku.
Posrednik HTTP/1.1 lahko prenaša okvire HTTP/2 cilja znotraj CONNECT. Posredniku ni treba izvesti teh notranjih okvirov, vendar mora odjemalec prehode protokola izvesti po vrsti.
Ko preverite celoten odgovor CONNECT in obdržite tunnelSocket, dodajte TLS cilja in vzpostavljeni tok predajte 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 vrne tok TLS, ki ga posrednik že prenaša, namesto da bi odprl še en neposreden socket. servername cilja zagotovi SNI in identiteto potrdila z omogočenim preverjanjem. Preverjanje ALPN zavrne cilj, ki se ni pogajal za h2.
failRoute mora počistiti pot; useSession ima v lasti zahteve in zaprtje seje. Okoli tega fragmenta nastavite roke za povezavo in delovanje.
Zunanji konektor ima še vedno v lasti ciljanje CONNECT host:port, preverjanje pristnosti pri posredniku, obravnavo zavrnitev in bajte, shranjene po glavah. Dokončajte jih, preden socket predate TLS; uvoda HTTP/2, poslanega neposredno poslušalcu posrednika HTTP/1.1, se začne v napačnem sloju.