จัดการ EOF ในลูปอ่าน SOCKS ของ Python
จัดการ EOF อย่างชัดเจนในลูปอ่านแบบตรงตัวของ SOCKS แทนที่จะถือว่าการเชื่อมต่อที่ปิดแล้วเป็นเวลาหมดเวลาที่ไม่มาเลย
ลูปหนึ่งต้องการแปดไบต์ของคำตอบ SOCKS ได้รับมาแล้วสาม การอ่านครั้งถัดไปคืน b'' ลูปจึงต่อท้าย ตรวจความยาว แล้วลองใหม่ไม่สิ้นสุด
นี่คือบั๊กในการจัดการ EOF ไม่ใช่พร็อกซีที่ช้าซึ่งต้องใช้เวลาหมดเวลานานขึ้น ในการรับผ่านซ็อกเก็ตแบบสตรีมปกติ สตริงไบต์ว่างหมายความว่าคู่ปลายทางตัดการเชื่อมต่อแล้ว ห้าไบต์ที่เหลือจะไม่มาทางการเชื่อมต่อนั้น
ตัวช่วยอ่านแบบตรงตัวต้องแยกผลลัพธ์สามอย่าง: สะสมส่วนที่ไม่ว่าง ล้มเหลวที่ EOF ก่อนถึงความยาวที่ต้องการ และส่งต่อเวลาหมดเวลาหรือข้อผิดพลาดซ็อกเก็ตอื่น ๆ กรณีเหล่านี้ไม่ควรหลอมรวมเป็นลูปพยายามซ้ำทั่วไปเพียงอันเดียว
ตั้งเวลาหมดเวลาที่ต้องการของซ็อกเก็ตก่อนการดำเนินการ และอ่านความยาวฟิลด์ที่โปรโตคอลพร็อกซีกําหนด การรับครั้งเดียวอาจคืนได้เพียงส่วนหนึ่งของคำตอบ ในทางกลับกัน การขอบัฟเฟอร์คงที่ขนาดใหญ่ไม่ได้ทำให้ทุกที่อยู่ SOCKS มีความยาวนั้น
อย่าแก้ไข dependency โดยการวางสนิปเพต MSG_WAITALL เก่าลงในซอร์สและสมมติว่าครอบคลุม EOF สัญญาณ และพฤติกรรมแพลตฟอร์ม ควรเลือกการแก้ไขที่รองรับของ implementation ที่ดูแลอยู่ หรือตั้งใจ implement สัญญาของตัวช่วยเมื่อ parser เป็นโค้ดของคุณเอง
เก็บจำนวนไบต์ที่คาดหวังและที่ได้รับ โดยไม่บันทึกเพย์โหลดข้อมูลรับรอง “EOF หลังจากสามในแปดไบต์ของคำตอบ” อธิบายการแลกเปลี่ยนที่เสียได้ดีกว่า “พร็อกซีค้างอีกแล้ว” มาก