Làm cách nào để gửi đúng yêu cầu GET và CONNECT từ proxy đến máy khách?


0

Tôi đang tạo proxy HTTP trong C ++; khi khách hàng gửi GEThoặc CONNECTyêu cầu tới proxy, proxy sẽ phân tích tiêu đề HTTP của gói, giải quyết tên máy chủ trong đó, mở một ổ cắm khác đến đích máy chủ và gửi yêu cầu của máy khách. Sau đó, proxy sẽ gửi phản hồi của máy chủ cho khách hàng.

Ví dụ, đây là những gì proxy gửi đến máy chủ khi anh ta nhận được GETyêu cầu hoặc CONNECTyêu cầu từ máy khách:

GET http://www.gstatic.com/generate_204 HTTP/1.1

CONNECT cr-input.getspeakit.com:443 HTTP/1.1

Nhưng khi tôi phân tích GETphản hồi từ máy chủ, tôi tìm thấy 400 mã trạng thái, nghĩa là Bad Request: đây dường như là (từ Wikipedia):

cú pháp yêu cầu không đúng định dạng, đóng khung thư yêu cầu không hợp lệ hoặc định tuyến yêu cầu lừa đảo.

Tôi có gửi các đối số sai đến máy chủ trong GETyêu cầu không?

Câu trả lời:


0

Khi máy khách HTTP gửi GETyêu cầu, tên máy chủ đích thường không nằm trong URI được yêu cầu. Đó là, thay vì gửi

GET http://www.gstatic.com/generate_204 HTTP/1.1

một khách hàng HTTP 1.1 gửi:

GET /generate_204 HTTP/1.1
Host: www.gstatic.com

Kể từ khi khách hàng "biết" mà nó cần phải giải quyết các tên DNS "www.gstatic.com" đến một địa chỉ IP, và gửi yêu cầu HTTP đến địa chỉ IP, nó không thực sự cần phải bao gồm tên máy một lần nữa như một phần của đường dẫn được yêu cầu. Các Hosttiêu đề là một gợi ý để các máy chủ của hostname yêu cầu ban đầu.

Lưu ý rằng các ngữ nghĩa trên được bao phủ bởi RFC 7230, Phần 5.3 . Và ở đó, nó làm nhà nước rằng "hình thức tuyệt đối" của tài nguyên / mục tiêu yêu cầu có thể bao gồm các lược đồ và hostname; đó là "mẫu gốc" mà tôi đã mô tả ở trên. Nếu máy chủ gốc / máy chủ đích của bạn trả về "400 Yêu cầu Không hợp lệ" cho "biểu mẫu tuyệt đối" mà proxy của bạn đang sử dụng, thì nó gợi ý a) rằng máy chủ đó không hỗ trợ "biểu mẫu tuyệt đối" hoặc b) có gì đó không đúng (thiếu Hostyêu cầu tiêu đề?).

Điều này có nghĩa là proxy HTTP của bạn không thực sự dựa vào tên máy chủ đích nằm trong dòng đầu tiên của yêu cầu HTTP (đối với máy khách HTTP có thể sử dụng "biểu mẫu gốc" của tài nguyên đích / yêu cầu; thay vào đó, proxy của bạn nên tìm các Host. header, nếu bạn cần phải biết thông tin đó Và để tránh những 400 Bad Requesttừ máy chủ gốc, tôi khuyên proxy của bạn gửi cho ví dụ :

GET /generate_204 HTTP/1.1
Host: www.gstatic.com

Đối với ngữ nghĩa của CONNECTphương pháp, xem RFC 7231, Mục 4.3.6 . Ở đó, chúng ta thấy rằng tài nguyên được yêu cầu phải bao gồm tên máy chủ và cổng. Bất kỳ 2xxphản hồi từ máy chủ đích cho thấy thành công; bất kỳ mã phản hồi nào khác chỉ ra rằng "đường hầm" được yêu cầu không được thiết lập. Phần còn lại của RFC có giá trị đọc, cho các trường hợp và hành vi cạnh khác.

Hi vọng điêu nay co ich!


Nó giúp ích rất nhiều, cảm ơn bạn rất nhiều Tôi không thể tìm thấy bất kỳ thông tin nào trong số này, ngay cả trong RFC. Bạn có biết một số liên kết nối lại những gì proxy nên gửi đến máy chủ và những gì proxy gửi lại cho khách hàng không? Ví dụ, CONNECTphương pháp.
elmazzun 20/03/2016

Tôi đã cập nhật bài viết của mình để bao gồm các liên kết đến các RFC có liên quan, bao gồm cả CONNECTphương pháp.
Castaglia
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.