HTTP/1.1 proxy batek helmugako HTTP/2 markoak CONNECT barruan eraman ditzake. Proxyak ez du barruko marko horiek inplementatu behar, baina bezeroak protokoloaren eskualdaketak ordenan egin behar ditu.

CONNECT erantzun osoa balioetsi eta tunnelSocket gorde ondoren, gehitu helmugako TLS eta eman ezarritako fluxua HTTP/2-ri:

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 proxyak jada eramaten duen TLS fluxua itzultzen du, beste socket zuzen bat ireki ordez. Helmugako servername-ek SNI eta ziurtagiriaren identitatea ematen ditu, egiaztapena aktibatuta. ALPN egiaztapenak h2 negoziatu ez duen helmuga baztertzen du.

failRoute-ek ibilbidea garbitu behar du; useSession-ek eskaerak eta saioaren itxiera ditu. Ezarri konexio- eta eragiketa-epemugak zati honen inguruan.

Kanpoko konektoreak oraindik host:port CONNECT helburua, proxyaren autentifikazioa, ukapenak kudeatzea eta goiburu ondoren bufferatutako byteak ditu. Amaitu horiek socketa TLS-i eman aurretik; HTTP/1.1 proxy entzule batera zuzenean bidalitako HTTP/2 hitzaurrea geruza okerrean hasten da.

Erlazionatutako artikuluak