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 પ્રસ્તાવના ખોટા સ્તરે શરૂ થાય છે.

સંબંધિત લેખો