NetworkStream.DataAvailable ไม่ได้บ่งชี้จุดสิ้นสุดของการตอบกลับ HTTP
ป้องกันการดาวน์โหลด HTTP ที่ถูกตัดทอนโดยใช้การแบ่งเฟรมข้อความแทน NetworkStream.DataAvailable เป็นเงื่อนไขสิ้นสุด
NetworkStream.DataAvailable == false หมายความว่าไม่มีไบต์พร้อมอ่านทันที ไม่ได้หมายความว่าการตอบกลับ HTTP เสร็จสมบูรณ์ ลูปที่หยุดตรงนั้นอาจตัดการดาวน์โหลดผ่าน SOCKS ที่ปกติสมบูรณ์ในช่วงช่องว่างระหว่างแพ็กเก็ต
หลังจาก SOCKS สร้างการเชื่อมต่อ TCP แล้ว การแบ่งเฟรม HTTP ยังคงเป็นผู้กำหนดกฎการเสร็จสิ้น:
- เนื้อหาที่มี Content-Length สิ้นสุดหลังไบต์เนื้อหาที่ประกาศไว้
- การตอบกลับแบบ chunked ต้องมี chunk สุดท้ายและ trailer ที่เกี่ยวข้อง
- การตอบกลับที่กำหนดขอบเขตด้วยการเชื่อมต่อจะสิ้นสุดพร้อมการเชื่อมต่อ
- สถานะบางอย่างและการตอบกลับต่อ HEAD ไม่มีเนื้อหา
อ่านสถานะและส่วนหัวเพื่อกำหนดกฎที่ใช้ การรอเพียงการปิดไม่ใช่ทางแก้ทั่วไป เพราะการตอบกลับ HTTP ที่สมบูรณ์อาจปล่อยให้การเชื่อมต่อเปิดอยู่ ความจุของบัฟเฟอร์หนึ่งก็ไม่เกี่ยวข้องกับความยาวของการตอบกลับเช่นกัน
ใช้การทำงานของการแบ่งเฟรมของไคลเอนต์ HTTP เมื่อรองรับการส่งผ่านพร็อกซีที่เลือก บนรันไทม์ .NET ที่ทันสมัยและเข้ากันได้ ให้พิจารณาการรองรับ SOCKS แบบเนทีฟของ HttpClient การทำงานแบบดิบต้องเก็บสถานะการแยกวิเคราะห์ข้ามส่วนหัวบางส่วนและการอ่านเนื้อหา และแยกแยะการเสร็จสิ้นที่สำเร็จออกจากการยกเลิก การหมดเวลา และ EOF ที่ไม่คาดคิด สำหรับคำขออ่านที่ไม่ว่าง การอ่านศูนย์ไบต์หมายความว่าสตรีมสิ้นสุดแล้ว ซึ่งต่างจากตอนนี้ที่ไม่มีไบต์ในคิว
พร็อกซีอาจทำให้ช่องว่างของเวลาสังเกตเห็นได้ชัดขึ้น แต่ไม่ได้เปลี่ยนคิวรับที่ว่างเปล่าให้เป็นเครื่องหมายสิ้นสุดข้อความ