HTTP/1.1 milliþjónn getur borið HTTP/2 ramma áfangastaðar inni í CONNECT. Milliþjóninum þarf ekki að útfæra þessa innri ramma, en biðlarinn verður að framkvæma siðaskipti samskiptareglanna í réttri röð.

Eftir að hafa staðfest fullt CONNECT svar og haldið tunnelSocket, bættu við TLS áfangastaðar og gefðu hinn uppsetta straum til 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 skilar TLS straumnum sem milliþjónninn ber þegar í stað þess að opna annan beinan socket. servername áfangastaðarins veitir SNI og auðkenni vottorðs, með sannvottun virka. ALPN athugunin hafnar áfangastað sem samdi ekki um h2.

failRoute verður að hreinsa leiðina; useSession á beiðnir og lokun setu. Settu tímatakmörk tengingar og aðgerða í kringum þennan hluta.

Ytri tengið á enn markmið CONNECT host:port, sannvottun við milliþjón, meðferð á höfnun og þau bæti sem eru biðuð eftir hausunum. Kláraðu það áður en socketnum er skilað til TLS; HTTP/2 forspjall sem sent er beint á HTTP/1.1 milliþjónshlustara byrjar á röngu lagi.

Tengdir greinar