Máy chủ HTTP của Node xử lý một yêu cầu proxy thông thường thông qua callback yêu cầu. CONNECT đi theo con đường khác: máy chủ phát ra connect cùng với yêu cầu, socket của máy khách và một bộ đệm head.

Sự kiện đó là sự bàn giao giữa phân tích cú pháp HTTP và một tunnel. Không có đối tượng ServerResponse thông thường để tiếp tục dùng cho lưu lượng đã được đưa vào tunnel.

Đối sốNó mang gì
reqYêu cầu CONNECT, bao gồm thẩm quyền đích và các header của nó
clientSocketKết nối trở lại máy khách
headDữ liệu tunnel mà Node đã đọc vượt quá các header HTTP, có thể rỗng

Hoàn tất quyết định HTTP trước khi chuyển tiếp byte

Xác thực máy chủ và cổng được yêu cầu, áp dụng chính sách truy cập và xác thực của proxy, và thiết lập kết nối thượng nguồn. CONNECT xác định một thẩm quyền như service.example:443; phân tích cú pháp dạng đó với lưu ý đến các thẩm quyền IPv6 thay vì tách mù quáng ở mỗi dấu hai chấm.

Khi tunnel được chấp nhận, hãy gửi phản hồi HTTP thành công cùng dòng trống kết thúc của nó. Sau đó chuyển tiếp bất kỳ byte head nào lên thượng nguồn trước khi tiếp tục với các byte sau từ socket của máy khách. Việc gắn thêm một trình lắng nghe dữ liệu mới không thể lấy lại bộ đệm đã được giao riêng cho trình xử lý.

Ví dụ tunnel chính thức của Node thực hiện việc bàn giao đó bằng serverSocket.write(head) trước khi kết nối hai hướng luồng. Ví dụ nhỏ của nó minh họa quá trình chuyển đổi; một proxy được triển khai cũng cần các nỗ lực kết nối có giới hạn, kiểm soát truy cập và quản lý vòng đời.

Sau khi thành công, các byte thuộc về giao thức của dịch vụ

Phản hồi CONNECT thành công biến kết nối thành một luồng byte. Nếu mục tiêu là một trang HTTPS, trao đổi TLS của nó diễn ra bên trong luồng đó. Chỉ đưa vào tunnel không đòi hỏi proxy phát hành chứng chỉ trang web thay thế.

Trước khi chấp nhận CONNECT, một lỗi HTTP có thể giải thích lý do từ chối. Sau khi chấp nhận, việc ghi HTTP 500 vào luồng sẽ chèn byte vào giao thức đã được đưa vào tunnel. Thay vào đó, hãy kết thúc hoặc hủy các kết nối thích hợp khi có lỗi sau đó.

Kết nối cả hai hướng bằng xử lý luồng có nhận thức về áp lực ngược, và quyết định cách các sự kiện end, error và close kết thúc đối tác. Giữ lại bộ đệm head ban đầu như một phần của cùng mô hình sở hữu; đó là dữ liệu ứng dụng, không phải header HTTP thừa để bỏ đi.

Bài viết liên quan