Xử lý EOF trong vòng lặp đọc SOCKS của Python
Xử lý EOF một cách tường minh trong vòng lặp đọc chính xác SOCKS thay vì coi một kết nối đã đóng là thời gian chờ không bao giờ đến.
Một vòng lặp muốn tám byte của một phản hồi SOCKS. Nó đã nhận được ba. Lần đọc tiếp theo trả về b'', vòng lặp nối nó vào, kiểm tra độ dài và thử lại mãi mãi.
Đó là lỗi xử lý EOF, không phải một proxy chậm cần thời gian chờ dài hơn. Trong một lần nhận thông thường qua socket luồng, một chuỗi byte rỗng nghĩa là đối tác đã ngắt kết nối. Năm byte còn lại sẽ không đến trên kết nối đó.
Một trình trợ giúp đọc chính xác cần ba kết quả riêng biệt: tích lũy các đoạn không rỗng, thất bại khi gặp EOF trước độ dài yêu cầu, và truyền tiếp thời gian chờ hoặc lỗi socket khác. Những trường hợp đó không nên gộp vào một vòng lặp thử lại chung duy nhất.
Đặt thời gian chờ dự định của socket trước thao tác, và đọc độ dài trường do giao thức proxy quy định. Một lần nhận chỉ có thể trả về một phần của phản hồi. Ngược lại, yêu cầu một bộ đệm cố định lớn không làm mọi địa chỉ SOCKS có độ dài đó.
Đừng sửa một phụ thuộc bằng cách dán đoạn MSG_WAITALL cũ vào mã nguồn của nó và cho rằng nó bao quát EOF, tín hiệu và hành vi nền tảng. Hãy ưu tiên bản sửa được hỗ trợ của triển khai được duy trì, hoặc cố ý thực hiện hợp đồng của trình trợ giúp khi trình phân tích là mã của bạn.
Giữ lại số byte đã mong đợi và đã nhận, không ghi nhật ký tải trọng thông tin xác thực. “EOF sau ba trong tám byte phản hồi” giải thích cuộc trao đổi bị hỏng tốt hơn nhiều so với “proxy lại treo”.