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.

Relatearre artikelen