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