Как правильно отправлять запросы GET и CONNECT от прокси к клиенту?

я делаю HTTP прокси в C++; когда клиент отправляет GET или CONNECT запрос к прокси, прокси анализирует HTTP заголовок пакета, разрешает имя хоста в нем, открывает другой сокет к месту назначения сервера и отправляет запрос клиента. Затем прокси отправит ответ сервера клиенту.

вот, например, что прокси-сервер отправляет на сервер, когда он получает GET запрос или CONNECT запрос от клиента:

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

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

но когда я parse a GET ответ от сервера, нахожу код состояния 400, т. е. Bad Request: это, кажется, (из Википедии):

неправильный синтаксис запроса, неверное обрамление сообщения запроса или обманчивая маршрутизация запроса.

Я посылаю неправильные аргументы на сервер в GET запрос?

24
задан elmazzun
06.12.2022 8:02 Количество просмотров материала 3479
Распечатать страницу

1 ответ

когда HTTP-клиент отправляет GET запрос, имя хоста назначения обычно не в URI. То есть вместо отправки

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

клиент HTTP 1.1 отправляет:

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

так как клиент "знает", что ему нужно разрешить DNS-имя "www.gstatic.com" на IP-адрес, и отправить HTTP-запрос на этот IP-адрес, на самом деле не нужно включать имя хоста снова в рамках запрошенный путь. The Host заголовок является подсказкой к серверу первоначально запрошенного имени хоста.

обратите внимание, что вышеупомянутые семантики покрыты RFC 7230, раздел 5.3. А там, it тут укажите, что "абсолютная форма" запрашиваемого / целевого ресурса может включите схему и имя хоста; это "исходная форма", которую я описал выше. Если ваш сервер отправления / назначения возвращает "400 неверных запросов" для " абсолютной формы" то, что использует ваш прокси, предполагает либо a) этот сервер не поддерживает "абсолютную форму" или b) что-то не так (отсутствует Host заголовка запроса?).

это означает, что ваш HTTP прокси не должен действительно полагаться на имя хоста назначения, находящегося в первой строке HTTP-запроса (для HTTP client может используйте "исходную форму" запрашиваемого / целевого ресурса; вместо этого ваш прокси должен искать Host заголовок, Если вам нужно знать эту информацию. И чтобы избежать 400 Bad Request от сервера происхождения, я рекомендую, чтобы ваш прокси отправить например:

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

на содержание CONNECT метод, см. RFC 7231, раздел 4.3.6. Там мы видим, что запрашиваемый ресурс должны состоит из имени хоста и порта. Любой 2xx ответ от сервера назначения указывает на успех; любой другой код ответа указывает, что запрашиваемые "туннель" не настроен. Остальная часть RFC там стоит прочитать для других крайних случаев и поведения.

надеюсь, что это помогает!

0
отвечен Castaglia 2022-12-07 15:50

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх