NetworkStream.DataAvailable không đánh dấu kết thúc của một phản hồi HTTP
Ngăn tải xuống HTTP bị cắt cụt bằng cách dùng đóng khung thông điệp thay vì NetworkStream.DataAvailable làm điều kiện kết thúc.
NetworkStream.DataAvailable == false nghĩa là không có byte nào sẵn sàng để đọc ngay. Điều đó không có nghĩa là một phản hồi HTTP đã hoàn tất. Một vòng lặp dừng ở đó có thể cắt cụt một lượt tải SOCKS hoàn toàn bình thường trong khoảng trống giữa các gói.
Sau khi SOCKS thiết lập kết nối TCP, quy tắc hoàn tất vẫn do đóng khung HTTP quyết định:
- Phần thân có Content-Length kết thúc sau số byte nội dung đã khai báo.
- Phản hồi chunked cần chunk kết thúc và các trailer áp dụng.
- Phản hồi được giới hạn bởi kết nối kết thúc cùng kết nối.
- Một số mã trạng thái và phản hồi cho HEAD không có phần thân.
Hãy đọc mã trạng thái và phần đầu để xác định quy tắc áp dụng. Chỉ chờ đóng kết nối không phải giải pháp tổng quát, vì một phản hồi HTTP đầy đủ có thể để kết nối mở. Dung lượng của một bộ đệm cũng không liên quan đến độ dài phản hồi.
Dùng phần triển khai đóng khung của ứng dụng khách HTTP khi nó hỗ trợ phương thức vận chuyển qua proxy đã chọn. Trên một runtime .NET hiện đại tương thích, hãy cân nhắc hỗ trợ SOCKS gốc của HttpClient. Một triển khai thô phải giữ trạng thái phân tích qua các lần đọc phần đầu và phần thân từng phần, đồng thời phân biệt hoàn tất thành công với huỷ bỏ, hết thời gian và EOF bất ngờ. Với một yêu cầu đọc không rỗng, đọc được không byte nghĩa là luồng đã kết thúc; điều này khác với việc hiện tại không có byte nào trong hàng đợi.
Proxy có thể làm các khoảng trống thời gian trở nên rõ rệt, nhưng nó không biến một hàng đợi nhận rỗng thành dấu hiệu kết thúc thông điệp.