Delphi Proxy Server Example: Пошаговое Руководство с Кодом и FAQ

Что такое прокси-сервер и зачем он нужен в Delphi?

Прокси-сервер выступает посредником между клиентом и целевым сервером, обрабатывая запросы и ответы. В Delphi разработка прокси позволяет решать задачи:

  • Кэширование данных для ускорения доступа
  • Фильтрация контента или блокировка нежелательных ресурсов
  • Обеспечение анонимности путем подмены IP-адреса
  • Логирование сетевой активности приложения
  • Тестирование API в изолированной среде

Использование Delphi для создания прокси-сервера особенно эффективно благодаря библиотеке Indy (Internet Direct), предоставляющей готовые компоненты для работы с сетевыми протоколами.

Пример простого прокси-сервера на Delphi с Indy

Рассмотрим базовую реализацию HTTP-прокси с использованием компонентов TIdTCPServer и TIdHTTPProxyServer. Для начала разместите на форме:

  1. TIdTCPServer (из палитры Indy Servers)
  2. TIdIOHandlerStack
  3. TIdSchedulerOfThreadPool

Настройте свойства в обработчике OnExecute:

procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
var
  LClient, LServer: TIdTCPClient;
  Buffer: TIdBytes;
begin
  LClient := TIdTCPClient.Create(nil);
  LServer := TIdTCPClient.Create(nil);
  try
    LServer.Host := 'целевой_сервер.com';
    LServer.Port := 80;
    LServer.Connect;

    while AContext.Connection.Connected and LServer.Connected do
    begin
      AContext.Connection.IOHandler.ReadBytes(Buffer, -1, False);
      LServer.IOHandler.Write(Buffer);

      LServer.IOHandler.ReadBytes(Buffer, -1, False);
      AContext.Connection.IOHandler.Write(Buffer);
    end;
  finally
    LServer.Free;
    LClient.Free;
  end;
end;

Расширенные возможности прокси-сервера

Улучшим базовый пример, добавив ключевые функции:

Аутентификация пользователей

procedure TForm1.IdTCPServer1Connect(AContext: TIdContext);
begin
  if not CheckCredentials(AContext.Connection.Socket.Binding.PeerIP) then
    AContext.Connection.Disconnect;
end;

Логирование запросов

Добавьте в блок чтения/записи:

LogMemo.Lines.Add('Запрос от ' + AContext.Binding.PeerIP + ': ' + BytesToString(Buffer));

Блокировка URL

if ContainsStr(BytesToString(Buffer), 'forbidden-domain.com') then
  AContext.Connection.IOHandler.Write('HTTP/1.1 403 Forbidden');

Оптимизация производительности прокси

  • Используйте TIdSchedulerOfThreadPool для управления потоками
  • Настройте TIdIOHandlerStack.BufferSize для баланса скорости и памяти
  • Реализуйте кэширование через TIdHTTPInterceptor
  • Ограничивайте одновременные соединения через MaxConnections

Часто задаваемые вопросы (FAQ)

Как обрабатывать HTTPS-трафик?
Используйте компонент TIdSSLIOHandlerSocketOpenSSL для поддержки SSL/TLS. Требуется установка OpenSSL библиотек.

Почему прокси замедляет соединение?
Задержки возникают из-за обработки каждого пакета. Оптимизируйте код, увеличьте размер буфера и используйте пул потоков.

Как добавить авторизацию по логину/паролю?
Реализуйте проверку в событии OnConnect, используя заголовок Proxy-Authorization:

if not AContext.Connection.IOHandler.ReadHeader.ProxyAuthorization.IsValid then
  SendAuthRequest(AContext);

Какие альтернативы Indy для создания прокси?
Рассмотрите Synapse, ICS (Internet Component Suite) или Raw сокеты через WinAPI. Но Indy остается оптимальным для быстрой разработки.

Как тестировать прокси-сервер?
Используйте инструменты: Postman для ручных проверок, Fiddler для анализа трафика, Jmeter для нагрузочного тестирования.

Proxy Ninja
Добавить комментарий