Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

"Обработка GET-запросов для изображений в HTTP-сервере на Delphi"

Delphi , Интернет и Сети , Интернет

Обработка GET-запросов для изображений в HTTP-сервере на Delphi

В данной статье мы рассмотрим обработку GET-запросов для изображений в HTTP-сервере, написанном на Delphi с использованием компонента TIdHTTPServer из библиотеки Indy (Internet Direct).

Контекст

Рассмотрим код процедуры HTTPServerCommandGet, которая обрабатывает GET-запросы в HTTP-сервере:

procedure TVRMEditor.HTTPServerCommandGet(AContext: TIdContext;
  req: TIdHTTPRequestInfo; res: TIdHTTPResponseInfo);
begin
  try
    // ...
    if DocExt = '.MAX' then
      self.ProcessResponse(req, res)
    else
      self.SendFileToClient(req, res);
  except
    on E: Exception do
      self.Log(req.URI + ' : ' + req.Document + sLineBreak + E.ClassName + ' : '
        + E.Message);
  end;
end;

При вызове процедуры SendFileToClient для обработки запросов на получение файлов, если флаг Allowed установлен в true, то сервер обрабатывает запросы без ошибок и открывает веб-страницу. Если же флаг установлен в false, то сервер выбрасывает исключение с ошибкой "Invalid pointer" и не может открыть страницу.

Проблема

При отключении флага Allowed сервер выбрасывает исключение, не позволяя открыть веб-страницу. Нужно найти и исправить причину возникновения исключения.

Решение

После изучения логов и обсуждения на форуме было установлено, что исключение не связано с кодом процедуры HTTPServerCommandGet, а происходит в процедуре SendFileToClient или в методе Log. Кроме того, было выявлено, что исключение EAccessViolation связано с неинициализированной или неправильно обрабатываемой переменной управляемого типа.

Альтернативное решение

Для устранения проблемы нужно устранить причину возникновения исключения. В данном случае, это может быть связано с доступом к UI-контролам из рабочего потока в методе Log. Чтобы исправить это, можно использовать TThread.Synchronize для выполнения кода в основном потоке пользовательского интерфейса:

procedure GLog(Msg: String);
begin
  if Assigned(gLogger) and Assigned(gLogger.Memo) then
  begin
    TThread.Synchronize(nil,
    procedure
    begin
      // ...
    end);
  end;
  _Log(Msg);
end;

Также, важно отметить, что процедура HTTPServerCommandGet ловит и проглатывает все исключения. Это не является правильным подходом, так как Indy использует исключения для обработки ошибок. Поэтому, нужно переработать обработку исключений в коде.

Заключение

При обработке GET-запросов для изображений в HTTP-сервере на Delphi важно правильно обрабатывать исключения и учитывать доступ к UI-контролам из рабочих потоков. Использование TThread.Synchronize и правильная обработка исключений помогут устранить проблемы и сделать сервер более стабильным и надежным.

Создано по материалам из источника по ссылке.

Описание: Процедура обработки GET-запросов для изображений в HTTP-сервере на Delphi с использованием компонента TIdHTTPServer из библиотеки Indy.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Интернет ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-11-21 13:23:17/0.0037000179290771/0