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