พร็อกซี HTTP/1.1 สามารถบรรทุก เฟรม HTTP/2 ของปลายทางภายใน CONNECT ได้ พร็อกซีไม่จำเป็นต้องติดตั้งเฟรมภายในเหล่านั้น แต่ไคลเอนต์ต้องทำการส่งต่อโปรโตคอลตามลำดับ

หลังจากตรวจสอบ คำตอบ 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 ถือครองคำขอและการปิดเซสชัน ใช้กำหนดเวลาการเชื่อมต่อและการดำเนินงานรอบส่วนนี้

คอนเนกเตอร์ภายนอกยังคงถือครองการกำหนดเป้าหมาย CONNECT host:port การพิสูจน์ตัวตนกับพร็อกซี การจัดการการปฏิเสธ และไบต์ที่บัฟเฟอร์หลังเฮดเดอร์ ทำให้เสร็จก่อนส่งซ็อกเก็ตให้ TLS คำนำ HTTP/2 ที่ส่งตรงไปยังตัวรับฟังพร็อกซี HTTP/1.1 จะเริ่มที่ชั้นผิด

บทความที่เกี่ยวข้อง