ຕົວຈັດການ CONNECT ຂອງ Node.js ຕ້ອງຮັກສາ head buffer
ຈັດການ CONNECT socket ແລະ head buffer ຂອງ Node ຢູ່ຊາຍແດນ HTTP ຫາ tunnel, ຮັກສາ byte ທີ່ອ່ານແລ້ວເກີນ headers.
HTTP server ຂອງ Node ຈັດການຄຳຮ້ອງ proxy ທຳມະດາຜ່ານ request callback ຂອງມັນ. CONNECT ໄປທາງອື່ນ: server ປ່ອຍ connect ພ້ອມກັບຄຳຮ້ອງ, client socket ແລະ head buffer.
ເຫດການນັ້ນແມ່ນການສົ່ງຕໍ່ລະຫວ່າງການແຍກ HTTP ແລະ tunnel. ບໍ່ມີວັດຖຸ ServerResponse ທຳມະດາທີ່ຈະສືບຕໍ່ໃຊ້ສຳລັບການຈະລາຈອນ tunnel.
| ອາກູເມັນ | ມັນບັນທຸກຫຍັງ |
|---|---|
req | ຄຳຮ້ອງ CONNECT, ລວມທັງອຳນາດປາຍທາງ ແລະ headers |
clientSocket | ການເຊື່ອມຕໍ່ກັບໄປຫາ client |
head | ຂໍ້ມູນ tunnel ທີ່ Node ອ່ານແລ້ວເກີນ headers HTTP, ອາດຈະຫວ່າງເປົ່າ |
ຈົບການຕັດສິນ HTTP ກ່ອນສົ່ງ byte
ກວດສອບ host ແລະ port ທີ່ຮ້ອງຂໍ, ໃຊ້ນະໂຍບາຍການເຂົ້າເຖິງ ແລະ ການພິສູດຕົວຕົນຂອງ proxy ແລະ ສ້າງການເຊື່ອມຕໍ່ຂຶ້ນເທິງ. CONNECT ລະບຸອຳນາດເຊັ່ນ service.example:443; ວິເຄາະຮູບແບບນັ້ນໂດຍຄຳນຶງເຖິງອຳນາດ IPv6 ແທນທີ່ຈະແບ່ງຢ່າງຕາບອດໃນທຸກຈຸດສອງຈຸດ.
ເມື່ອ tunnel ຖືກຮັບ, ສົ່ງການຕອບສະໜອງ HTTP ທີ່ສຳເລັດ ແລະ ແຖວຫວ່າງທີ່ສິ້ນສຸດຂອງມັນ. ຈາກນັ້ນສົ່ງ byte head ໃດໆຂຶ້ນເທິງ ກ່ອນຈະສືບຕໍ່ກັບ byte ຕໍ່ໄປຈາກ client socket. ການເຊື່ອມຕໍ່ຜູ້ຟັງຂໍ້ມູນໃໝ່ບໍ່ສາມາດກູ້ buffer ທີ່ສົ່ງໃຫ້ຕົວຈັດການແຍກຕ່າງຫາກແລ້ວຄືນໄດ້.
ຕົວຢ່າງ tunnel ທາງການຂອງ Node ເຮັດການສົ່ງຕໍ່ນັ້ນດ້ວຍ serverSocket.write(head) ກ່ອນເຊື່ອມຕໍ່ສອງທິດທາງ stream. ຕົວຢ່າງນ້ອຍຂອງມັນສະແດງການປ່ຽນແປງ; proxy ທີ່ຕິດຕັ້ງແລ້ວຍັງຕ້ອງການຄວາມພະຍາຍາມເຊື່ອມຕໍ່ທີ່ມີຂອບເຂດ, ການຄວບຄຸມການເຂົ້າເຖິງ ແລະ ການຈັດການວົງຈອນຊີວິດ.
ຫຼັງຈາກສຳເລັດ, byte ເປັນຂອງໂປໂຕຄອນບໍລິການ
ການຕອບສະໜອງ CONNECT ທີ່ສຳເລັດປ່ຽນການເຊື່ອມຕໍ່ເປັນ byte stream. ຖ້າເປົ້າໝາຍແມ່ນເວັບໄຊ HTTPS, ການແລກປ່ຽນ TLS ຂອງມັນເດີນທາງຢູ່ໃນ stream ນັ້ນ. ການເຮັດ tunnel ພຽງຢ່າງດຽວບໍ່ຕ້ອງການໃຫ້ proxy ອອກໃບຢັ້ງຢືນເວັບໄຊທົດແທນ.
ກ່ອນຮັບ CONNECT, ຂໍ້ຜິດພາດ HTTP ສາມາດອະທິບາຍເຫດຜົນທີ່ຖືກປະຕິເສດ. ຫຼັງຈາກຮັບແລ້ວ, ການຂຽນ HTTP 500 ໃສ່ stream ຈະສັກ byte ເຂົ້າໃນໂປໂຕຄອນ tunnel. ແທນທີ່ນັ້ນ, ຢຸດ ຫຼື ທຳລາຍການເຊື່ອມຕໍ່ທີ່ເໝາະສົມເມື່ອລົ້ມເຫຼວໃນພາຍຫຼັງ.
ເຊື່ອມຕໍ່ທັງສອງທິດທາງກັບ ການຈັດການ stream ທີ່ຮູ້ເຖິງ backpressure, ແລະ ຕັດສິນວ່າເຫດການ end, error ແລະ close ສິ້ນສຸດຄູ່ຮ່ວມຢ່າງໃດ. ຮັກສາ head buffer ເບື້ອງຕົ້ນເປັນສ່ວນໜຶ່ງຂອງຮູບແບບຄວາມເປັນເຈົ້າດຽວກັນ; ມັນແມ່ນຂໍ້ມູນແອັບພລິເຄຊັນ, ບໍ່ແມ່ນ headers HTTP ເກີນທີ່ຈະຖິ້ມ.