Прокси-сервер с использованием Indy

Я новичок в Indy, и я хочу создать с ним простой прокси-сервер. Это довольно большая библиотека, и я просто не знаю, с чего начать. Когда клиент подключается к серверу, OnExucute запускается и получает клиентское соединение в качестве параметра (AContext.Connection).

Я хочу сделать следующее:

[client connection] := AContext.Connection
read host/port from [client connection]
[remote connection] := connect to host/port
while both connections alive:
  if data available in [client connection]:
    read data from [client connection]
    write data to [remote connection]
  if data available in [remote connection]:
    read data from [remote connection]
    write data to [client connection]

Вопрос в том, какие функции я должен использовать для этого? В объекте Connection есть свойство IOHandler с тоннами из них. Пожалуйста, помогите.

Я использую Indy, который поставляется с Delphi2010.

Ответы

Ответ 1

Indy имеет свои собственные прокси-компоненты, которые делают то, о чем вы просите. Посмотрите на компоненты TIdMappedPortTCP и TIdHTTPProxyServer в качестве исходных мест.

TIdMappedPortTCP - это универсальный прокси, который просто передает необработанные данные взад и вперед. Вы можете использовать его событие OnConnect для динамической настройки целевого хоста/порта для этого соединения (например, путем чтения его с клиента) или вы можете установить его свойства MappedHost и MappedPort статически для всех подключений. Вы можете использовать его события OnExecute и OnOutboundData для изменения данных по мере прохождения через прокси-сервер, если это необходимо.

TIdHTTPProxyServer является специализированным прокси только для HTTP-проксирования, где клиент использует HTTP GET, POST, HEAD и CONNECT глаголы, указывая абсолютные URL-адреса целевому хосту/порту, а затем передает HTTP-заголовки и данные туда и обратно по мере необходимости (CONNECT обычно используется для проксирования соединения SSL/TLS через брандмауэр).