Phần thân POST của proxy HTTP Python có thể được đệm trong rfile
Đọc một yêu cầu proxy HTTP Python qua đầu vào có bộ đệm của handler thay vì chờ các byte đã rời khỏi bộ đệm socket.
Proxy chuyển tiếp đọc dòng yêu cầu và các tiêu đề, chuyển chúng đi, rồi chờ trong select một phần thân POST. Máy khách đã gửi nó rồi. Hai bên dường như đang chờ nhau.
Với BaseHTTPRequestHandler của Python, việc đọc tiêu đề đi qua rfile, một luồng đầu vào có bộ đệm. Luồng đó có thể đọc trước và giữ các byte thuộc về phần thân. Chờ trên socket bên dưới chỉ hỏi bộ mô tả tệp của nó đã sẵn sàng chưa; nó không hỏi luồng Python đã chứa dữ liệu dùng được chưa.
Đi theo bộ đệm đã đọc các tiêu đề
Cũng đọc phần thân qua self.rfile. Đừng chuyển sang self.connection.recv sau khi phân tích tiêu đề bằng luồng có bộ đệm. Nếu không, mã có thể bỏ qua các byte mà luồng đó đang giữ và chờ dữ liệu sẽ không bao giờ được gửi lại.
Truyền chính rfile cho select không khiến select kiểm tra bộ đệm Python của nó. API sẵn sàng hoạt động qua bộ mô tả tệp của đối tượng.
Với một yêu cầu có một Content-Length hợp lệ và không có Transfer-Encoding, hãy tiêu thụ đúng số byte đã khai báo, xử lý việc kết thúc đầu vào sớm cùng các giới hạn kích thước và thời gian của bạn. Đừng đọc đến EOF: máy khách dùng kết nối liên tục có thể giữ kết nối mở sau khi hoàn tất yêu cầu.
Biến việc đóng khung thành phần rõ ràng của proxy
Phần thân yêu cầu dạng chunked cần hỗ trợ đóng khung chunked. Không thể đọc chúng bằng cách tìm một Content-Length không tồn tại. Siêu dữ liệu độ dài mơ hồ cần một đường từ chối được xác định, thay vì chọn tiêu đề có vẻ thuận tiện.
Một handler chặn có thể tiếp tục dùng giao diện luồng của nó với các lần đọc có giới hạn. Proxy hướng sự kiện cần một mô hình bộ đệm tích hợp việc đọc trước của bộ phân tích với xử lý sẵn sàng. Thay đổi thời gian chờ sẽ không dung hòa hai bên tiêu thụ độc lập của cùng một socket.
Chẩn đoán này đặc trưng cho việc các byte đến được giữ ở đâu. Sau khi proxy đã tiêu thụ đúng phần thân, nó vẫn cần chuyển tiếp phần thân đó với khung HTTP nhất quán. Handler http.server tiêu chuẩn là nơi hữu ích để hiểu cơ chế, nhưng nó không phải là một triển khai proxy chuyển tiếp cho môi trường thực.