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

Разработка CGI-скриптов для генерации изображений в Delphi и их корректное отображение в браузере

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

CGI (Common Gateway Interface) — это интерфейс, позволяющий веб-серверу взаимодействовать с внешними программами для генерации динамического контента. В данной статье мы рассмотрим, как разрабатывать CGI-скрипты на Delphi для генерации изображений и обеспечивать их корректное отображение в браузере пользователя.

Проблема

Разработчик столкнулся с проблемой отображения изображений, сгенерированных CGI-скриптом, в браузере. Используется Intraweb как веб-сервер, и при запросе изображения сервер возвращает данные, которые, по мнению разработчика, некорректно обрабатываются клиентской частью.

Контекст

CGI-скрипт возвращает изображение в виде потока байтов, который включает в себя заголовки HTTP и само изображение. В коде сервера используется функция RunCGIOutput, которая запускает CGI-скрипт и записывает результат в поток Stream. Далее, в функции TContentImaqge.Execute, этот поток передается клиенту в ответе HTTP.

Подтвержденный ответ

Проблема заключается в том, что поток, возвращаемый CGI-скриптом, содержит как заголовки HTTP, так и тело ответа, и его необходимо правильно обработать. В Intraweb для этого используется объект THTTPReply, который позволяет отдельно управлять статусом, заголовками и телом ответа.

Для корректной обработки ответа необходимо разделить заголовки и тело ответа, а затем передать их через THTTPReply. В примере кода, предоставленном в контексте, используется функция ReadStringFromStream, которая неэффективна, так как игнорирует возвращаемое значение и сдвигает позицию чтения в потоке.

Вот пример функции, которая правильно обрабатывает ответ от CGI-скрипта:

function TContentImaqge.Execute(aRequest: THttpRequest; aReply: THttpReply;
  const aPathname: string; aSession: TIWApplication;
  aParams: TStrings): Boolean;
var
  CGIOutput, ContentStream: TMemoryStream;
  LocalDoc, Line: string;
  CharPos: Integer;
begin
  Result := True;
  CGIOutput := TMemoryStream.Create;
  try
    LocalDoc := TIWAppInfo.GetAppPath + 'wwwroot\cgi-bin\newweb\dgate.exe';
    RunCGIOutput(LocalDoc, CGIOutput, TIWAppInfo.GetAppPath + 'wwwroot\cgi-bin\newweb\');

    if ReadLnFromStream(CGIOutput, Line, -1, IndyTextEncoding_ASCII) then
    begin
      { Обработка строки статуса }
      CharPos := Pos(' ', Line);
      if CharPos > 0 then
      begin
        aReply.Code := StrToInt(Copy(Line, CharPos + 1, 3));
        CharPos := Pos(' ', Line, CharPos);
        if CharPos > 0 then
          aReply.CodeText := Copy(Line, CharPos + 1);
      end;

      { Копирование заголовков как есть }
      while ReadLnFromStream(CGIOutput, Line, -1, IndyTextEncoding_ASCII) and (Line <> '') do
        aReply.Headers.Add(Line);

      { На этом этапе CGIOutput.Position находится в начале тела ответа, поэтому копируем
        содержимое в отдельный поток }
      ContentStream := TMemoryStream.Create;
      try
        ContentStream.CopyFrom(CGIOutput, CGIOutput.Size - CGIOutput.Position);
      except
        ContentStream.Free;
        raise;
      end;
      aReply.SendStream(ContentStream);
    end
    else
    begin
      aReply.Code := 500;
      aReply.CodeText := RSHTTPInternalServerError;
      aReply.WriteString('CGI модуль вернул некорректный ответ.');
    end;
  finally
    CGIOutput.Free;
  end;
end;

Альтернативный ответ

Не предоставляется.

Заключение

Для корректного отображения изображений, сгенерированных CGI-скриптами, в браузере необходимо правильно обработать поток данных, возвращаемый скриптом. В частности, следует отделить заголовки HTTP от тела ответа и передать их через соответствующие механизмы веб-сервера. Приведенный выше код демонстрирует, как это можно сделать на примере использования Intraweb и Delphi.

Этот пример можно использовать как отправную точку для дальнейшей разработки CGI-скриптов, которые будут корректно работать с веб-сервером и обеспечивать отображение изображений в браузере.

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

Разработка и настройка CGI-скриптов в Delphi для корректного отображения генерируемых ими изображений в веб-браузерах через веб-сервер Intraweb.


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

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




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


:: Главная :: CGI и Cookies ::


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-03-13 20:51:16/0.0035238265991211/0