Node.js HTTP/2 deur HTTP CONNECT met createConnection
Voltooi CONNECT, onderhandel bestemming-TLS met h2 en gebruik dan createConnection om http2.connect op daardie stroom te hou.
'n HTTP/1.1-proxy kan bestemming HTTP/2-rame binne CONNECT dra. Die proxy hoef nie daardie binnerame te implementeer nie, maar die kliënt moet die protokoloorhandings in volgorde uitvoer.
Nadat jy die volledige CONNECT-antwoord gevalideer het en sy tunnelSocket behou het, voeg bestemming-TLS by en gee die gevestigde stroom aan 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 gee die TLS-stroom terug wat reeds deur die proxy gedra word, eerder as om nog 'n direkte sok te open. Die bestemming se servername verskaf SNI en sertifikaatidentiteit, met verifikasie geaktiveer. Die ALPN-kontrole verwerp 'n bestemming wat nie h2 onderhandel het nie.
failRoute moet die roete opruim; useSession besit versoeke en sessiesluiting. Pas verbinding- en bewerkingstydlyne rondom hierdie fragment toe.
Die buitenste konektor besit steeds host:port CONNECT-teiken, proxy-verifikasie, verwerpinghantering en grepe wat ná die kopstukke gebuffer is. Voltooi dit voordat jy die sok aan TLS gee; 'n HTTP/2-voorwoord wat reguit na 'n HTTP/1.1-proxy-listener gestuur word, begin op die verkeerde laag.