Proxy HTTP/1.1 lè gbé àwọn férémù HTTP/2 ti ibi-afẹ́dé nínú CONNECT. Proxy kò nílò láti ṣe àwọn férémù inú yẹn, ṣùgbọ́n kíláìntì gbọ́dọ̀ ṣe àwọn ìfọ̀wọ́sọ̀rọ̀sọ̀rọ̀ protocol ní ìtòlẹ́sẹẹsẹ.

Lẹ́yìn ìjẹ́rìí ìdáhùn CONNECT kíkún àti pípa tunnelSocket mọ́, fi TLS ibi-afẹ́dé kún un kí o sì fi ìṣàn tí a ti dá náà fún 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 dá ìṣàn TLS tí proxy ti ń gbé padà dípò ṣíṣí sokẹ́ẹ̀tì mìíràn tààrà. servername ti ibi-afẹ́dé ń pèsè SNI àti ìdánimọ̀ ìwé-ẹ̀rí, pẹ̀lú ìjẹ́rìí tí ó ṣiṣẹ́. Àyẹ̀wò ALPN kọ ibi-afẹ́dé tí kò fọ̀rọ̀wánilẹ́nuwò h2.

failRoute gbọ́dọ̀ tọ́jú ipa-ọ̀nà mọ́; useSession ni ó ní àwọn ìbéèrè àti pípa ìpàdé. Fi àwọn àkókò ìsopọ̀ àti ìṣiṣẹ́ ká àyọkà yìí.

Olùsopọ̀ òde ṣì ní àfojúsùn CONNECT host:port, ìjẹ́rìí sí proxy, ìṣàkóso ìkọ̀sílẹ̀ àti àwọn byte tí a fi pamọ́ lẹ́yìn àwọn àkọlé. Parí àwọn wọnnì kí o tó fi sokẹ́ẹ̀tì náà fún TLS; ìfáárà HTTP/2 tí a rán tààrà sí olùgbọ́ọ̀rọ̀ proxy HTTP/1.1 bẹ̀rẹ̀ ní ìpele tí kò tọ́.

Àwọn àpilẹ̀kọ tó jọra