[ トップ | 一覧 | 更新履歴 ]

VC/CInternetSession

VC

Internet接続MFC

CInternetSession

インターネットを介してサーバにアクセスする一連の操作の基礎となるクラス。

インターネット接続オブジェクトの生成

    //------------------------------------------
    //  インターネットセッションの生成
    //------------------------------------------
    CInternetSession* pSession = new CInternetSession(
        NULL,   // agent
        0,
        INTERNET_OPEN_TYPE_PRECONFIG,
        NULL,
        NULL,
        INTERNET_FLAG_EXISTING_CONNECT            |
        INTERNET_FLAG_RELOAD
        //SSLのとき
        //INTERNET_FLAG_SECURE                      |
        //INTERNET_FLAG_IGNORE_CERT_CN_INVALID      |
        //INTERNET_FLAG_IGNORE_CERT_DATE_INVALID    |
        //INTERNET_FLAG_RELOAD
    );

CHttpConnection

サーバ接続クラス

    //---------------------------------------
    //  HTTP serverへの接続
    // Throw ( CInternetException );
    //---------------------------------------	
    CHttpConnection* pConnect = pSession->GetHttpConnection(
        strSvrName,     // server name
        INTERNET_FLAG_EXISTING_CONNECT           |
        INTERNET_FLAG_RELOAD,
        //SSL
        //INTERNET_FLAG_SECURE                     |
        //INTERNET_FLAG_IGNORE_CERT_CN_INVALID     |
        //INTERNET_FLAG_IGNORE_CERT_DATE_INVALID   |
        //INTERNET_FLAG_RELOAD,
        nPort,     // port no.
        NULL,      // user name
        NULL       // user password
    );

CHttpFile

    //----------------------------------------
    //  HTTP 要求を開く
    //----------------------------------------
    CHttpFile* pAccess = pConnect->OpenRequest(
        nVerb,       // verb
        strPagName,  // object name
        NULL,        // refer
        1,           // context
        NULL,        // accept type
        NULL,        // HTML version
        INTERNET_FLAG_EXISTING_CONNECT           |
        INTERNET_FLAG_RELOAD
        // SSL
        //INTERNET_FLAG_SECURE                     |
        //INTERNET_FLAG_IGNORE_CERT_CN_INVALID     |
        //INTERNET_FLAG_IGNORE_CERT_DATE_INVALID   |
        //INTERNET_FLAG_RELOAD
    );

HTTP要求ヘッダを追加、変更したいとき、AddRequestHeaders()メソッドで登録する。

要求ヘッダの各行をCStringArray arrHeadersに設定されているとする。

    //----------------------------------------
    //  ヘッダ設定
    //----------------------------------------
    int iCnt;
    for(iCnt=0; iCnt < arrHeaders.GetSize(); iCnt++){
        pAccess->AddRequestHeaders(arrHeaders[iCnt]);
    }

    int intRetry = 0;
 RETRY:
 try{

    //---------------------------------------
    //  HTTP 要求を送る
    //---------------------------------------
    BOOL	blnStat;
    CString strHeader = "";

    blnStat = this->pAccess->SendRequest(
                  strHeader,                          // request header string
                  0,
                  (LPVOID)(LPCTSTR)strOptional,       // optional string
                  strOptional.GetLength()             // optional length
    ); 
    if (! blnStat){
        ; // エラー処理
    }
 }catch(CInternetException* pEx){
    if (ERROR_INTERNET_INVALID_CA != pEx->m_dwError){
        pEx->Delete();
        return pEx->m_dwError; // エラー処理
    }
    // ここに達するのは、SendRequest()でERROR_INTERNET_INVALID_CAが
    // 起きたときのみ。SSLのとき、必ずこのエラーが発生した。
    // そのため、オプションを変更し、再度SendRequest()を行う。
    // (このようにしないとSSLで接続できなかったためで、他に正当(?)なやりかたがあるのかもしれない。
    // エラーを必ず起こしてしまうので、サーバー側のアクセスログも怪しげなアクセスとなる。
    blnStat = ::InternetQueryOption(
                (HINTERNET)*(this->pAccess), 
                INTERNET_OPTION_SECURITY_FLAGS,
                (LPVOID)&dwValue,
                &dwBuffLen
    );
    dwValue |= SECURITY_FLAG_IGNORE_UNKNOWN_CA;     // エラーを無視する
    blnStat = ::InternetSetOption(
                (HINTERNET)*(this->pAccess),
                INTERNET_OPTION_SECURITY_FLAGS,
                &dwValue,
                sizeof(dwValue)
    );

    pEx->Delete();
    //--------------------------
    //  リトライ
    //--------------------------
    if(intRetry < 1){
        intRetry += 1;
        goto RETRY;   // gotoを使うことが分かりやすく素直な流れならば、gotoを使うべき。
    }
    return pEx->m_dwError; // エラー処理 (リトライも失敗)
 }

    //---------------------------------------
    //  要求の結果ステータス取得
    //---------------------------------------
    DWORD   dwRet;
    this->pAccess->QueryInfoStatusCode(dwRet);
    this->m_dwHttpStatus = dwRet;
    if (dwRet != HTTP_STATUS_OK){
        return dwRet;
    }
    //---------------------------------------
    //  データを読み取る
    //---------------------------------------
    strContents = "";
    UINT    uiSiz;
    while(0 < (uiSiz = this->pAccess->Read(lpBuf, 4096-1))){
        lpBuf[uiSiz] = '\0';
        strContents += lpBuf;
    }
    DWORD   err;
    err = ::GetLastError();
    //---------------------------------------
    //  切断
    //---------------------------------------
    this->pConnect->Close();
    //---------------------------------------
    //  インターネットセッションの終了
    //---------------------------------------
    pSession->Close();
    delete pSession;
    pSession = NULL;

例外 exception

次の例外が起きる可能性があります。

 CInternetException
 CFileException


GzuGzu (WikiWikiWeb descendant) ver 1.00 pre2
このページはGzuGzuで作成されました.
yaino.com