2013-10-16 4 views
1

OIBindInfo 또는 IWinInetHttpInfo과 함께 모든 요청 헤더를 얻으려면 어떻게해야합니까? 나는 Start에서 이것을 사용하지만 변수 Headers 또는 RequestHeaders은 항상 비어 있습니까? OIBindInfo를 사용모든 요청 헤더를 얻는 방법?

접근 :

function THandler.Start(szUrl: PWideChar; OIProtSink: 
IInternetProtocolSink; OIBindInfo: IInternetBindInfo; grfPI, dwReserved: 
DWORD): HResult; stdcall; 
var 
    dwSize: ULONG; 
    pszHeaders: POleStr; 
    Headers: String; 
begin 
    OIBindInfo.GetBindString(BINDSTRING_HEADERS, @pszHeaders, 1, dwsize) 
    Headers := PWideChar(pszHeaders); // weird result of Headers = ჸ 
    CoTaskMemFree(pszHeaders); 
    pszHeaders := nil; 
    Result := INET_E_USE_DEFAULT_PROTOCOLHANDLER; 
end; 

접근이 IWinInetHttpInfo를 사용하여 :

type 
    THandler = class(TComObject, IInternetProtocol, IWinInetHttpInfo) 
    private 
     ServiceProvider: IServiceProvider; 
     WinInetHttpInfo: IWinInetHttpInfo; 
     URL: String; 
     RequestHeaders: String; 
     function QueryInfoEx(dwOption: DWORD; var Info: string): Boolean; 
    protected 
     function Start(szUrl: PWideChar; OIProtSink: IInternetProtocolSink; 
     OIBindInfo: IInternetBindInfo; grfPI, dwReserved: DWORD): HResult; stdcall; 
     function Continue(const ProtocolData: TProtocolData): HResult; stdcall; 
     function Abort(hrReason: HResult; dwOptions: DWORD): HResult; stdcall; 
     function Terminate(dwOptions: DWORD): HResult; stdcall; 
     function Suspend: HResult; stdcall; 
     function Resume: HResult; stdcall; 
     function Read(pv: Pointer; cb: ULONG; out cbRead: ULONG): HResult; stdcall; 
     function Seek(dlibMove: LARGE_INTEGER; dwOrigin: DWORD; 
     out libNewPosition: ULARGE_INTEGER): HResult; stdcall; 
     function LockRequest(dwOptions: DWORD): HResult; stdcall; 
     function UnlockRequest: HResult; stdcall; 
     function QueryInfo(dwOption: DWORD; Buffer: Pointer; var cbBuf, dwFlags, dwReserved: DWORD): HResult; stdcall; 
     function QueryOption(dwOption: DWORD; Buffer: Pointer; var cbBuf: DWORD): HResult; stdcall; 
    end; 

function THandler.QueryInfoEx(dwOption: DWORD; var Info: string): Boolean; 
var 
    Buf: array[0..INTERNET_MAX_PATH_LENGTH] of AnsiChar; 
    BufLength, dwReserved, dwFlags: Cardinal; 
begin 
    dwReserved := 0; 
    dwFlags := 0; 
    BufLength := INTERNET_MAX_PATH_LENGTH + 1; 
    Result := not Boolean(WinInetHttpInfo.QueryInfo(dwOption, @Buf, BufLength, dwFlags, dwReserved)); 
    if Result then 
    Info := string(Buf); 
end; 

function THandler.Start(szUrl: PWideChar; OIProtSink: 
IInternetProtocolSink; OIBindInfo: IInternetBindInfo; grfPI, dwReserved: 
DWORD): HResult; stdcall; 
begin 
    OIProtSink.QueryInterface(IServiceProvider, ServiceProvider); 
    OIProtSink.QueryInterface(IWinInetHttpInfo, WinInetHttpInfo); 
    QueryInfoEx(HTTP_QUERY_RAW_HEADERS, RequestHeaders); // empty RequestHeaders 
    Result := INET_E_USE_DEFAULT_PROTOCOLHANDLER; 
end; 

나도 작동하지 않습니다!

+0

POleStrArray 대신 POleStr을 사용해보십시오. – whosrdaddy

답변

1

GetBindString()의 반환 값을보고 어떤 데이터도 출력되지 않았는지 확인하십시오.

function THandler.Start(szUrl: PWideChar; OIProtSink: IInternetProtocolSink; OIBindInfo: IInternetBindInfo; grfPI, dwReserved: DWORD): HResult; stdcall; 
var 
    Headers: array[0..255] of POleStr; 
    Fetched, I: ULONG; 
begin 
    Fetched := 0; 
    if Succeeded(OIBindInfo.GetBindString(BINDSTRING_HEADERS, @Headers[0], Length(Headers), Fetched)) then 
    begin 
    if Fetched > 0 then 
    begin 
     for I := 0 to Fetched-1 do 
     begin 
     // use Headers[I] as needed... 
     CoTaskMemFree(Headers[I]); 
     end; 
    end; 
    end; 
    Result := INET_E_USE_DEFAULT_PROTOCOLHANDLER; 
end; 
그러나

function THandler.Start(szUrl: PWideChar; OIProtSink: IInternetProtocolSink; OIBindInfo: IInternetBindInfo; grfPI, dwReserved: DWORD): HResult; stdcall; 
var 
    MimeType: POleStr; 
    Fetched: ULONG; 
begin 
    if Succeeded(OIBindInfo.GetBindString(BINDSTRING_POST_DATA_MIME, @MimeType, 1, Fetched)) then 
    begin 
    // use MimeType as needed... 
    CoTaskMemFree(MimeType); 
    end; 
    Result := INET_E_USE_DEFAULT_PROTOCOLHANDLER; 
end; 

, 여러 헤더를 검색하려고하는 대신 배열을 사용할 필요가 있으므로, : 당신은 예를 들어, 특정 헤더를 검색하는 경우

하나의 POleStr를 사용하는 것은 괜찮습니다

즉, MSDN saysBINDSTRING_HEADERS은 "현재 지원되지 않습니다"입니다.

+0

왜'GetBindString'이 호출되기 전에'Headers'가 할당 되었습니까? 실제로이 코드를 테스트 해 보셨습니까? 이것은 어떤 깃발에서도 작동하지 않기 때문입니다. 코드를 업데이트하십시오. –

+0

'Headers'는 포인터의 배열입니다. 'GetBindString()'은 새로운 배열을 할당하지 않고 단순히 주어진 배열을 채 웁니다. 그래서 배열 길이도 전달해야합니다. 배열의 크기를 동적으로 지정할 수 있도록 헤더의 수를 쿼리 할 수 ​​있는지 여부는 알 수 없습니다. 아니요, 코드를 시도하지 않았지만 다른 예제를 기반으로합니다. –

+0

'GetBindString'이 호출되기 훨씬 전에 이상한 문자로 가득차 있습니다. –

관련 문제