Сервер TIdHTTPProxyServer от Indy: как фильтровать запросы?

#delphi #indy10

#delphi #indy10

Вопрос:

Я использую сервер TIdHTTPProxyServer для реализации простого HTTP-прокси, но теперь я хотел бы заблокировать некоторые соединения, если они соответствуют определенным URL-адресам. Какое событие и / или компонент лучше всего подходит для этого? Документация Indy не слишком понятна. : (

Спасибо!

Комментарии:

1. Сервер TIdHTTPProxyServer просто не может этого сделать, приходится редактировать его код

2. @Worm с уважением, да, это возможно, смотрите мой ответ…

3. @Worm и @Dorin: Это, конечно, возможно, смотрите мой ответ. 😉

4. @jachguate возможно ли также изменить ответ?

Ответ №1:

В качестве базового фильтра вы можете использовать обработчик событий OnHTTPBeforeCommand (который запускается перед отправкой команды на HTTP-сервер).

Проверьте свойства параметра контекста, вы найдете полезные:

 Context.Command
Context.OutboundClient.Host
Context.OutboundClient.Port
Context.Document
Context.Headers
  

Я никогда не пытался остановить прохождение в это время, но держу пари, вы можете сделать это, просто создав исключение в этот момент, если вы определите, что есть соответствие правилу блока.

Комментарии:

1. Ваш ответ заставил меня понять, что я использовал старую версию Indy. Это значительно улучшилось, по крайней мере, те части, которые я проверил.

Ответ №2:

у компонента есть событие «OnConnect», дважды щелкните по нему и добавьте этот код:

 if AContext.Connection.Socket.Binding.PeerIP = '127.0.0.1' then
  AContext.Connection.Disconnect;
  

замените 127.0.0.1 своим фильтром, это всего лишь «чрезвычайно простой пример», то же самое относится к другим серверам Indy, у которых есть событие «OnConnect».

Комментарии:

1. -1: OnConnect срабатывает, когда HTTP- клиент подключается к вашему прокси, а не когда прокси подключается к удаленному серверу (это зависит от вас, TidHTTPProxy это не реализует), и URL-адрес по-прежнему недоступен. Если вы только не проверяете, каким «внутренним» IP-адресам разрешено отправлять HTTP-запросы извне, это неправильный способ.

2. @ldsandon: TIdHTTPProxyServer реализует ли для вас подключения к удаленному серверу (в противном случае это был бы не такой уж и прокси). Смотрите TIdHTTPProxyServerContext.OutboundClient свойство.

3. @Remy Lebeau: вы правы, я запутался с реализацией прокси, которую я сделал некоторое время назад, используя только TIdHTTPServer.