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

Проблема доступа к заголовку Accept-Language в ISAPI-расширении для web-сервиса на Delphi XE4 в среде Apache

Delphi , Синтаксис , API реализация

Доступ к заголовку Accept-Language в ISAPI-расширении для Apache

При разработке web-сервисов на языке Delphi, часто возникает необходимость работать с заголовками HTTP-запросов. Одним из таких заголовков является Accept-Language, который определяет предпочтительные языки пользователя. В статье мы рассмотрим, как получить доступ к этому заголовку при использовании ISAPI-расширения в среде Apache.

Проблема

Разработчики столкнулись с проблемой при работе с заголовком Accept-Language в web-сервисе, созданном с использованием ISAPI и Delphi XE4. Заголовок корректно обрабатывался при использовании Indy Bridge, но был пустым, когда сервис работал через ISAPI DLL в Apache.

Решение

Чтобы решить данную проблему, необходимо понимать, что ISAPI является преемником CGI. В связи с этим, стандартные HTTP-заголовки преобразуются в параметры в стиле CGI. Следовательно, для получения заголовка Accept-Language нужно использовать функцию GetServerVariable из расширяемого блока управления (EXTENSION_CONTROL_BLOCK).

function GetVar(pecb: PEXTENSION_CONTROL_BLOCK; const key: AnsiString): AnsiString;
var
  l: cardinal;
begin
  l:=$10000;
  SetLength(Result,l);
  if not(pecb.GetServerVariable(pecb.ConnID,PAnsiChar(key),PAnsiChar(Result),l)) then
    if GetLastError=ERROR_INVALID_INDEX then l:=1 else RaiseLastOSError;
  SetLength(Result,l-1);
end;

//
GetVar(ecb,'HTTP_ACCEPT_LANGUAGE')

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

Разработчики также предложили альтернативный подход, который позволяет получить заголовок Accept-Language как в среде Apache, так и в standalone EXE. Это достигается с помощью функции GetHTTPHeader, которая пытается получить значение заголовка сначала в обычном формате, а затем в стиле CGI.

function GetHTTPHeader(ARequest: TWebRequest; AHeaderName: AnsiString): AnsiString;
  function ConvertToCGIStyle(AStr: AnsiString): AnsiString;
  var
    tmp: string;
  begin
    tmp := string(AStr); // "tmp" used to avoid Unicode warnings
    tmp := UpperCase(tmp);
    tmp := StringReplace(tmp, '-', '_', [rfReplaceAll]);
    tmp := 'HTTP_' + tmp;
    result := AnsiString(tmp);
  end;
begin
  // Попытка получить заголовок в обычном формате
  result := ARequest.GetFieldByName(AHeaderName);
  // Если результат пуст, попытка получить в стиле CGI
  if result = '' then
  begin
    AHeaderName := ConvertToCGIStyle(AHeaderName);
    result := ARequest.GetFieldByName(AHeaderName);
  end;
end;

GetHTTPHeader(ARequest, 'Accept-Language');

Заключение

В данной статье мы рассмотрели проблему доступа к заголовку Accept-Language в ISAPI-расширении для web-сервиса на Delphi XE4 в среде Apache. Предложены два способа решения этой проблемы: использование функции GetServerVariable для работы с CGI-стилевыми параметрами и использование функции GetHTTPHeader для универсальной обработки заголовков в различных средах.

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

В статье рассматривается проблема и способы решения её, связанные с доступом к заголовку HTTP `Accept-Language` в web-сервисе, использующем ISAPI-расширение в среде Apache при разработке на Delphi XE4.


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

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




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


:: Главная :: API реализация ::


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-02-05 11:55:52/0.0053260326385498/1