Node.js HTTP/2 ผ่าน HTTP CONNECT ด้วย createConnection
ทำ CONNECT ให้เสร็จ เจรจา TLS ปลายทางด้วย h2 แล้วใช้ createConnection เพื่อคง http2.connect ไว้บนสตรีมนั้น
พร็อกซี 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 จะเริ่มที่ชั้นผิด