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 प्रस्तावना गलत तहमा सुरु हुन्छ।

सम्बन्धित लेखहरू