ไคลเอนต์เห็น 200 Connection Established เริ่ม TLS แล้วรายงานเรื่องไร้สาระทันทีในตำแหน่งที่ควรมีระเบียน TLS ค้นหาการตอบกลับ HTTP ที่ยังไม่สมบูรณ์ก่อนจะโทษการตั้งค่าหมายเลขรหัสของปลายทาง

ในการแลกเปลี่ยน HTTP/1 CONNECT บรรทัดสถานะเป็นเพียงจุดเริ่มต้นของการตอบกลับ อาจมีฟิลด์ส่วนหัวตามมา บรรทัดว่างที่ปิดส่วนหัวคือจุดที่บ่งบอกการเปลี่ยนผ่านเข้าอุโมงค์ หลังการตอบกลับ CONNECT ที่สำเร็จ

HTTP/1.1 200 Connection Established\r\n
Proxy-Agent: example\r\n
\r\n

ไบต์เหล่านี้อาจมาถึงในการอ่านครั้งเดียว หลายครั้ง หรือในการอ่านที่มีไบต์ถัดไปปนอยู่ด้วย TCP ไม่ได้รักษาขอบเขตการเขียนของเซิร์ฟเวอร์

ทำให้การส่งต่อเป็นสถานะของตัวแยกวิเคราะห์อย่างชัดเจน

  1. รวบรวมและแยกวิเคราะห์บรรทัดสถานะ ใช้รหัสสถานะที่เป็นตัวเลขแทนวลีเหตุผลภาษาอังกฤษแบบตรงตัว
  2. อ่านต่อไปจนกว่าเครื่องหมายสิ้นสุดของส่วนหัวจะมาครบ บรรทัดสถานะที่สำเร็จไม่ได้ทำให้ฟิลด์ที่เหลือหายไป
  3. เมื่อการตอบกลับ CONNECT สำเร็จ ให้ถือไบต์ถัดจากเครื่องหมายสิ้นสุดนั้นเป็นจุดเริ่มต้นของข้อมูลอุโมงค์ สำหรับการตอบกลับอื่นให้ทำตามการจัดการการตอบกลับ HTTP และการยืนยันตัวตนที่เหมาะสม
  4. ย้ายการเชื่อมต่อและไบต์ที่ยังไม่ได้ใช้ผ่านอินเทอร์เฟซ I/O แบบมีบัฟเฟอร์ที่โปรโตคอลถัดไปรองรับ

ขั้นตอนสุดท้ายสำคัญแม้การค้นหาตัวคั่นจะดี ตัวอ่านแบบมีบัฟเฟอร์อาจใช้ socket ไปมากกว่าที่ตัวแยกวิเคราะห์ขอ การเริ่ม TLS บน socket เปล่าโดยทิ้งตัวอ่านนั้นอาจทำให้ไบต์ค้างอยู่ในบัฟเฟอร์ส่วนตัวของตัวอ่าน

ใช้กำหนดเวลาตั้งค่าและขีดจำกัดขนาดส่วนหัว EOF ก่อนถึงเครื่องหมายสิ้นสุดคือการตอบกลับพร็อกซีที่ไม่สมบูรณ์ ไม่ใช่คำเชิญให้รอตลอดไปหรือลอง TLS อยู่ดี

คิดผ่านขอบเขตหลายแบบ

ลองนึกถึงการอ่านที่สิ้นสุดหลัง Proxy-Agent: ตัวแยกวิเคราะห์ยังต้องใช้ไบต์ส่วนหัว HTTP เพิ่มอีก ลองนึกถึงอีกครั้งที่สิ้นสุดกลางลำดับ CRLF สุดท้าย นั่นยังไม่ใช่ส่วนหัวที่สมบูรณ์ ตอนนี้ลองนึกถึงส่วนหัวที่สมบูรณ์และสำเร็จแล้วตามด้วยไบต์อุโมงค์ในบัฟเฟอร์เดียวกัน ไบต์ส่วนเกินเหล่านั้นต้องผ่านการส่งต่อให้ได้

407 เป็นผลลัพธ์อีกแบบ ต้องมีการจัดการการยืนยันตัวตน ไม่ได้อนุญาตให้ส่ง TLS ClientHello เข้าอุโมงค์ที่ไม่เคยเปิด

เลือกตัวเชื่อมต่อที่ได้รับการดูแล เว้นแต่การใช้งานแฮนด์เชกเองคือตัวงาน ขอบเขตนี้เฉพาะกับการแลกเปลี่ยน HTTP/1 ที่แสดงไว้ที่นี่ พร็อกซี HTTP/2 พา CONNECT บนสตรีมที่มีการจัดเฟรมต่างออกไป

บทความที่เกี่ยวข้อง