Maaaring magdala ang isang HTTP/1.1 proxy ng mga HTTP/2 frame ng destinasyon sa loob ng CONNECT. Hindi kailangang ipatupad ng proxy ang mga panloob na frame na iyon, ngunit dapat gawin ng kliyente ang mga paglilipat ng protocol nang sunod-sunod.

Matapos patunayan ang buong tugon ng CONNECT at panatilihin ang tunnelSocket, idagdag ang TLS ng destinasyon at ibigay ang naitatag na stream sa 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);
});

Ibinabalik ng createConnection ang TLS stream na dinadala na ng proxy sa halip na magbukas ng isa pang direktang socket. Ibinibigay ng servername ng destinasyon ang SNI at pagkakakilanlan ng sertipiko, na naka-on ang beripikasyon. Tinatanggihan ng pagsusuri ng ALPN ang destinasyong hindi nakipag-usap sa h2.

Dapat linisin ng failRoute ang ruta; pagmamay-ari ng useSession ang mga kahilingan at pagsasara ng session. Maglapat ng mga takda ng koneksyon at operasyon sa paligid ng bahaging ito.

Pagmamay-ari pa rin ng panlabas na connector ang host:port CONNECT targeting, pagpapatotoo sa proxy, paghawak ng mga pagtanggi at ang mga byte na na-buffer pagkatapos ng mga header. Tapusin ang mga iyon bago ibigay ang socket sa TLS; ang paunang salita ng HTTP/2 na direktang ipinadala sa isang HTTP/1.1 proxy listener ay nagsisimula sa maling layer.

Kaugnay na mga artikulo