HTTP/1.1 прокси CONNECT дотор зорьсон HTTP/2 фрэймүүдийг зөөж чадна. Прокси тэдгээр дотоод фрэймүүдийг хэрэгжүүлэх шаардлагагүй, гэхдээ клиент протоколын шилжилтийг дарааллаар гүйцэтгэх ёстой.

бүрэн CONNECT хариуг баталгаажуулж tunnelSocket-г хадгалсны дараа зорьсон TLS нэмж, тогтоосон урсгалыг 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 өөр шууд socket нээхийн оронд прокси аль хэдийн зөөж буй TLS урсгалыг буцаана. Зорьсон servername нь SNI болон сертификатын таних тэмдгийг өгч, баталгаажуулалт асаалттай байна. ALPN шалгалт h2 тохиролцоогүй зорилгыг үгүйсгэнэ.

failRoute зам мөрийг цэвэрлэх ёстой; useSession хүсэлт болон сессийг хаахыг эзэмшинэ. Энэ хэсгийн эргэн тойронд холболт болон үйлдлийн хугацааны хязгаар тогтооно.

Гадаад холбогч нь host:port CONNECT зорилтот, проксид баталгаажуулалт, татгалзалтыг шийдвэрлэх, толгой мөрүүдийн дараа буферлэгдсэн байтуудыг эзэмсэн хэвээр. Socket-ийг TLS-т өгөхийн өмнө тэдгээрийг дуусга; HTTP/1.1 прокси сонсогчид шууд илгээсэн HTTP/2 оршил нь буруу давхаргад эхэлдэг.

Холбоотой нийтлэлүүд