c++ libcurl获取http header信息

发布时间 2023-06-02 17:33:13作者: 安静点--
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;
    }
}