ตัวจัดการ CONNECT ของ Node.js ต้องรักษา head buffer
จัดการ CONNECT socket และ head buffer ของ Node ที่ขอบเขต HTTP ไปยัง tunnel โดยรักษาไบต์ที่อ่านไปแล้วเลย headers
เซิร์ฟเวอร์ HTTP ของ Node จัดการคำขอพร็อกซีทั่วไปผ่าน callback ของคำขอ CONNECT ใช้เส้นทางอื่น: เซิร์ฟเวอร์ส่ง connect พร้อมกับคำขอ ไคลเอนต์ซ็อกเก็ต และ head buffer
เหตุการณ์นั้นคือการส่งมอบระหว่างการแยกวิเคราะห์ HTTP กับ tunnel ไม่มีออบเจกต์ ServerResponse ปกติให้ใช้ต่อสำหรับทราฟฟิกที่อุโมงค์แล้ว
| อาร์กิวเมนต์ | สิ่งที่มันบรรทุก |
|---|---|
req | คำขอ CONNECT รวมถึงอำนาจปลายทางและ headers |
clientSocket | การเชื่อมต่อกลับไปยังไคลเอนต์ |
head | ข้อมูล tunnel ที่ Node อ่านไปแล้วเลย headers HTTP อาจว่างเปล่า |
จบการตัดสินใจ HTTP ก่อนส่งต่อไบต์
ตรวจสอบโฮสต์และพอร์ตที่ร้องขอ ใช้นโยบายการเข้าถึงและการรับรองความถูกต้องของพร็อกซี และสร้างการเชื่อมต่อต้นน้ำ CONNECT ระบุอำนาจเช่น service.example:443; แยกวิเคราะห์รูปแบบนั้นโดยคำนึงถึงอำนาจ IPv6 แทนการแบ่งแบบไม่ดูตาม้าตาเรือที่ทุกจุดทวิภาค
เมื่อยอมรับ tunnel แล้ว ให้ส่งการตอบสนอง HTTP ที่สำเร็จตามด้วยบรรทัดว่างที่สิ้นสุด จากนั้นส่งต่อไบต์ head ใด ๆ ไปยังต้นน้ำก่อนดำเนินการกับไบต์ถัดไปจากไคลเอนต์ซ็อกเก็ต การแนบตัวรับฟังข้อมูลใหม่ไม่สามารถกู้คืนบัฟเฟอร์ที่ถูกส่งมอบแยกต่างหากให้ตัวจัดการแล้ว
ตัวอย่าง tunnel อย่างเป็นทางการของ Node ดำเนินการส่งมอบนั้นด้วย serverSocket.write(head) ก่อนเชื่อมต่อทั้งสองทิศทางของสตรีม ตัวอย่างเล็ก ๆ ของมันแสดงให้เห็นการเปลี่ยนผ่าน พร็อกซีที่ปรับใช้จริงยังต้องการความพยายามเชื่อมต่อที่มีขอบเขต การควบคุมการเข้าถึง และการจัดการวงจรชีวิต
หลังจากสำเร็จ ไบต์เป็นของโปรโตคอลของบริการ
การตอบสนอง CONNECT ที่สำเร็จเปลี่ยนการเชื่อมต่อเป็นสตรีมไบต์ หากเป้าหมายเป็นเว็บไซต์ HTTPS การแลกเปลี่ยน TLS จะเดินทางภายในสตรีมนั้น การทำ tunnel เพียงอย่างเดียวไม่กำหนดให้พร็อกซีออกใบรับรองเว็บไซต์ทดแทน
ก่อนยอมรับ CONNECT ข้อผิดพลาด HTTP สามารถอธิบายเหตุผลที่ปฏิเสธได้ หลังยอมรับ การเขียน HTTP 500 ลงในสตรีมจะฉีดไบต์เข้าไปในโปรโตคอล tunnel แทนที่จะเป็นเช่นนั้น ให้สิ้นสุดหรือทำลายการเชื่อมต่อที่เหมาะสมเมื่อเกิดความล้มเหลวในภายหลัง
เชื่อมต่อทั้งสองทิศทางด้วย การจัดการสตรีมที่ตระหนักถึงแรงดันย้อนกลับ และตัดสินใจว่าเหตุการณ์ end, error และ close ยุติคู่ตรงข้ามอย่างไร รักษา head buffer เริ่มต้นไว้เป็นส่วนหนึ่งของแบบจำลองความเป็นเจ้าของเดียวกัน มันเป็นข้อมูลแอปพลิเคชัน ไม่ใช่ headers HTTP ส่วนเกินที่จะทิ้ง