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 پیش لفظ غلط تہہ پر شروع ہوتا ہے۔

متعلقہ مضامین