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 प्रस्तावना गलत परत पर शुरू होती है।

संबंधित लेख