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 పీఠిక తప్పు పొరలో ప్రారంభమవుతుంది.

సంబంధిత వ్యాసాలు