2010-03-07 7 views
1

WinHttp를 사용하여 보안 사이트에 POST를 시도하고 사용자 에이전트 헤더가 CONNECT와 함께 전송되지 않는 문제가 발생합니다.CONNECT 및 POST를 통해 WinHTTP를 통해 사용자 에이전트를 보내시겠습니까?

나는 MSDN에서 가볍게 수정 된 코드 샘플을 사용하고 있습니다 :

HINTERNET hHttpSession = NULL; 
    HINTERNET hConnect  = NULL; 
    HINTERNET hRequest  = NULL; 

    WINHTTP_AUTOPROXY_OPTIONS AutoProxyOptions; 
    WINHTTP_PROXY_INFO   ProxyInfo; 
    DWORD      cbProxyInfoSize = sizeof(ProxyInfo); 

    ZeroMemory(&AutoProxyOptions, sizeof(AutoProxyOptions)); 
    ZeroMemory(&ProxyInfo, sizeof(ProxyInfo)); 

    hHttpSession = WinHttpOpen(L"WinHTTP AutoProxy Sample/1.0", 
    WINHTTP_ACCESS_TYPE_NO_PROXY, 
    WINHTTP_NO_PROXY_NAME, 
    WINHTTP_NO_PROXY_BYPASS, 
    0); 

    if(!hHttpSession) 
    goto Exit; 

    hConnect = WinHttpConnect(hHttpSession, 
    L"server.com", 
    INTERNET_DEFAULT_HTTPS_PORT, 
    0); 

    if(!hConnect) 
    goto Exit; 

    hRequest = WinHttpOpenRequest(hConnect, L"POST", L"/resource", NULL, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, WINHTTP_FLAG_SECURE); 

    if(!hRequest) 
    goto Exit; 

    WINHTTP_PROXY_INFO proxyInfo; 
    proxyInfo.dwAccessType = WINHTTP_ACCESS_TYPE_NAMED_PROXY; 
    proxyInfo.lpszProxy = L"192.168.1.2:3199"; 
    proxyInfo.lpszProxyBypass = L""; 

    WinHttpSetOption(hHttpSession, 
    WINHTTP_OPTION_PROXY, 
    &proxyInfo, 
    sizeof(proxyInfo)); 

    WinHttpSetCredentials(hRequest, WINHTTP_AUTH_TARGET_PROXY, WINHTTP_AUTH_SCHEME_BASIC, L"proxyuser", L"proxypass", NULL); 

    if(!WinHttpSendRequest(hRequest, WINHTTP_NO_ADDITIONAL_HEADERS, 0, "content", 7, 7, 0)) 
    { 
    goto Exit; 
    } 

    if(!WinHttpReceiveResponse(hRequest, NULL)) 
    goto Exit; 

    /* handle result */ 

Exit: 

    if(ProxyInfo.lpszProxy != NULL) 
    GlobalFree(ProxyInfo.lpszProxy); 

    if(ProxyInfo.lpszProxyBypass != NULL) 
    GlobalFree(ProxyInfo.lpszProxyBypass); 

    if(hRequest != NULL) 
    WinHttpCloseHandle(hRequest); 

    if(hConnect != NULL) 
    WinHttpCloseHandle(hConnect); 

    if(hHttpSession != NULL) 
    WinHttpCloseHandle(hHttpSession); 

무엇이하는 일은 192.168.1.2:3199에서 인증 된 프록시를 통해 내 서버에 연결하고, POST를 만드는 것입니다. 이 작동하지만 프록시 로그를 검사 할 때 사용자 에이전트 문자열 ("WinHTTP AutoProxy Sample/1.0")이 CONNECT의 일부로 보내지지 않습니다. 그러나 POST의 일부로 전송됩니다.

누구든지 중에 사용자 에이전트 헤더를 보내려면이 코드를 어떻게 변경할 수 있습니까? CONNECT와 POST?

편집은 추가 : 우리가이 문제를 관찰 만 윈도우 7에 우리는 Windows Vista의 상자에서 동일한 코드를 실행하면, 우리는 사용자 에이전트 헤더가 CONNECT에 전송되는 것을 볼 수 있습니다.

답변

2

Duncan - WinHTTP 팀에 따르면 이것은 Windows 7에서 도입 된 동작 변경 사항입니다. 현재이 문제에 대한 WinHTTP의 해결 방법은 없습니다.

+0

대단히 감사드립니다. 나는 잠시 미쳤다고 생각했다. :-) –

+0

에릭, 나는이 질문을 게시 한 이후 HTTPS 대신 HTTP를 사용하도록 소프트웨어를 재 설계해야했다. 기업 네트워크에서 프록시를 필터링함으로써 거부되기 때문에 User-Agent의 기반. 그들과 접촉하고 있다면, WinHTTP 팀에게 이것이 우리에게 힘든 일임을 알리시기 바랍니다. 더 빨리 이러한 회귀 (미안하지만, 행동 변화)가 모든 Windows 개발자들에게 더 나은 것으로 결정됩니다. . –

+0

Duncan : Microsoft 고객 지원 (http://support.microsoft.com)에 연락하여이 문제를 해결해야합니다. 그것이 Microsoft에서 제공하는 수정본을 얻는 길입니다. 이것이 우리 행동의 변화이기 때문에, 지원비는 면제됩니다. – EricLaw

관련 문제