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 дагы бир түз сокет ачуунун ордуна прокси мурунтан ташып жаткан TLS агымын кайтарат. Максаттын servername SNI жана сертификаттын инсандыгын берет, текшерүү күйүк. ALPN текшерүүсү h2 макулдашпаган максатты четке кагат.

failRoute маршрутту тазалашы керек; useSession сурамдарга жана сессияны жабууга ээ. Бул фрагменттин айланасында туташуу жана операция мөөнөттөрүн колдонуңуз.

Сырткы туташтыргыч дагы эле host:port CONNECT максаттоого, проксиге аутентификацияга, баш тартууларды иштетүүгө жана аталыштардан кийин буферленген байттарга ээ. Сокетти TLSке берүүдөн мурун аларды бүткөрүңүз; түз HTTP/1.1 прокси угуучусуна жиберилген HTTP/2 кириш сөзү туура эмес катмардан башталат.

Тектеш макалалар