HTTP/1.1 proxy သည် CONNECT အတွင်း၌ ဦးတည်ရာ HTTP/2 frame များကို သယ်ဆောင်နိုင်သည်။ proxy သည် ထို အတွင်းပိုင်း frame များကို အကောင်အထည်ဖော်ရန် မလိုအပ်ပါ၊ သို့သော် client သည် protocol လွှဲပြောင်းမှုများကို အစဉ်လိုက် လုပ်ဆောင်ရမည်။

CONNECT တုံ့ပြန်ချက် အပြည့်အစုံကို အတည်ပြုပြီး tunnelSocket ကို ထိန်းသိမ်းထားပြီးနောက်၊ ဦးတည်ရာ TLS ကို ထည့်ပြီး တည်ဆောက်ပြီးသော stream ကို 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 သည် အခြား တိုက်ရိုက် socket တစ်ခု ဖွင့်မည့်အစား proxy က သယ်ဆောင်နေပြီးသော TLS stream ကို ပြန်ပေးသည်။ ဦးတည်ရာ၏ servername သည် SNI နှင့် လက်မှတ် အထောက်အထားကို ပေးပြီး အတည်ပြုမှု ဖွင့်ထားသည်။ ALPN စစ်ဆေးမှုသည် h2 ကို ညှိနှိုင်းမခဲ့သော ဦးတည်ရာကို ငြင်းပယ်သည်။

failRoute သည် လမ်းကြောင်းကို ရှင်းလင်းရမည်၊ useSession သည် တောင်းဆိုမှုများနှင့် session ပိတ်ခြင်းကို ပိုင်ဆိုင်သည်။ ဤအပိုင်းအစ ပတ်လည်တွင် ချိတ်ဆက်မှုနှင့် လုပ်ဆောင်မှု သတ်မှတ်ချိန်များကို သတ်မှတ်ပါ။

အပြင်ဘက် connector သည် host:port CONNECT ပစ်မှတ်ချိန်ရွယ်မှု၊ proxy အတည်ပြုမှု၊ ငြင်းပယ်မှု ကိုင်တွယ်မှုနှင့် header များနောက်တွင် buffer လုပ်ထားသော byte များကို ဆက်လက် ပိုင်ဆိုင်သည်။ socket ကို TLS သို့ မပေးမီ ထိုအရာများကို အပြီးသတ်ပါ။ HTTP/1.1 proxy listener သို့ တိုက်ရိုက် ပို့သော HTTP/2 အဖွင့်စကားသည် မှားယွင်းသည့် အလွှာတွင် စတင်သည်။

ဆက်စပ်ဆောင်းပါးများ