Методы GET и CONNECT в прокси

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

Вот запросы GET и CONNECT от клиента, отправленные прокси-сервером на сервер:

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

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

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

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

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


person elmazzun    schedule 19.03.2016    source источник
comment
Можете ли вы включить то, что ваш прокси отправляет на сервер?   -  person Joel C    schedule 20.03.2016
comment
Stack Overflow — это сайт для вопросов по программированию и разработке. Этот вопрос кажется не по теме, потому что он не о программировании или разработке. См. раздел О каких темах я могу задать здесь в Справочном центре. Возможно, Суперпользователь или обмен стеками веб-приложений будет лучше спросить. См. также раздел Где размещать вопросы о Dev Ops?.   -  person jww    schedule 20.03.2016


Ответы (1)


  1. ПОЛУЧАТЬ. Синтаксис правильный, но если запрос не был вами подделан и он действительно направляется на www.gstatic.com, вы можете сами убедиться, что любые запросы генерируют 40-кратный код состояния. Это домен, используемый Google для разгрузки статического контента. Так ли это до сих пор и почему он возвращает 40x для запросов. Перейти в Google.

  2. СОЕДИНЯТЬ. Если вы перенаправляете CONNECT на сервер, это неправильно. CONNECT предназначен для открытия сквозного бинарного соединения в обход вашего прокси. Последовательность будет такой:

    • Get connect request from client
    • Откройте TCP-соединение с IP:Port (очевидно, после разрешения DNS)
    • Вернуть клиенту «200 OK», если соединение было успешно открыто, или код ошибки по вашему выбору (плюс, возможно, некоторое объяснение в текстовой/HTML-форме для конечного пользователя)
    • Если данные получены с любого конца -> пересылайте их на другой конец, пока одно из соединений не будет закрыто, когда вы закроете другой конец.
person mementum    schedule 20.03.2016
comment
Он должен удалить часть имени хоста и порта из запроса GET. Это только для прокси. - person user207421; 21.03.2016
comment
В запросе GET нет порта, а указание полного URL-адреса — это HTTP 1.1. Из RFC 2616 пример URI запроса: GET http://www.w3.org/pub/WWW/TheProject.html HTTP/1.1 - person mementum; 21.03.2016
comment
Итак, если я получаю CONNECT www.youtube.com:443 HTTP/1.1 Host: www.youtube.com:443 Proxy-Connection: keep-alive User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36 , TCP-соединение, которое я должен открыть, защищено SSL из-за порта 443? - person elmazzun; 21.03.2016
comment
Ваш прокси должен просто открывать бинарные подключения к сторонам и соединять их (посредством перемещения пакетов туда и обратно). SSL-соединение (если оно есть) будет открыто сторонами на концах, а не прокси-сервером. Конечно, можно перехватить соединение (MITM), как, например, Fiddler (telerik.com/fiddler ) позволяет вам отлаживать вещи. - person mementum; 21.03.2016