د 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/2 پېژندنه چې مستقیم HTTP/1.1 پراکسي اورېدونکي ته لېږل کیږي په غلط طبقه کې پیل کیږي.

اړوندې مقالې