HTTP/1.1 proksisi CONNECT daxilində hədəf HTTP/2 çərçivələrini daşıya bilər. Proksinin o daxili çərçivələri tətbiq etməsi lazım deyil, lakin müştəri protokol keçidlərini ardıcıllıqla yerinə yetirməlidir.

tam CONNECT cavabını yoxlayıb tunnelSocket-ı saxladıqdan sonra hədəf TLS əlavə edin və qurulmuş axını HTTP/2-yə verin:

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 başqa bir birbaşa soket açmaq əvəzinə proksinin artıq daşıdığı TLS axını qaytarır. Hədəfin servername-ı SNI və sertifikat şəxsiyyətini təmin edir, yoxlama aktivdir. ALPN yoxlaması h2 razılaşmayan hədəfi rədd edir.

failRoute marşrutu təmizləməlidir; useSession sorğulara və sessiya bağlanmasına sahibdir. Bu fraqment ətrafında bağlantı və əməliyyat müddətləri tətbiq edin.

Xarici birləşdirici hələ də host:port CONNECT hədəfləməsinə, proksi autentifikasiyasına, rədd emalına və başlıqlardan sonra buferlənmiş baytlara sahibdir. Soketi TLS-ə verməzdən əvvəl bunları bitirin; birbaşa HTTP/1.1 proksi dinləyicisinə göndərilən HTTP/2 girişi yanlış qatda başlayır.

Əlaqəli məqalələr