VC 获取跳转后的网址

BOOL GetRedirectUrl(std::string strUrl , string &redirectUrl )
{

       
    //定义变量 
    HINTERNET hInet = NULL; //打开internet连接handle 
    HINTERNET hConnect = NULL; //HTTP连接 
    HINTERNET hRequestHead = NULL; //HTTP Request 
    HINTERNET hRequestGet = NULL; //HTTP Request 
    HANDLE hFileWrite = NULL; //写文件的句柄 
    char* pBuf = NULL; //缓冲区 
    DWORD dwRequestTryTimes = MAX_DOWNLOAD_REQUEST_TIME; //尝试请求的次数 
    DWORD dwDownBytes = 0; //每次下载的大小 
    DWORD dwDownFileTotalBytes = 0; //下载的文件总大小 
    DWORD dwWriteBytes = 0; //写入文件的大小 
    char bufQueryInfo[ LEN_OF_BUFFER_FOR_QUERYINFO] = {0}; //用来查询信息的buffer 
    DWORD dwBufQueryInfoSize = sizeof(bufQueryInfo); 
    DWORD dwStatusCode = 0; 
    DWORD dwContentLen = 0; 
    DWORD dwSizeDW = sizeof( DWORD); 
       
    //分割URL 
    CHAR pszHostName[ INTERNET_MAX_HOST_NAME_LENGTH] = {0}; 
    CHAR pszUserName[ INTERNET_MAX_USER_NAME_LENGTH] = {0}; 
    CHAR pszPassword[ INTERNET_MAX_PASSWORD_LENGTH] = {0}; 
    CHAR pszURLPath[ INTERNET_MAX_URL_LENGTH] = {0}; 
    CHAR szURL[INTERNET_MAX_URL_LENGTH] = {0}; 
    URL_COMPONENTSA urlComponents = {0}; 
    urlComponents.dwStructSize = sizeof( URL_COMPONENTSA); 
    urlComponents.lpszHostName = pszHostName; 
    urlComponents.dwHostNameLength = INTERNET_MAX_HOST_NAME_LENGTH; 
    urlComponents.lpszUserName = pszUserName; 
    urlComponents.dwUserNameLength = INTERNET_MAX_USER_NAME_LENGTH; 
    urlComponents.lpszPassword = pszPassword; 
    urlComponents.dwPasswordLength = INTERNET_MAX_PASSWORD_LENGTH; 
    urlComponents.lpszUrlPath = pszURLPath; 
    urlComponents.dwUrlPathLength = INTERNET_MAX_URL_LENGTH; 
       
    BOOL bRet = InternetCrackUrlA( strUrl.c_str(), 0, NULL, &urlComponents); 
    bRet = (bRet && urlComponents.nScheme == INTERNET_SERVICE_HTTP); 
    if (!bRet) 
    { 
        goto _END_OF_DOWNLOADURL; 
    } 
       
    //打开一个internet连接 
    hInet = InternetOpenA( DOWNHELPER_AGENTNAME, INTERNET_OPEN_TYPE_PRECONFIG , NULL, NULL , NULL ); 
    if (!hInet) 
    { 
        bRet = FALSE; 
        goto _END_OF_DOWNLOADURL; 
    } 
       
    //打开HTTP连接 
    hConnect = InternetConnectA(hInet, pszHostName, urlComponents.nPort, pszUserName, pszPassword, INTERNET_SERVICE_HTTP , 0, NULL ); 
    if (!hConnect) 
    { 
        bRet = FALSE; 
        goto _END_OF_DOWNLOADURL; 
    } 
       
    //创建HTTP request句柄 
    if (urlComponents.dwUrlPathLength !=  0) 
        strcpy(szURL, urlComponents.lpszUrlPath); 
    else 
        strcpy(szURL, "/"); 
       
    //请求HEAD,通过HEAD获得文件大小及类型进行校验 
    hRequestHead = HttpOpenRequestA(hConnect, "HEAD", szURL, "HTTP/1.1" , "" , NULL , INTERNET_FLAG_RELOAD|INTERNET_FLAG_NO_AUTO_REDIRECT , 0); 


    bRet = FALSE; 
     dwStatusCode = 0; 
     dwSizeDW = sizeof(DWORD); 
 
        //发送请求 
        bRet = HttpSendRequestA(hRequestHead, NULL, 0, NULL, 0); 
        if (!bRet) 
        { 
                     bRet = FALSE;
                      goto _END_OF_DOWNLOADURL;
   
        } 
        else 
        { 
            //判断HTTP返回的状态码 
            dwStatusCode = 0; 
            dwSizeDW = sizeof( DWORD); 
            bRet = HttpQueryInfo(hRequestHead, HTTP_QUERY_FLAG_NUMBER | HTTP_QUERY_STATUS_CODE, &dwStatusCode, &dwSizeDW, NULL ); 
            if (bRet) 
            { 
                //检查状态码 
                if ( HTTP_STATUS_OK == dwStatusCode) //200 OK 
                { 
                                  bRet = FALSE;
                                   goto _END_OF_DOWNLOADURL;
                   
                } 
                            else if (302 == dwStatusCode)
                           {
                                   //GetStatusCode(hRequest);
                                   TCHAR szBuffer[ INTERNET_MAX_URL_LENGTH] = {0};
                                   DWORD dwLen = sizeof(szBuffer);
                                  
                                   // 获取HTTP请求信息(HTTP_QUERY_LOCATION获取的绝对URL在Location应答头)
                                   BOOL bRet = HttpQueryInfo(hRequestHead, HTTP_QUERY_LOCATION, szBuffer, &dwLen, NULL );
                                  
                                   redirectUrl = szBuffer;
                                   goto _END_OF_DOWNLOADURL;
                                  bRet = TRUE;
                           }
                else 
                { 
                    bRet = FALSE;  
                } 
            } 
        }

               //清理 
_END_OF_DOWNLOADURL: 
               if ( INVALID_HANDLE_VALUE != hFileWrite) 
                     CloseHandle(hFileWrite); 
               if (pBuf) 
                      delete [] pBuf; 
               if (hRequestGet) 
                     InternetCloseHandle(hRequestGet); 
               if (hRequestHead) 
                     InternetCloseHandle(hRequestHead); 
               if (hConnect) 
                     InternetCloseHandle(hConnect); 
               if (hInet) 
        InternetCloseHandle(hInet); 

               return bRet;
     
}
本文为“技术点滴”的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注