2014-04-17 2 views
0

필자는 Delphi XE4를 사용하여 ISAPI와의 컨텐츠 협상을 사용하여 웹 서비스를 작성했습니다.Delphi ISAPI : Apache 호스트에서 수락 언어에 액세스하는 방법?

내 코드는 내가 독립형 서버 (인디 브리지)를 사용하는 경우 올바른 값을 출력

ARequest.GetFieldByName('Accept-Language') 

포함되어 있지만 제가 아파치 내부 ISAPI DLL을 사용하는 경우가 비어 있습니다.

Apache에서 ISAPI를 사용하여이 헤더 필드에 액세스 할 수있는 방법이 있습니까?

+1

왜 아파치 웹 서버에서 사용 ISAPI? HTTPD2.pas 유닛을 사용하면 Apache httpd 모듈을 작성할 수 있습니다. –

+0

ISAPI는 언젠가 IIS로 전환 할 수있는 옵션을 열어두기 위해 시작되었습니다. 현재 우리 서버는 Apache에서 실행 중입니다. HTTP 헤더에 액세스하는 "쉬운"태스크를 제외하고는 모두 작동합니다. –

+0

정확하게 내가 http://xxm.sf.net/을 만들었던 것과 같습니다. –

답변

1

ISAPI는 CGI의 후계자이기 때문에 '기본'HTTP 헤더가 CGI 스타일 매개 변수로 변환되므로 확장 컨트롤 블록 GetServerVariable을 사용하여 HTTP_ACCEPT_LANGUAGE을 요청해야합니다. 그래서 같이 :

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

도움 주셔서 감사합니다! TWebRequest를 통해 PECB에 액세스 할 수 없기 때문에 귀하의 대답은 다소 혼란 스러웠습니다. 하지만 단순히 Request.GetFieldByName ('HTTP_ACCEPT_LANGUAGE')이 Apache에서 작동했습니다. 그러나 Request.GetFieldByName ('Accept-Language') 만 작동하기 때문에 독립 실행 형 EXE에서는 작동하지 않습니다. 그래서 나는 두 가지를 시도하는 작은 함수를 작성했다. (아래 내 대답을 보라). 이 솔루션이 깨끗한 지 알려주시겠습니까? 감사. –

0

나는 아파치와 독립 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'); 
관련 문제