Delphi ISAPI:如何在Apache主机中访问Accept-Language?

时间:2014-04-17 07:57:39

标签: apache delphi http isapi

我使用Delphi XE4使用与ISAPI的内容协商编写了一个Web服务。

我的代码包含

ARequest.GetFieldByName('Accept-Language')
如果我使用独立服务器(Indy Bridge),

输出正确的值,但如果我在Apache中使用ISAPI DLL,则输出为空。

我有没有办法在Apache中使用ISAPI访问此头字段?

2 个答案:

答案 0 :(得分:1)

由于ISAPI是CGI的继承者,因此'默认' HTTP标头转换为CGI样式参数,因此您需要使用扩展控制块HTTP_ACCEPT_LANGUAGE来请求GetServerVariable。像这样:

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')

答案 1 :(得分:0)

我使用以下函数使其在Apache和独立的EXE上运行:

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
  // will work on Indy Standalone EXE
  result := ARequest.GetFieldByName(AHeaderName);

  if result = '' then
  begin
    // will work on Apache ISAPI DLL
    AHeaderName := ConvertToCGIStyle(AHeaderName);
    result := ARequest.GetFieldByName(AHeaderName);
  end;
end;

GetHTTPHeader(ARequest, 'Accept-Language');