Một trình bao proxy nhỏ có thể hoạt động với HTTPS rồi bị treo khi được dùng lại cho một giao thức mà máy chủ nói trước. Dòng đáng ngờ thường là dòng chờ bộ đệm nhận kết thúc bằng \r\n\r\n.

TCP cung cấp cho máy khách một luồng. Một lần gọi nhận có thể trả về nửa dòng trạng thái HTTP, một phản hồi CONNECT đầy đủ, hoặc phản hồi đó theo sau ngay lập tức bởi dữ liệu đường hầm. Không có lời hứa rằng việc đọc sẽ dừng ở cuối các tiêu đề.

Tìm ranh giới bên trong bộ đệm

Với một trao đổi HTTP/1.1 CONNECT, hãy tích lũy byte cho đến khi dấu kết thúc tiêu đề xuất hiện ở bất kỳ đâu trong bộ đệm. Tách tại lần xuất hiện đầu tiên. Phân tích dòng trạng thái và các tiêu đề từ phần đầu tiên; giữ riêng mọi thứ sau ranh giới. Áp dụng giới hạn kích thước tiêu đề và thời gian chờ trong khi chờ, và coi việc đọc socket rỗng là kết nối đã đóng chứ không phải lời mời lặp lại.

Phản hồi 2xx thành công cuối cùng chuyển kết nối sang chế độ đường hầm ngay sau các tiêu đề đó. Các byte tiếp theo đã là byte đường hầm. Đừng loại bỏ chúng, đừng chờ phần thân phản hồi CONNECT, và đừng diễn giải trường Content-Length như sự cho phép tiêu thụ một phần giao thức mới. Các phản hồi mang tính thông tin, nếu có, phải được xử lý trước phản hồi cuối cùng đó.

Trình bao phải chuyển tiếp phần còn lại của nó

Chỉ trả về socket bên dưới sẽ làm mất các byte mà bộ phân tích bắt tay đã kéo ra khỏi nó. Người đọc tiếp theo cần một luồng có bộ đệm, trước tiên trả phần đuôi đã lưu rồi tiếp tục đọc từ socket. Với giao thức máy chủ nói trước, việc mất lời chào đầu tiên đó có thể khiến cả hai bên chờ vô hạn.

Ngược lại, các byte từ một phản hồi CONNECT thất bại không phải là lời chào đường hầm. 407 vẫn thuộc về trao đổi proxy và cần xử lý xác thực; một trạng thái không thành công khác cần một đường dẫn lỗi phù hợp.

Điều này đặc biệt quan trọng khi điều chỉnh một máy khách FTP hoặc SSH qua proxy HTTP. Proxy cũng phải cho phép cổng đích được yêu cầu, và FTP có thể cần thêm các kết nối dữ liệu. Phân tích tiêu đề đúng sẽ giải quyết việc bàn giao luồng; nó không thể cấp quyền CONNECT hay cung cấp kênh thứ hai của FTP.

Bài viết liên quan