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 ເລີ່ມຕົ້ນຢູ່ຊັ້ນທີ່ຜິດ.

ບົດຄວາມທີ່ກ່ຽວຂ້ອງ