关于CURL获取网页,返回的网页内容大小一直变化的原因

最近在维护一个检测网页篡改检测的程序代码,代码会判断网页内容的大小,如果大小发生很大的变化就会报警,程序是通过CURL来获取网页大小的,程序运行在windows7下,使用的是VS2008

下面贴的代码是获取网页信息的函数:

int NetHelper::GetWebPageInfo( CString strUrl, bool bIsWap, bool bJustHeader, int& nFileSize, string& strContent )
{
    strContent.clear();
    nFileSize =0;

    init_curl initcurl;
    CURL * curl = initcurl.get_curl();
    CURLcode curlres;

    //libcurl初始化失败
    if(!curl)
    {
        strContent = "curl初始化失败!";
        return -1;
    }

    // 在堆栈上分配内存供 W2A等函数使用
    USES_CONVERSION;

    // 设置URL
    curl_easy_setopt(curl, CURLOPT_URL, W2A(strUrl));

    // 如果是ssl网站,不对ssl网站的证书进行验证
    curl_easy_setopt(curl,CURLOPT_SSL_VERIFYPEER,0);
    curl_easy_setopt(curl,CURLOPT_SSL_VERIFYHOST,0);

    curl_easy_setopt(curl,CURLOPT_COOKIEJAR,"e:\\cookie.txt");
    curl_easy_setopt(curl,CURLOPT_COOKIEFILE,"e:\\cookie.txt");

    // 超时设置
    curl_easy_setopt(curl,CURLOPT_TIMEOUT,10);

    if ( !bJustHeader )
    {
        // 设置读取HTTP返回内容的回调函数
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback);
        // 设置回调函数的参数,见write_callback函数的最后一个参数
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, &strContent);
    }//end if  
    else
    {
        // 设置读取HTTP头部内容的回调函数
        curl_easy_setopt(curl,CURLOPT_HEADERFUNCTION,header_callback);
        // 设置回调函数的参数,见header_callback函数的最后一个参数, 如果没有用到,
        curl_easy_setopt(curl, CURLOPT_HEADERDATA, &strContent);
        curl_easy_setopt( curl, CURLOPT_NOBODY, 1 );
    }


    // 自动转向
    curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1);

    // 设置头
    curl_slist *chunk = NULL;
    chunk = curl_slist_append( chunk, "Accept: text/html, application/xhtml+xml, */*" ); 
    chunk = curl_slist_append( chunk, "Accept-Language: zh-CN" ); 
    if ( bIsWap )
    {
        chunk = curl_slist_append( chunk, "User-Agent: Mozilla/5.0 (Linux; U; Android 2.3.4; zh-cn; GT-I9100 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1" ); 
    } //end if
    else
    {
        chunk = curl_slist_append( chunk, "User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.7 (KHTML, like Gecko)" ); 
    }
    chunk = curl_slist_append( chunk, "Accept-Encoding: gzip, deflate" ); 
    chunk = curl_slist_append( chunk, "Connection: Keep-Alive" );
    curl_easy_setopt( curl, CURLOPT_HTTPHEADER, chunk );

    strContent.clear();
    curlres = curl_easy_perform(curl);

    long nStatus;

    if( curlres == CURLE_OK )
    {
        //服务器返回码
        curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &nStatus);
        nFileSize = strContent.size();
    }
    else
    {
        nStatus = curlres;
    }

    return nStatus;
}

情况是这样的,当我调试这个程序,检测网站,请求网页的时候,我用httpdebug抓包,获取的网页的Body大小是96354,我查看了内容,里面是完整的网页,这说明程序设置的url请求是没有错误的,每次都可以返回正确的网页,状态码Status是200.
这里写图片描述

然后我下断点查看nFileSize(表示网页内容大小的变量)情况是这样的:
这里写图片描述
这里写图片描述
这里写图片描述
大小是变化的,只有98666可以看到是完整的网页内容,其它都是“?”。

最后找出来的原因是:网页是被压缩了,把下图中的语句注释掉,服务器就不会返回压缩过的网页。这样每次获取的网页内容都是正常的了,大小都是98666。
这里写图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值