Node.js HTTP/2 lewat HTTP CONNECT dengan createConnection
Selesaikan CONNECT, negosiasikan TLS tujuan dengan h2, lalu gunakan createConnection agar http2.connect tetap pada aliran itu.
Proksi HTTP/1.1 dapat membawa frame HTTP/2 tujuan di dalam CONNECT. Proksi tidak perlu mengimplementasikan frame dalam tersebut, tetapi klien harus melakukan serah terima protokol secara berurutan.
Setelah memvalidasi balasan CONNECT lengkap dan mempertahankan tunnelSocket, tambahkan TLS tujuan dan serahkan aliran yang sudah terbentuk ke 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 mengembalikan aliran TLS yang sudah dibawa proksi alih-alih membuka socket langsung lain. servername tujuan menyediakan SNI dan identitas sertifikat, dengan verifikasi aktif. Pemeriksaan ALPN menolak tujuan yang tidak menegosiasikan h2.
failRoute harus membersihkan rute; useSession memiliki permintaan dan penutupan sesi. Terapkan tenggat koneksi dan operasi di sekitar fragmen ini.
Konektor luar tetap memiliki penargetan CONNECT host:port, autentikasi proksi, penanganan penolakan, dan byte yang tertampung setelah header. Selesaikan itu sebelum socket diserahkan ke TLS; preambul HTTP/2 yang dikirim langsung ke listener proksi HTTP/1.1 dimulai pada lapisan yang salah.