Chờ dòng trống sau CONNECT
Đọc toàn bộ phản hồi HTTP/1 CONNECT trước khi giao socket cho TLS, kể cả khi dòng trạng thái đến trước.
Máy khách thấy 200 Connection Established, khởi động TLS và ngay lập tức báo những thứ vô nghĩa ở chỗ đáng lẽ phải có bản ghi TLS. Hãy tìm một phản hồi HTTP chưa hoàn tất trước khi đổ lỗi cho cấu hình mật mã của đích.
Trong một lần trao đổi HTTP/1 CONNECT, dòng trạng thái chỉ là phần đầu của phản hồi. Các trường tiêu đề có thể theo sau. Dòng trống kết thúc phần tiêu đề đánh dấu việc chuyển sang đường hầm sau một phản hồi CONNECT thành công.
HTTP/1.1 200 Connection Established\r\n
Proxy-Agent: example\r\n
\r\n
Những byte đó có thể đến trong một lần đọc, nhiều lần đọc, hoặc một lần đọc có kèm cả các byte tiếp theo. TCP không giữ nguyên ranh giới ghi của máy chủ.
Biến việc bàn giao thành một trạng thái bộ phân tích tường minh
- Thu thập và phân tích dòng trạng thái. Dùng mã trạng thái số thay vì cụm lý do tiếng Anh chính xác.
- Tiếp tục cho đến khi ký tự kết thúc đầy đủ của phần tiêu đề đã đến. Một dòng trạng thái thành công không làm các trường còn lại biến mất.
- Với phản hồi CONNECT thành công, coi byte ngay sau ký tự kết thúc đó là điểm bắt đầu dữ liệu đường hầm. Với các phản hồi khác, hãy theo cách xử lý phản hồi HTTP và xác thực phù hợp.
- Chuyển giao kết nối và mọi byte chưa dùng qua giao diện I/O có bộ đệm mà giao thức kế tiếp hỗ trợ.
Bước cuối vẫn quan trọng kể cả khi việc tìm dấu phân cách đã tốt. Một trình đọc có bộ đệm có thể đã tiêu thụ nhiều socket hơn mức bộ phân tích yêu cầu. Khởi động TLS trên socket trần trong khi bỏ mặc trình đọc đó có thể để byte mắc lại trong bộ đệm riêng của trình đọc.
Dùng thời hạn thiết lập và giới hạn kích thước tiêu đề. EOF trước ký tự kết thúc là phản hồi proxy chưa đầy đủ, không phải lời mời chờ mãi hay cứ thử TLS.
Suy nghĩ qua vài ranh giới
Hãy tưởng tượng một lần đọc kết thúc ngay sau Proxy-Agent:. Bộ phân tích vẫn cần thêm byte tiêu đề HTTP. Hãy tưởng tượng một lần khác kết thúc giữa chuỗi CRLF cuối cùng. Đó vẫn chưa phải phần tiêu đề đầy đủ. Giờ hãy tưởng tượng một phần tiêu đề đầy đủ thành công, theo sau là byte đường hầm trong cùng bộ đệm: những byte thừa đó phải sống sót qua việc bàn giao.
407 là một kết cục khác. Nó cần xử lý xác thực; nó không cho phép TLS ClientHello đi vào một đường hầm chưa từng mở.
Ưu tiên một bộ kết nối được duy trì trừ khi chính việc triển khai bắt tay là nhiệm vụ. Ranh giới này riêng cho trao đổi HTTP/1 được trình bày ở đây. Proxy HTTP/2 mang CONNECT trên một luồng có cách đóng khung khác.