« VisualStudio 2012 Express EditionにWTL | トップページ | WTL のダイアログの CEDIT にフォーカス »

2013年12月14日 (土)

WinHTTP

WinHttpOpen と WinHttpConnect と WinHttpOpenRequest を一回呼んでWinHttpSendRequest (and WinHttpWriteData) と WinHttpReceiveResponse を繰り返し呼び出すようにしたら、2回目のWinHttpSendRequest または WinHttpWriteData で ERROR_INVALID_PARAMETER (87) が返る。

SendやWriteするデータが増えると ERROR_INVALID_PARAMETER で、減ると WinHttpReceiveResponse で ERROR_WINHTTP_TIMEOUT (12002) が返る。

同じ文字数ならOK。

ということで、WinHttpOpenRequest も WinHttpSendRequest と同様に繰り返し呼ぶようにしたらいけた。

以下PHP向けのPOSTの擬似コード。ベーシック認証付き。

hSession = WinHttpOpen(
        L"WinHTTP", 
        WINHTTP_ACCESS_TYPE_NO_PROXY,
        WINHTTP_NO_PROXY_NAME,
        WINHTTP_NO_PROXY_BYPASS,
        0
        );
WinHttpConnect(
        hSession,
        server,
        INTERNET_DEFAULT_HTTP_PORT,
        0
        );

をひとつのクラスで実施するようにして

m_hRequest= WinHttpOpenRequest(
        m_hConnect,
        L"POST",
        path.c_str(),
        NULL,
        WINHTTP_NO_REFERER,
        WINHTTP_DEFAULT_ACCEPT_TYPES,
        0
        );
// Basic Authentication
WinHttpSetCredentials(
        m_hRequest,
        WINHTTP_AUTH_TARGET_SERVER,
        WINHTTP_AUTH_SCHEME_BASIC,
        username.c_str(),
        password.c_str(),
        NULL
        );
const WCHAR szHeader[] = L"Content-Type: application/x-www-form-urlencoded\r\n";
std::string postData = "query=hello";
WinHttpSendRequest(
        m_hRequest,
        szHeader,
        -1L,
        WINHTTP_NO_REQUEST_DATA,
        0,
        postData.length(),
        0
        );
WinHttpWriteData(
        m_hRequest,
        buf,
        postData.length(),
        NULL
        );
// 上のWinHttpWriteDataの処理はWinHttpSendRequestにまとめると以下の一つでOK
/* WinHttpSendRequest(
        m_hRequest,
        szHeader,
        -1L,
        const_cast<char*>(postData.c_str()),
        postData.length(),
        postData.length(),
        0
        );
*/
WinHttpReceiveResponse(m_hRequest, NULL);
WinHttpQueryHeaders(
        m_hRequest,
        WINHTTP_QUERY_STATUS_CODE | WINHTTP_QUERY_FLAG_NUMBER,
        NULL,
        &dwStatusCode,
        &dwSize,
        NULL
        );
switch(dwStatusCode){
    case 200:
        return DONE;
    case 401:
        return RequestError_401;
    default:
        return RequestError_INTERNAL_ERROR;
}

をもう一つのクラスで呼ぶようにする。

|

« VisualStudio 2012 Express EditionにWTL | トップページ | WTL のダイアログの CEDIT にフォーカス »

PHP」カテゴリの記事

Windows」カテゴリの記事

パソコン・インターネット」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/1009744/54253279

この記事へのトラックバック一覧です: WinHTTP:

« VisualStudio 2012 Express EditionにWTL | トップページ | WTL のダイアログの CEDIT にフォーカス »