首页 > 编程语言 >c++ libcurl获取http header信息

c++ libcurl获取http header信息

时间:2023-06-02 17:34:17浏览次数:35  
标签:http file libcurl down header easy handle curl setopt

bool HttpDownloader::GetReceiveHeaderInfo(const std::string& strUrl, std::map<std::string, std::string>& mapHeaderKeyValue)
{
    bool bRet = false;
    if (strUrl.empty())
    {
        return bRet;
    }
    else
    {

        CURL *handle = curl_easy_init();
        HttpHelper::set_share_handle(handle);
        std::string receive_header = "";
        char* ctbuf = NULL;
        if (handle)
        {
            curl_easy_setopt(handle, CURLOPT_URL, strUrl.c_str());
            curl_easy_setopt(handle, CURLOPT_HEADER, 1);
            curl_easy_setopt(handle, CURLOPT_NOBODY, 1);
            curl_easy_setopt(handle, CURLOPT_FOLLOWLOCATION, 1);
            curl_easy_setopt(handle, CURLOPT_MAXREDIRS, 5);
            curl_easy_setopt(handle, CURLOPT_HEADERFUNCTION, HttpHelper::RetriveHeaderFunction);
            curl_easy_setopt(handle, CURLOPT_HEADERDATA, &receive_header);
            curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, HttpHelper::RetriveContentFunction);
            curl_easy_setopt(handle, CURLOPT_WRITEDATA, NULL);
            curl_easy_setopt(handle, CURLOPT_RANGE, "2-");
            if ( curl_easy_getinfo(handle, CURLINFO_CONTENT_TYPE, &ctbuf) == 0 && ctbuf )
            {
                printf("GetReceiveHeaderInfo %s",ctbuf);
            }
#ifdef __ANDROID__
            curl_easy_setopt(handle, CURLOPT_SSL_VERIFYPEER, 0L);
            curl_easy_setopt(handle, CURLOPT_SSL_VERIFYHOST, 0L);
#endif // __ANDROID__

            int retry_times = 3;
            int http_code = 0;
            CURLcode curl_code = curl_easy_perform(handle);

            if (curl_code == CURLE_OPERATION_TIMEDOUT)
            {
                int retry_count = retry_times;
                while (retry_count > 0)
                {
                    curl_code = curl_easy_perform(handle);
                    if (curl_code != CURLE_OPERATION_TIMEDOUT) break;
                    retry_count--;
                }
            }

            curl_easy_getinfo(handle, CURLINFO_RESPONSE_CODE, &http_code);

            if (curl_code == CURLE_OK)
            {
                double down_file_length = -1.0;
                std::string strdown_file_Length = "";
                std::string strKey = "filesize";
                curl_easy_getinfo(handle, CURLINFO_CONTENT_LENGTH_DOWNLOAD, &down_file_length);
                char tempBuffer[64];
                sprintf(tempBuffer, "%.2f", down_file_length);
                strdown_file_Length = tempBuffer;
                mapHeaderKeyValue.insert(std::pair<std::string, std::string>(strKey, strdown_file_Length));

                std::string down_file_name = "";
                strKey = "filename";
                int loc1 = receive_header.find(strKey) + 9;
                if(loc1>=9)
                {
                    int loc2 = receive_header.find_first_of(";", loc1);
                    if (loc2 != std::string::npos)
                    {
                        down_file_name = receive_header.substr(loc1, loc2 - loc1);
                    }
                    else
                    {
                        loc2 = receive_header.find_first_of("\r", loc1);
                        if (loc2 != std::string::npos)
                        {
                            down_file_name = receive_header.substr(loc1, loc2 - loc1);
                        }
                        else
                        {
                            down_file_name = receive_header.substr(loc1, receive_header.length() - loc1);
                        }
                    }
                    //去掉引号
                    loc1 = down_file_name.find("\"");
                    if (loc1 != std::string::npos &&
                        down_file_name.length()>2)
                    {
                        down_file_name = down_file_name.substr(1, down_file_name.length() - 2);
                    }
                }

                mapHeaderKeyValue.insert(std::pair<std::string, std::string>(strKey, down_file_name));
                bRet = true;
            }
            else
            {
                const char* err_string = curl_easy_strerror(curl_code);
            }

            curl_easy_cleanup(handle);
        }

        return bRet;
    }
}

 

标签:http,file,libcurl,down,header,easy,handle,curl,setopt
From: https://www.cnblogs.com/anjingdian/p/17452498.html

相关文章

  • 为何大数据行业离不开HTTP代理IP
    大数据行业需要从各种互联网数据源中抓取、分析和处理大量的数据,然而这些互联网数据源往往会对访问进行限制,例如IP限制、流量限制或访问频率限制等。这时,HTTP代理IP就成为了大数据行业中不可或缺的工具之一。具体来说,HTTP代理在大数据行业发挥着以下几个重要作用:1、突破IP限制:部分......
  • nginx在代理到upstream时转换http1.1为http1.0,长连接转为短连接
    nginx在代理到upstream时的默认行为最近准备用openresty替换nginx,替换的效果当然是需要保证效果和nginx一致,不然可能就会导致线上在用的服务出现问题。替换成openresty后,在本地进行了一个请求,header如下:POST/servlet/jsonHTTP/1.1Host:10.80.121.xxx:9900Connection:keep......
  • # yyds干货盘点 # #经验分享# #网络爬虫# #数据分析# #Python# #每日打卡# #进阶学习#
    大家好,我是皮皮。一、前言前几天在Python群【洋洋】问了一个Python基础的问题,这里拿出来给大家分享下。二、实现过程这里【kim】给出了代码,如下所示:的确满足了粉丝的需求。很多人应该和我一样,想到的是zip吧。zip完全可以,可是他说要for,所以上面演示的是for循环。那么如果通过zip函数......
  • The 'Access-Control-Allow-Origin' header contains multiple values'*, *', but onl
    报错内容The'Access-Control-Allow-Origin'headercontainsmultiplevalues'*,http://192.168.237.131',butonlyoneisallowed.Havetheserversendtheheaderwithavalidvalue,or,ifanopaqueresponseservesyourneeds,setthereque......
  • Web安全测试—HTTP基础
    为什么要了解HTTP基础知识?原因在于,了解了HTTP的基础知识,不光对测试本身来说很重要,对于Web安全测试也是尤其的重要。HTTP使用客户端/服务器结构客户端发出请求,服务器做出响应,这是最基本的方式,同样也不存在其他的方式。服务器不可能做出没有请求,就向客户端发送数据响......
  • 6.4. HttpClient
    1.什么是HttpClient?HttpClient是Java11中引入的一个新特性,用于支持同步和异步发送HTTP请求以及处理HTTP响应。它提供了简单易用的API,使得发送HTTP请求变得非常简单。2.HttpClient的主要组件HttpClient由以下几个主要组件组成:HttpClient:用于发送请求的主要类。HttpRequest......
  • 如何在本地启动简易 Http 服务器
    如何在本地启动简易Http服务器由于Chrome等众多浏览器默认禁止加载本地js文件,这导致了很多前端项目必须使用Http静态服务器去启动。本文将会介绍几种简单的方法启动本地的Http服务器。1.使用Node.js1.1Node.js安装直接使用官网安装包即可。安装完成后,可以将np......
  • https://blog.csdn.net/weixin_58018769/article/details/130380746
     :move="onMove" onMove(e){console.log(e);letmoveName=e.draggedContext.element.name//这个是当前拖拽的控件名//接下来判断该控件要不要拖进指定的容器if(moveName=='禁止拖拽进容器的控件名'&&e.to._prevClass=='要拖进的容器的class名......
  • 记录--面试官:“你知道什么情况下 HTTPS 不安全么”
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助面试官:“HTTPS的加密过程你知道么?”我:“那肯定知道啊。”面试官:“那你知道什么情况下HTTPS不安全么”我:“这....”越面觉得自己越菜,继续努力学习!!!什麽是中间人攻击?中间人攻击(MITM)在密码学和计算机安全领域......
  • nginx 配置 https
    nginx配置https按照如下格式修改配置文件,80端口会自动转给443端口,这样就强制使用SSL证书加密了。访问http的时候会自动跳转到https上面。server{listen80;server_namewww.域名.com;rewrite^(.*)https://$server_name$1permanent;}server{listen443;se......