Node.js HTTP/2 ຜ່ານ HTTP CONNECT ດ້ວຍ createConnection
ຈົບ CONNECT, ເຈລະຈາ TLS ປາຍທາງດ້ວຍ h2, ແລ້ວໃຊ້ createConnection ເພື່ອຮັກສາ http2.connect ໄວ້ເທິງ stream ນັ້ນ.
proxy HTTP/1.1 ສາມາດຂົນ frame HTTP/2 ຂອງປາຍທາງພາຍໃນ CONNECT. 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 ສົ່ງຄືນ stream TLS ທີ່ proxy ຂົນຢູ່ແລ້ວ ແທນການເປີດ socket ຊື່ອີກອັນໜຶ່ງ. servername ຂອງປາຍທາງໃຫ້ SNI ແລະ ຕົວຕົນຂອງໃບຢັ້ງຢືນ, ໂດຍເປີດການກວດສອບ. ການກວດ ALPN ປະຕິເສດປາຍທາງທີ່ບໍ່ໄດ້ເຈລະຈາ h2.
failRoute ຕ້ອງເກັບກວາດເສັ້ນທາງ; useSession ເປັນເຈົ້າຂອງຄຳຮ້ອງ ແລະການປິດ session. ໃສ່ກຳນົດເວລາການເຊື່ອມຕໍ່ ແລະ ການດຳເນີນງານອ້ອມສ່ວນນີ້.
connector ພາຍນອກຍັງເປັນເຈົ້າຂອງການເລັ່ງເປົ້າ CONNECT host:port, ການພິສູດຕົວຕົນກັບ proxy, ການຈັດການການປະຕິເສດ ແລະ byte ທີ່ buffer ຫຼັງ header. ເຮັດສິ່ງເຫຼົ່ານັ້ນໃຫ້ສຳເລັດກ່ອນສົ່ງ socket ໃຫ້ TLS; ຄຳນຳ HTTP/2 ທີ່ສົ່ງຊື່ໄປຫາ listener proxy HTTP/1.1 ເລີ່ມຕົ້ນຢູ່ຊັ້ນທີ່ຜິດ.