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

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

Спасибо!


person TheNewbie    schedule 12.01.2011    source источник
comment
TIdHTTPProxyServer просто не может этого сделать, приходится править его код   -  person Free Consulting    schedule 12.01.2011
comment
@Worm С уважением, да, можно, смотрите мой ответ...   -  person    schedule 12.01.2011
comment
@Worm и @Dorin: Это, конечно, возможно, смотрите мой ответ. ;)   -  person jachguate    schedule 12.01.2011
comment
@jachguate можно ли тоже изменить ответ?   -  person opc0de    schedule 11.04.2013


Ответы (2)


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

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

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

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

person jachguate    schedule 12.01.2011
comment
Ваш ответ заставил меня понять, что я использовал старую версию Indy. Он сильно улучшился, по крайней мере те части, которые я проверял. - person TheNewbie; 13.01.2011

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

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

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

person Community    schedule 12.01.2011
comment
-1: OnConnect срабатывает, когда клиент HTTP подключается к вашему прокси-серверу, а не когда прокси-сервер подключается к удаленному серверу (это зависит от вас, TidHTTPProxy не реализует это), и URL-адрес по-прежнему недоступен. . Если вы только не проверяете, каким внутренним IP-адресам разрешено отправлять HTTP-запросы наружу, это неправильный способ. - person ; 12.01.2011
comment
@ldsandon: TIdHTTPProxyServer реализует для вас подключения к удаленному серверу (иначе это не было бы прокси-сервером). См. свойство TIdHTTPProxyServerContext.OutboundClient. - person Remy Lebeau; 13.01.2011
comment
@Remy Lebeau: вы правы, я запутался с реализацией прокси, которую я сделал некоторое время назад, используя только TidHTTPServer. - person ; 14.01.2011