createConnection bilan HTTP CONNECT orqali Node.js HTTP/2
CONNECT ni tugating, h2 bilan manzil TLS ini kelishing, so'ng http2.connect ni o'sha oqimda ushlab turish uchun createConnection ishlating.
HTTP/1.1 proksisi CONNECT ichida manzilning HTTP/2 freymlarini tashishi mumkin. Proksi o'sha ichki freymlarni amalga oshirishi shart emas, lekin mijoz protokol o'tishlarini tartib bilan bajarishi kerak.
to'liq CONNECT javobini tekshirib tunnelSocket ni saqlagandan so'ng, manzil TLS ini qo'shing va o'rnatilgan oqimni HTTP/2 ga bering:
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 yana bir to'g'ridan-to'g'ri soket ochish o'rniga proksi allaqachon tashiyotgan TLS oqimini qaytaradi. Manzilning servername i SNI va sertifikat identifikatsiyasini beradi, tekshirish yoqilgan. ALPN tekshiruvi h2 bo'yicha kelishmagan manzilni rad etadi.
failRoute marshrutni tozalashi kerak; useSession so'rovlar va sessiyani yopishga egalik qiladi. Bu parcha atrofida ulanish va operatsiya muddatlarini qo'llang.
Tashqi ulagich hali ham host:port CONNECT nishonlash, proksiga autentifikatsiya, rad etishlarni qayta ishlash va sarlavhalardan keyin buferlangan baytlarga egalik qiladi. Soketni TLS ga berishdan oldin ularni tugating; to'g'ridan-to'g'ri HTTP/1.1 proksi tinglovchisiga yuborilgan HTTP/2 kirish so'zi noto'g'ri qatlamda boshlanadi.