Az HTTP/1.1 proxy a cél HTTP/2 kereteit CONNECT-en belül továbbíthatja. A proxynak nem kell megvalósítania ezeket a belső kereteket, de a kliensnek sorrendben kell elvégeznie a protokollváltásokat.

Miután érvényesítette a teljes CONNECT választ és megtartotta a tunnelSocket-t, adjon hozzá cél TLS-t, és adja át a létrejött streamet a HTTP/2-nek:

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 a proxyn már áthaladó TLS streamet adja vissza ahelyett, hogy újabb közvetlen socketet nyitna. A cél servername biztosítja az SNI-t és a tanúsítvány identitását, az ellenőrzés bekapcsolva. Az ALPN-ellenőrzés elutasítja azt a célt, amely nem egyeztetett h2-t.

failRoute-nek meg kell tisztítania az útvonalat; useSession birtokolja a kéréseket és a munkamenet lezárását. Alkalmazzon kapcsolódási és műveleti határidőket e szakasz körül.

A külső csatlakozó továbbra is birtokolja a host:port CONNECT célzást, a proxy-hitelesítést, az elutasítások kezelését és a fejlécek után pufferelt bájtokat. Fejezze be ezeket, mielőtt a socketet a TLS-nek adja; a HTTP/1.1 proxy figyelőnek közvetlenül küldött HTTP/2 előszó a rossz rétegen indul.

Kapcsolódó cikkek