พร็อกซีส่งต่ออ่านบรรทัดคำขอและเฮดเดอร์ ส่งต่อแล้วรอใน select สำหรับบอดี้ POST ไคลเอนต์ส่งมาแล้ว ทั้งสองฝ่ายดูเหมือนรอกันและกัน

ด้วย BaseHTTPRequestHandler ของ Python การอ่านเฮดเดอร์ผ่าน rfile ซึ่งเป็นสตรีมอินพุตที่บัฟเฟอร์ สตรีมนั้นสามารถอ่านล่วงหน้าและถือไบต์ที่เป็นของบอดี้ไว้ได้ การรอที่ซ็อกเก็ตข้างใต้ถามเพียงว่า file descriptor พร้อมหรือไม่ ไม่ได้ถามว่าสตรีม Python มีข้อมูลที่ใช้ได้อยู่แล้วหรือไม่

ตามบัฟเฟอร์ที่อ่านเฮดเดอร์

อ่านบอดี้ผ่าน self.rfile ด้วย อย่าสลับไปใช้ self.connection.recv หลังจากแยกวิเคราะห์เฮดเดอร์ด้วยสตรีมที่บัฟเฟอร์แล้ว มิฉะนั้นโค้ดอาจข้ามไบต์ที่สตรีมนั้นถืออยู่และรอข้อมูลที่จะไม่ถูกส่งอีก

การส่ง rfile เองไปยัง select ไม่ได้ทำให้ select ตรวจสอบบัฟเฟอร์ Python ของมัน API ความพร้อมทำงานผ่าน file descriptor ของอ็อบเจกต์

สำหรับคำขอที่มี Content-Length ที่ถูกต้องหนึ่งค่าและไม่มี Transfer-Encoding ให้ใช้จำนวนไบต์ที่ประกาศไว้อย่างแม่นยำ พร้อมจัดการการสิ้นสุดอินพุตก่อนเวลาและขีดจำกัดขนาดและเวลาของคุณ อย่าอ่านจนถึง EOF: ไคลเอนต์ที่ใช้การเชื่อมต่อแบบคงอยู่อาจเปิดการเชื่อมต่อค้างไว้หลังจากจบคำขอ

ทำให้การกรอบเป็นส่วนที่ชัดเจนของพร็อกซี

บอดี้คำขอแบบ chunked ต้องการการรองรับการกรอบแบบ chunked ไม่สามารถอ่านได้โดยการหา Content-Length ที่ไม่มีอยู่ ข้อมูลเมตาความยาวที่กำกวมต้องการเส้นทางการปฏิเสธที่กำหนดไว้ แทนที่จะเลือกเฮดเดอร์ที่ดูสะดวก

handler แบบบล็อกสามารถใช้ส่วนต่อประสานสตรีมต่อไปได้ด้วยการอ่านแบบมีขอบเขต พร็อกซีที่ขับเคลื่อนด้วยเหตุการณ์ต้องการโมเดลบัฟเฟอร์ที่รวมการอ่านล่วงหน้าของ parser เข้ากับการจัดการความพร้อม การเปลี่ยน timeout จะไม่ทำให้ผู้บริโภคสองรายที่เป็นอิสระของซ็อกเก็ตเดียวกันปรองดองกัน

การวินิจฉัยนี้เจาะจงว่าไบต์ขาเข้าถูกถือไว้ที่ใด เมื่อพร็อกซีใช้บอดี้ที่ถูกต้องแล้ว ก็ยังต้องส่งต่อบอดี้้นั้นด้วยการกรอบ HTTP ที่สอดคล้องกัน handler http.server มาตรฐานเป็นสถานที่ที่มีประโยชน์ในการทำความเข้าใจกลไก แต่ไม่ใช่การใช้งานพร็อกซีส่งต่อสำหรับการผลิต

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