Вы не можете просто перенаправить домены в вашем файле HOSTS
и ожидать, что все будет работать волшебным образом.Это не то, как работает прокси.
Вы должны явно настроить веб-браузеры для отправки HTTP-запросов через HTTP-прокси, чтобы они форматировали правильные запросы, понятные прокси.Отправка HTTP-запроса напрямую на целевой веб-сервер обрабатывается иначе, чем отправка того же HTTP-запроса через прокси.
Вы получаете исключение, поскольку запросы браузера не нацелены на ваш прокси должным образом.
Например, когда браузер отправляет запрос HTTP GET
непосредственно на целевой веб-сервер, он подключается непосредственно к этому серверу, а затем отправляет запрос, который выглядит примерно так:
GET /path HTTP/1.1
Host: server.com
Но когдаон отправляет тот же запрос через HTTP-прокси, подключается к прокси-серверу и отправляет запрос, который выглядит следующим образом:
GET http://server.com/path HTTP/1.1
В вашем браузере отсутствует дополнительная информация о пути в строке GET
запросов, поскольку у вас не настроены браузеры для прокси, поэтому исключение, когда TIdHTTPProxyServer
пытается определить информацию, необходимую для подключения к целевому веб-серверу, и перенаправить на него текущий запрос.
Это в основном то, как работает HTTP, и как TIdHTTPProxyServer
предназначен дляработа.
Когда HTTPS задействован, все немного сложнее, но я пока опускаю эту деталь, поскольку она не имеет отношения к вашему вопросу об исключении.
ОБНОВЛЕНИЕ : в комментариях вы говорите:
В версии XE никогда не возникало исключение при проверке протокола, который все еще работает сегодня, потому что я вручную установил хост и порт в DoHTTPBeforeCommand.
В этой старой версии исключений не возникало, поскольку TIdHTTPProxyServer
еще не проверял протокол, чтобы различать HTTP и HTTPS.Вы смогли вручную заполнить недостающую информацию при получении запроса, который не был специально нацелен на ваш прокси.Вот почему у вас все работало раньше.
В более поздней версии TIdHTTPProxyServer
был обновлен, чтобы различать HTTP и HTTPS, когда в запросе явно не указан порт, поэтому порт по умолчанию устанавливается на основе запрошенного протокола.Эта проверка происходит до вызова DoHTTPBeforeCommand()
.
Чтобы вернуть старое поведение, вам придется изменить исходный код TIdHTTPProxyServer
, чтобы отложить возникновение исключения до тех пор, пока не вернется DoHTTPBeforeCommand()
, поэтомуу вас есть шанс снова заполнить пропущенные значения.
Если вы подаете запрос на добавление функции , я мог бы рассмотреть вопрос о добавлении его в официальный код Indy.