{"id":1017,"date":"2019-07-12T16:56:04","date_gmt":"2019-07-12T08:56:04","guid":{"rendered":"http:\/\/www.max-shu.com\/blog\/?p=1017"},"modified":"2019-07-12T16:56:04","modified_gmt":"2019-07-12T08:56:04","slug":"linux%e4%b8%8b%e4%bd%bf%e7%94%a8curl%e5%ba%93%e5%81%9ahttp-get%e3%80%81post%e8%af%b7%e6%b1%82","status":"publish","type":"post","link":"http:\/\/www.max-shu.com\/blog\/?p=1017","title":{"rendered":"Linux\u4e0b\u4f7f\u7528curl\u5e93\u505aHTTP GET\u3001POST\u8bf7\u6c42"},"content":{"rendered":"<p>linux\u4e0b\u7528c\u8bed\u8a00\uff0c\u53ef\u4ee5\u4f7f\u7528curl\u5e93\u6765\u5b9e\u73b0\u76f8\u5173http get\u3001post\u4e4b\u7c7b\u7684\u64cd\u4f5c\uff0c\u770b\u4f8b\u5b50\uff1a<\/p>\n<h4><strong>log<\/strong><strong>.h<\/strong><\/h4>\n<div>\n<div>#ifndef _LOG_GLOBAL_H_<\/div>\n<div>#define _LOG_GLOBAL_H_<\/div>\n<div>#define LOG_DEBUG \u00a0\u00a0\u00a0\u00a0\u00a0\u00a01<\/div>\n<div>#define LOG_GLOBAL_PATH &#8220;\/media\/sdcard\/license_client\/&#8221;<\/div>\n<div>#define LOG_GLOBAL_FILE &#8220;license_client.log&#8221;<\/div>\n<div>#define LOG_GLOBAL_MAX_LINE 100000<\/div>\n<div>extern int InitLog();<\/div>\n<div>extern int UninitLog();<\/div>\n<div>extern void Log(const char *p_fmt, &#8230;);<\/div>\n<div>extern void LogHex(char *pData, size_t size);<\/div>\n<div>#endif \/*_LOG_GLOBAL_H_*\/<\/div>\n<\/div>\n<h4><strong>log.c<\/strong><\/h4>\n<div>\u6bcf10\u4e07\u884c\u5207\u6362\u4e00\u4e2alog\u6587\u4ef6\u540d\u3002<\/div>\n<div>\n<div>#include &lt;stdio.h&gt;<\/div>\n<div>#include &lt;stdlib.h&gt;<\/div>\n<div>#include &lt;pthread.h&gt;<\/div>\n<div>#include &lt;malloc.h&gt;<\/div>\n<div>#include &lt;stdarg.h&gt;<\/div>\n<div>#include &lt;errno.h&gt;<\/div>\n<div>#include&lt;sys\/types.h&gt;<\/div>\n<div>#include &lt;sys\/stat.h&gt;<\/div>\n<div>#include &lt;string.h&gt;<\/div>\n<div>#include &lt;time.h&gt;<\/div>\n<div>#include &#8220;log.h&#8221;<\/div>\n<div>FILE *logGlobalFd = NULL;<\/div>\n<div>unsigned int logGlobalLineNum = 0;<\/div>\n<div>pthread_mutex_t logGlobalMutex;<\/div>\n<div>int InitLog()<\/div>\n<div>{<\/div>\n<div>charlog[256];<\/div>\n<div><\/div>\n<div>#ifdef LOG_DEBUG<\/div>\n<div>if(logGlobalFd){<\/div>\n<div>return1; \/\/already init.<\/div>\n<div>}<\/div>\n<div>mkdir(LOG_GLOBAL_PATH, 0755);<\/div>\n<div>snprintf(log, sizeof(log), &#8220;%s\/%s&#8221;, LOG_GLOBAL_PATH, LOG_GLOBAL_FILE);<\/div>\n<div>logGlobalFd = fopen((char*)log, &#8220;a&#8221;);<\/div>\n<div>if (!logGlobalFd){<\/div>\n<div>printf(&#8220;%s=&gt;%s(): failed to open log file (errno=%s)\\n&#8221;, __FILE__, __FUNCTION__, strerror(errno));<\/div>\n<div>return-1;<\/div>\n<div>}<\/div>\n<div>printf(&#8220;%s=&gt;%s(): creat log file %s sucessfull!\\n&#8221;, __FILE__, __FUNCTION__, log);<\/div>\n<div>\/\/ init mutex<\/div>\n<div>if (pthread_mutex_init(&amp;logGlobalMutex, NULL) !=0){<\/div>\n<div>fclose(logGlobalFd);<\/div>\n<div>printf(&#8220;%s=&gt;%s(): init mutex error!\\n&#8221;, __FILE__, __FUNCTION__);<\/div>\n<div>return-1;<\/div>\n<div>}<\/div>\n<div>#endif \/\/LOG_DEBUG<\/div>\n<div>return1;<\/div>\n<div>}<\/div>\n<div>int UninitLog()<\/div>\n<div>{<\/div>\n<div>#ifdef LOG_DEBUG<\/div>\n<div>if(logGlobalFd){<\/div>\n<div>fclose(logGlobalFd);<\/div>\n<div>pthread_mutex_destroy(&amp;logGlobalMutex);<\/div>\n<div>}<\/div>\n<div>#endif \/\/LOG_DEBUG<\/div>\n<div>return1;<\/div>\n<div>}<\/div>\n<div>static int LogNewLogFile()<\/div>\n<div>{<\/div>\n<div>chartmp[256];<\/div>\n<div>chartmp2[256];<\/div>\n<div>chardate[128];<\/div>\n<div>time_t now;<\/div>\n<div>struct tm ptm;<\/div>\n<div>if (logGlobalFd)<\/div>\n<div>{<\/div>\n<div>fclose(logGlobalFd);<\/div>\n<div>time(&amp;now);<\/div>\n<div>localtime_r(&amp;now,&amp;ptm);<\/div>\n<div>strftime((char*)date, 128, &#8220;_%F_%T&#8221;, &amp;ptm);<\/div>\n<div>snprintf(tmp, sizeof(tmp), &#8220;%s\/%s&#8221;, LOG_GLOBAL_PATH, LOG_GLOBAL_FILE);<\/div>\n<div>snprintf(tmp2, sizeof(tmp2), &#8220;%s_%s.log&#8221;, tmp, date);<\/div>\n<div>remove(tmp2);<\/div>\n<div>rename(tmp, tmp2);<\/div>\n<div>logGlobalFd = fopen((char*)tmp, &#8220;a&#8221;);<\/div>\n<div>}<\/div>\n<div>return1;<\/div>\n<div>}<\/div>\n<div>void Log(const char *p_fmt, &#8230;)<\/div>\n<div>{<\/div>\n<div>chardate[256];<\/div>\n<div>time_t now;<\/div>\n<div>struct tm ptm;<\/div>\n<div>va_list ap;<\/div>\n<div><\/div>\n<div>#ifdef LOG_DEBUG<\/div>\n<div>if (!logGlobalFd){<\/div>\n<div>return;<\/div>\n<div>}<\/div>\n<div>pthread_mutex_lock(&amp;logGlobalMutex);<\/div>\n<div>time(&amp;now); \/\/ Gets the system time<\/div>\n<div>if (localtime_r(&amp;now, &amp;ptm))<\/div>\n<div>{<\/div>\n<div>strftime(date, sizeof (date), &#8220;%F %T&#8221;, &amp;ptm);<\/div>\n<div>fprintf(logGlobalFd, &#8220;%s &#8220;, date);<\/div>\n<div>va_start(ap, p_fmt);<\/div>\n<div>vfprintf(logGlobalFd, p_fmt, ap);<\/div>\n<div>va_end(ap);<\/div>\n<div>fflush(logGlobalFd);<\/div>\n<div>logGlobalLineNum++;<\/div>\n<div>if (logGlobalLineNum &gt; LOG_GLOBAL_MAX_LINE){<\/div>\n<div>LogNewLogFile();<\/div>\n<div>logGlobalLineNum = 0;<\/div>\n<div>}<\/div>\n<div>}<\/div>\n<div>pthread_mutex_unlock(&amp;logGlobalMutex);<\/div>\n<div>#endif \/\/LOG_DEBUG<\/div>\n<div>return;<\/div>\n<div>}<\/div>\n<div>void LogHex(char *pData, size_t size)<\/div>\n<div>{<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0size_t i;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0size_t c;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0unsigned int width=0x10;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0char lineStr[128];<\/div>\n<div>\u00a0\u00a0\u00a0for(i=0; i&lt;size; i+= width) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0sprintf(lineStr, &#8221; %8.8lX: \\0&#8243;, (long)i);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/* show hex to the left *\/<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0for(c = 0; c &lt; width; c++) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if(i+c &lt; size)<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0sprintf(lineStr+strlen(lineStr), &#8220;%02X \\0&#8221;, pData[i+c]);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0else<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0sprintf(lineStr+strlen(lineStr), &#8221; \\0&#8243;);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0sprintf(lineStr+strlen(lineStr), &#8221; \\0&#8243;);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/* show data on the right *\/<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0for(c = 0; (c &lt; width) &amp;&amp; (i+c &lt; size); c++) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0char x = (pData[i+c] &gt;= 0x20 &amp;&amp; pData[i+c] &lt; 0x80) ? pData[i+c] : &#8216;.&#8217;;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0sprintf(lineStr+strlen(lineStr), &#8220;%c\\0&#8221;, x);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0sprintf(lineStr+strlen(lineStr), &#8220;\\n\\0&#8221;);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Log(&#8220;DEBUG %s&#8221;, lineStr); \/* newline *\/<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0Log(&#8220;DEBUG \\n&#8221;); \/* space line *\/<\/div>\n<div>}<\/div>\n<\/div>\n<div><\/div>\n<h4>\n<strong>EasyCurl.h<\/strong><\/h4>\n<div>\u57fa\u4e8e\u7f51\u4e0a\u4ee3\u7801\u4fee\u6539\u800c\u6765\u7684\u3002<\/div>\n<div>\n<div>#ifndef __EASY_CURL_H__<\/div>\n<div>#define __EASY_CURL_H__<\/div>\n<div>#include &lt;string&gt;<\/div>\n<div>#include &lt;functional&gt;<\/div>\n<div>#include &lt;tr1\/memory&gt;<\/div>\n<div>#include &lt;tr1\/functional&gt;<\/div>\n<div>using std::string;<\/div>\n<div>class IProgressCallback<\/div>\n<div>{<\/div>\n<div>public:<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0virtual bool OnProgressCallback(int nValue) = 0;<\/div>\n<div>};<\/div>\n<div><\/div>\n<div>class EasyCurl<\/div>\n<div>{<\/div>\n<div>public:<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0EasyCurl(void);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0~EasyCurl(void);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0typedef std::tr1::function&lt;void(int)&gt; ProgressFunction;<\/div>\n<div><\/div>\n<div>public:<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\/\/\/ @brief\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0HTTP POST\u8bf7\u6c42<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\/\/\/ @param[in]\u00a0\u00a0strUrl \u8f93\u5165\u53c2\u6570,\u8bf7\u6c42\u7684Url\u5730\u5740,\u5982:https:\/\/www.baidu.com<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\/\/\/ @param[in]\u00a0\u00a0strParam \u8f93\u5165\u53c2\u6570,\u4f7f\u7528\u683c\u5f0f&#8221;name=kandy&amp;pwd=1234&#8243;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\/\/\/ @param[out]\u00a0strResponse \u8f93\u51fa\u53c2\u6570,\u8fd4\u56de\u7684\u5185\u5bb9<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\/\/\/ @param[in]\u00a0\u00a0pCaPath \u8f93\u5165\u53c2\u6570,\u4e3aCA\u8bc1\u4e66\u7684\u8def\u5f84.\u5982\u679c\u8f93\u5165\u4e3aNULL,\u5219\u4e0d\u9a8c\u8bc1\u670d\u52a1\u5668\u7aef\u8bc1\u4e66\u7684\u6709\u6548\u6027.<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\/\/\/\u00a0@remark\u00a0\u00a0\u00a0\u00a0\u00a0\u8fd4\u56de\u662f\u5426Post\u6210\u529f<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\/\/\/\u00a0@return\u00a0\u00a0\u00a0\u00a0\u00a0CURLE_OK,\u6210\u529f!\u5176\u4f59\u5931\u8d25<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0int http_post(const string &amp; strUrl, const string &amp; strParam, string &amp; strResponse, const char * pCaPath = NULL);<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\/\/\/ @brief\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0HTTPS GET\u8bf7\u6c42<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\/\/\/ @param[in]\u00a0\u00a0strUrl \u8f93\u5165\u53c2\u6570,\u8bf7\u6c42\u7684Url\u5730\u5740,\u5982:https:\/\/www.baidu.com<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\/\/\/ @param[out]\u00a0strResponse \u8f93\u51fa\u53c2\u6570,\u8fd4\u56de\u7684\u5185\u5bb9<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\/\/\/ @param[in]\u00a0\u00a0pCaPath \u8f93\u5165\u53c2\u6570,\u4e3aCA\u8bc1\u4e66\u7684\u8def\u5f84.\u5982\u679c\u8f93\u5165\u4e3aNULL,\u5219\u4e0d\u9a8c\u8bc1\u670d\u52a1\u5668\u7aef\u8bc1\u4e66\u7684\u6709\u6548\u6027.<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\/\/\/\u00a0@remark\u00a0\u00a0\u00a0\u00a0\u00a0\u8fd4\u56de\u662f\u5426Post\u6210\u529f<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\/\/\/\u00a0@return\u00a0\u00a0\u00a0\u00a0\u00a0CURLE_OK,\u6210\u529f!\u5176\u4f59\u5931\u8d25<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0int http_get(const string &amp; strUrl, string &amp; strResponse, const char * pCaPath = NULL);<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\/\/\/ @brief\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u6587\u4ef6\u4e0b\u8f7d<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\/\/\/ @param[in]\u00a0\u00a0url : \u8981\u4e0b\u8f7d\u6587\u4ef6\u7684url\u5730\u5740<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\/\/\/ @param[in]\u00a0\u00a0outfilename : \u4e0b\u8f7d\u6587\u4ef6\u6307\u5b9a\u7684\u6587\u4ef6\u540d<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\/\/\/\u00a0@remark<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\/\/\/\u00a0@return\u00a0\u00a0\u00a0\u00a0\u00a0\u8fd4\u56de0\u4ee3\u8868\u6210\u529f<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0int download_file(const string &amp; strUrl, const string &amp; strFile);<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\/\/\/ @brief\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u8fdb\u5ea6\u62a5\u544a\u5904\u7406<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\/\/\/ @param[in]\u00a0\u00a0func : \u51fd\u6570\u5730\u5740<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\/\/\/\u00a0@remark<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\/\/\/\u00a0@return\u00a0\u00a0\u00a0\u00a0\u00a0void<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0void set_progress_function(ProgressFunction func);<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\/\/\/ @brief\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u8fdb\u5ea6\u62a5\u544a\u5904\u7406<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\/\/\/ @param[in]\u00a0\u00a0pCallback : \u4f20\u5165\u7684\u5bf9\u8c61<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\/\/\/\u00a0@remark\u00a0\u00a0\u00a0\u00a0\u00a0\u4f7f\u7528\u7684\u7c7b\u7ee7\u627f\u4e8eIProgressCallback<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\/\/\/\u00a0@return\u00a0\u00a0\u00a0\u00a0\u00a0void<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0void set_progress_callback(IProgressCallback *pCallback);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\/\/<\/div>\n<div>public:<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0void SetDebug(bool bDebug);<\/div>\n<div><\/div>\n<div>protected:<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0static int progress_callback(void *pParam, double dltotal, double dlnow, double ultotal, double ulnow);<\/div>\n<div><\/div>\n<div>private:<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0bool m_bDebug;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0ProgressFunction\u00a0\u00a0\u00a0\u00a0m_updateProgress;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0IProgressCallback\u00a0\u00a0\u00a0*m_pHttpCallback;<\/div>\n<div>};<\/div>\n<div>#endif \/\/__EASY_CURL_H__<\/div>\n<\/div>\n<h4><strong>EasyCurl.cpp<\/strong><\/h4>\n<div>\n<div>\n<div>#include &lt;stdio.h&gt;<\/div>\n<div>#include &lt;stdlib.h&gt;<\/div>\n<div>#include &lt;string.h&gt;<\/div>\n<div>#include &lt;curl\/curl.h&gt;<\/div>\n<div>extern &#8220;C&#8221; {<\/div>\n<div>#include&#8221;log.h&#8221;<\/div>\n<div>}<\/div>\n<div>#include &#8220;EasyCurl.h&#8221;<\/div>\n<div>EasyCurl::EasyCurl(void)<\/div>\n<div>: m_bDebug(false)<\/div>\n<div>{<\/div>\n<div><\/div>\n<div>}<\/div>\n<div><\/div>\n<div>EasyCurl::~EasyCurl(void)<\/div>\n<div>{<\/div>\n<div><\/div>\n<div>}<\/div>\n<div>static int OnDebug(CURL *, curl_infotype itype, char * pData, size_t size, void *)<\/div>\n<div>{<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0switch(itype){<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0case CURLINFO_TEXT:<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0Log(&#8220;DEBUG %s =&gt; %s(): [TEXT], len: %10.10ld bytes (0x%8.8lx), context: \\n&#8221;, __FILE__, __FUNCTION__, (long)size, (long)size);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0LogHex(pData, size);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0break;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0case CURLINFO_HEADER_IN:<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0Log(&#8220;DEBUG %s =&gt; %s(): [HEADER_IN], len: %10.10ld bytes (0x%8.8lx), context: \\n&#8221;, __FILE__, __FUNCTION__, (long)size, (long)size);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0LogHex(pData, size);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0break;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0case CURLINFO_HEADER_OUT:<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0Log(&#8220;DEBUG %s =&gt; %s(): [HEADER_OUT], len: %10.10ld bytes (0x%8.8lx), context: \\n&#8221;, __FILE__, __FUNCTION__, (long)size, (long)size);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0LogHex(pData, size);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0break;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0case CURLINFO_DATA_IN:<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\/\/Log(&#8220;DEBUG %s =&gt; %s(): [DATA_IN], len: %10.10ld bytes (0x%8.8lx), context: \\n&#8221;, __FILE__, __FUNCTION__, (long)size, (long)size);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/LogHex(pData, size);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0break;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0case CURLINFO_DATA_OUT:<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\/\/Log(&#8220;DEBUG %s =&gt; %s(): [DATA_OUT], len: %10.10ld bytes (0x%8.8lx), context: \\n&#8221;, __FILE__, __FUNCTION__, (long)size, (long)size);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/LogHex(pData, size);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0break;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0case CURLINFO_SSL_DATA_IN:<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\/\/Log(&#8220;DEBUG %s =&gt; %s(): [SSL_DATA_IN], len: %10.10ld bytes (0x%8.8lx), context: \\n&#8221;, __FILE__, __FUNCTION__, (long)size, (long)size);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/LogHex(pData, size);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0break;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0case CURLINFO_SSL_DATA_OUT:<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\/\/Log(&#8220;DEBUG %s =&gt; %s(): [SSL_DATA_OUT], len: %10.10ld bytes (0x%8.8lx), context: \\n&#8221;, __FILE__, __FUNCTION__, (long)size, (long)size);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/LogHex(pData, size);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0break;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0default:<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0Log(&#8220;ERROR %s =&gt; %s(): unknown itype: %d, len: %10.10ld bytes (0x%8.8lx), context: \\n&#8221;, __FILE__, __FUNCTION__, itype, (long)size, (long)size);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0break;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0return 0;<\/div>\n<div>}<\/div>\n<div>static size_t OnWriteData(void* buffer, size_t size, size_t nmemb, void* lpVoid)<\/div>\n<div>{<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0string* str = dynamic_cast&lt;string*&gt;((string *)lpVoid);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0if( NULL == str || NULL == buffer )\u00a0{<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return -1;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div>char* pData = (char*)buffer;<\/div>\n<div>str-&gt;append(pData, size * nmemb);<\/div>\n<div>Log(&#8220;DEBUG %s =&gt; %s(): OnWriteData, len: %10.10ld bytes (0x%8.8lx), context: \\n&#8221;, __FILE__, __FUNCTION__, (long)size*nmemb, (long)size*nmemb);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0LogHex((char *)buffer, size * nmemb);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0return nmemb;<\/div>\n<div>}<\/div>\n<div>static size_t OnReadData(void* buffer, size_t size, size_t nmemb, void* lpVoid)<\/div>\n<div>{<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0string* str = dynamic_cast&lt;string*&gt;((string *)lpVoid);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0if( NULL == str || NULL == buffer )\u00a0{<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return -1;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div>char* pData = (char*)buffer;<\/div>\n<div>str-&gt;append(pData, size * nmemb);<\/div>\n<div>Log(&#8220;DEBUG %s =&gt; %s(): OnReadData, len: %10.10ld bytes (0x%8.8lx), context: \\n&#8221;, __FILE__, __FUNCTION__, (long)size*nmemb, (long)size*nmemb);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0LogHex((char *)buffer, size * nmemb);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0return nmemb;<\/div>\n<div>}<\/div>\n<div>\/* libcurl write callback function *\/<\/div>\n<div>size_t write_data(void *ptr, size_t size, size_t nmemb, FILE *stream)<\/div>\n<div>{<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0size_t written = fwrite(ptr, size, nmemb, stream);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0return written;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\/\/CAN WRITE data to FILE.<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\/\/FILE* fp = NULL;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\/\/fp = fopen(&#8220;c:\\\\test.dat&#8221;, &#8220;ab+&#8221;);\/\/ must be a, otherwise will recovery pre data.<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\/\/size_t nWrite = fwrite(ptr, nSize, nmemb, fp);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\/\/fclose(fp);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\/\/return nWrite;<\/div>\n<div>}<\/div>\n<div>\/\/<\/div>\n<div>int EasyCurl::progress_callback(void *pParam, double dltotal, double dlnow, double ultotal, double ulnow)<\/div>\n<div>{<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0EasyCurl* pThis = (EasyCurl*)pParam;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0int nPos = (int)((dlnow \/ dltotal) * 100);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0if (pThis-&gt;m_pHttpCallback)\u00a0{<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0pThis-&gt;m_pHttpCallback-&gt;OnProgressCallback(nPos);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0if (pThis-&gt;m_updateProgress) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0pThis-&gt;m_updateProgress(nPos);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0return 0;<\/div>\n<div>}<\/div>\n<div>\/\/<\/div>\n<div>string globalCurlStrSend;<\/div>\n<div>int EasyCurl::http_post(const string &amp; strUrl, const string &amp; strParam, string &amp; strResponse, const char * pCaPath)<\/div>\n<div>{<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0CURLcode res;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0CURL* curl = curl_easy_init();<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0if(NULL == curl) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return CURLE_FAILED_INIT;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0if(m_bDebug) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, OnDebug);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0curl_easy_setopt(curl, CURLOPT_URL, strUrl.c_str());<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0curl_easy_setopt(curl, CURLOPT_POST, 1L);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0curl_easy_setopt(curl, CURLOPT_POSTFIELDS, strParam.c_str());<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0curl_easy_setopt(curl, CURLOPT_READFUNCTION, OnReadData); \/\/not used, only for PUT<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0globalCurlStrSend = &#8220;&#8221;;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0curl_easy_setopt(curl, CURLOPT_READDATA, (void *)&amp;globalCurlStrSend);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, OnWriteData);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&amp;strResponse);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); \/\/for 302, redirect<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0curl_easy_setopt(curl, CURLOPT_COOKIEFILE, &#8220;&#8221;);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1L);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0if(NULL == pCaPath) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, false); \/\/not verify peer cert and peer host<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, false);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0else {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/default is PEM, so needn&#8217;t to set, and can support DER.<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/curl_easy_setopt(curl,CURLOPT_SSLCERTTYPE,&#8221;PEM&#8221;);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, true);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0curl_easy_setopt(curl, CURLOPT_CAINFO, pCaPath);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 10L); \/\/ wait 10 seconds to connect server.<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0curl_easy_setopt(curl, CURLOPT_TIMEOUT, 100L); \/\/wait 100 seconds to get content from server.<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0res = curl_easy_perform(curl);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0if(res != CURLE_OK){ \/\/CURLE_OK is 0<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0Log(&#8220;ERROR %s =&gt; %s(): curl_easy_perform() failed: %s\\n&#8221;, __FILE__, __FUNCTION__, curl_easy_strerror(res));<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0curl_easy_cleanup(curl);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return res;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0long retcode = 0;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0res = curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE , &amp;retcode);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0if(res != CURLE_OK){ \/\/CURLE_OK is 0<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0Log(&#8220;ERROR %s =&gt; %s(): curl_easy_getinfo() failed: %s\\n&#8221;, __FILE__, __FUNCTION__, curl_easy_strerror(res));<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0curl_easy_cleanup(curl);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return res;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0if(retcode == 200 || retcode == 302){ \/\/success<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0Log(&#8220;DEBUG %s =&gt; %s(): curl_easy_getinfo() return code: %ld\\n&#8221;, __FILE__, __FUNCTION__, retcode);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0}else{ \/\/ can return content, but is not wanted content.<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0Log(&#8220;ERROR %s =&gt; %s(): curl_easy_getinfo() return code: %ld\\n&#8221;, __FILE__, __FUNCTION__, retcode);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0curl_easy_cleanup(curl);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return -1;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0curl_easy_cleanup(curl);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0return res;<\/div>\n<div>}<\/div>\n<div>\/\/<\/div>\n<div>int EasyCurl::http_get(const string &amp; strUrl, string &amp; strResponse, const char * pCaPath)<\/div>\n<div>{<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0CURLcode res;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0CURL* curl = curl_easy_init();<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0if(NULL == curl) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return CURLE_FAILED_INIT;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0if(m_bDebug) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, OnDebug);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0curl_easy_setopt(curl, CURLOPT_URL, strUrl.c_str());<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0curl_easy_setopt(curl, CURLOPT_READFUNCTION, OnReadData); \/\/not used, only for PUT<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0globalCurlStrSend = &#8220;&#8221;;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0curl_easy_setopt(curl, CURLOPT_READDATA, (void *)&amp;globalCurlStrSend);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, OnWriteData);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&amp;strResponse);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); \/\/for 302, redirect<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0curl_easy_setopt(curl, CURLOPT_COOKIEFILE, &#8220;&#8221;);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0if(NULL == pCaPath) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, false); \/\/not verify peer cert and peer host<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, false);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0else {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, true);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0curl_easy_setopt(curl, CURLOPT_CAINFO, pCaPath);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 10L);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0curl_easy_setopt(curl, CURLOPT_TIMEOUT, 100L);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0res = curl_easy_perform(curl);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0if(res != CURLE_OK){ \/\/CURLE_OK is 0<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0Log(&#8220;ERROR %s =&gt; %s(): curl_easy_perform() failed: %s\\n&#8221;, __FILE__, __FUNCTION__, curl_easy_strerror(res));<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0curl_easy_cleanup(curl);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return res;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0long retcode = 0;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0res = curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE , &amp;retcode);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0if(res != CURLE_OK){ \/\/CURLE_OK is 0<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0Log(&#8220;ERROR %s =&gt; %s(): curl_easy_getinfo() failed: %s\\n&#8221;, __FILE__, __FUNCTION__, curl_easy_strerror(res));<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0curl_easy_cleanup(curl);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return res;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0if(retcode == 200 || retcode == 302){ \/\/success<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0Log(&#8220;DEBUG %s =&gt; %s(): curl_easy_getinfo() return code: %ld\\n&#8221;, __FILE__, __FUNCTION__, retcode);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0}else{ \/\/ can return content, but is not wanted content.<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0Log(&#8220;ERROR %s =&gt; %s(): curl_easy_getinfo() return code: %ld\\n&#8221;, __FILE__, __FUNCTION__, retcode);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0curl_easy_cleanup(curl);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return -1;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0curl_easy_cleanup(curl);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0return res;<\/div>\n<div>}<\/div>\n<div>\/\/<\/div>\n<div>int EasyCurl::download_file(const string &amp; strUrl, const string &amp; strFile)<\/div>\n<div>{<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0FILE *fp;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\/\/call curl_easy_init() to get easy interface type pointer.<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0CURL *curl = curl_easy_init();<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0if (curl) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0fp = fopen(strFile.c_str(), &#8220;wb&#8221;);<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0CURLcode res = curl_easy_setopt(curl, CURLOPT_URL, strUrl.c_str());<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if (res != CURLE_OK) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0fclose(fp);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0curl_easy_cleanup(curl);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return -1;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0res = curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if (res != CURLE_OK) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0fclose(fp);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0curl_easy_cleanup(curl);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return -1;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div><\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0res = curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if (res != CURLE_OK) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0fclose(fp);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0curl_easy_cleanup(curl);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return -1;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 0);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0curl_easy_setopt(curl, CURLOPT_PROGRESSFUNCTION, progress_callback);\/\/set progress function.<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0curl_easy_setopt(curl, CURLOPT_PROGRESSDATA, this);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/start to run query.<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0res = curl_easy_perform(curl);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0fclose(fp);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/ Check for errors<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if (res != CURLE_OK) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0curl_easy_cleanup(curl);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return -1;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0curl_easy_cleanup(curl);\/\/ call curl_easy_cleanup() to release memory<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0return 0;<\/div>\n<div>}<\/div>\n<div>\/\/<\/div>\n<div>void EasyCurl::set_progress_function(ProgressFunction func)<\/div>\n<div>{<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0m_updateProgress = func;<\/div>\n<div>}<\/div>\n<div>\/\/<\/div>\n<div>void EasyCurl::set_progress_callback(IProgressCallback *pCallback)<\/div>\n<div>{<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0m_pHttpCallback = pCallback;<\/div>\n<div>}<\/div>\n<div>\/\/<\/div>\n<div>void EasyCurl::SetDebug(bool bDebug)<\/div>\n<div>{<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0m_bDebug = bDebug;<\/div>\n<div>}<\/div>\n<\/div>\n<\/div>\n<h4><strong>main.cpp<\/strong><\/h4>\n<div>\u8c03\u7528\u6d4b\u8bd5\uff1a<\/div>\n<div>\n<div>\n<div>int main(void)<\/div>\n<div>{<\/div>\n<div>\/\/log init<\/div>\n<div>InitLog();<\/div>\n<div>\/\/loop<\/div>\n<div>EasyCurl easyCurl;<\/div>\n<div>easyCurl.SetDebug(true);<\/div>\n<div>for(;;){<\/div>\n<div>Log(&#8220;DEBUG %s =&gt; %s(): Enter Main Loop. \\n&#8221;, __FILE__, __FUNCTION__);<\/div>\n<div>string strUrl = &#8220;http:\/\/www.baidu.com\/&#8221;;<\/div>\n<div>string strParam = &#8220;id=3435&#8221;;<\/div>\n<div>string strResponse = &#8220;&#8221;; \/\/ return content will be saved in this string.<\/div>\n<div>int rtn =easyCurl.http_post(strUrl, strParam, strResponse, NULL);<\/div>\n<div>Log(&#8220;DEBUG %s =&gt; %s(): http_post return: %d\\n&#8221;, __FILE__, __FUNCTION__, rtn);<\/div>\n<div>sleep(5);<\/div>\n<div>}<\/div>\n<div>\/\/log uninit<\/div>\n<div>UninitLog();<\/div>\n<div>return0;<\/div>\n<div>}<\/div>\n<div><\/div>\n<\/div>\n<\/div>\n<div><\/div>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>linux\u4e0b\u7528c\u8bed\u8a00\uff0c\u53ef\u4ee5\u4f7f\u7528curl\u5e93\u6765\u5b9e\u73b0\u76f8\u5173http get\u3001post\u4e4b\u7c7b\u7684\u64cd\u4f5c\uff0c\u770b\u4f8b\u5b50\uff1a log.h  &hellip;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[15],"tags":[742,745,743,692,693,744],"class_list":["post-1017","post","type-post","status-publish","format-standard","hentry","category-linuxandroid","tag-curl","tag-curlopt_post","tag-get","tag-http","tag-https","tag-post"],"views":2356,"_links":{"self":[{"href":"http:\/\/www.max-shu.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/1017","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.max-shu.com\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.max-shu.com\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.max-shu.com\/blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.max-shu.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1017"}],"version-history":[{"count":1,"href":"http:\/\/www.max-shu.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/1017\/revisions"}],"predecessor-version":[{"id":1018,"href":"http:\/\/www.max-shu.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/1017\/revisions\/1018"}],"wp:attachment":[{"href":"http:\/\/www.max-shu.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1017"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.max-shu.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1017"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.max-shu.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1017"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}