一、libcurl的http使用
源文件:
github源码: https://github.com/JannyMon/CurlDemo
1.libcurl全局初始化与反初始化
初始化:
CURL_EXTERN CURLcode curl_global_init(long flags);
反初始化:
CURL_EXTERN void curl_global_cleanup(void);
curl_global_init(CURL_GLOBAL_ALL);
curl_global_cleanup( );
这是全局初始化函数,并不是线程安全的,只能全局调用一次。
2.libcurl初始化与反初始化
CURL_EXTERN CURL *curl_easy_init(void);
CURL_EXTERN void curl_easy_cleanup(CURL *curl);
局部初始化,可以多次调用。
3.设置CURL指针的属性
CURL_EXTERN CURLcode curl_easy_setopt(CURL *curl, CURLoption option, ...);
4.执行CURL请求
CURL_EXTERN CURLcode curl_easy_perform(CURL *curl);
5.具体的调用流程:
(1)全局初始化(仅一次):curl_global_init(CURL_GLOBAL_ALL);
(2)局部初始化:curl_easy_init( );
(3)设置CURL属性:curl_easy_setopt(
m_lpCurl, CURLOPT_URL, lpUrl
);
(4)执行请求:
curl_easy_perform(m_lpCurl)
;
(5)局部反初始化:curl_easy_cleanup(m_lpCurl);
(6)全局反初始化:curl_global_cleanup( );
6.基本的http属性字段的设置:
(1).设置本次连接的等待时间,仅仅是HTTP连接
crulCode = curl_easy_setopt(m_lpCurl, CURLOPT_CONNECTTIMEOUT, u32WaitTime);
(2)设置URL地址
crulCode = curl_easy_setopt(m_lpCurl, CURLOPT_URL, lpUrl);
(3)设置http的头回调函数
crulCode = curl_easy_setopt( m_lpCurl, CURLOPT_HEADERFUNCTION, HeadCallBack );
(4)设置头回调函数的上下文指针
crulCode = curl_easy_setopt( m_lpCurl, CURLOPT_HEADERDATA, this );
(5)设置请求方式为post
crulCode = curl_easy_setopt(m_lpCurl, CURLOPT_POST, 1L);
(6)设置post所携带的数据
crulCode = curl_easy_setopt(m_lpCurl, CURLOPT_POSTFIELDS, lpInBuffer);
(7)设置post数据的大小
crulCode = curl_easy_setopt(m_lpCurl, CURLOPT_POSTFIELDSIZE, u32InSize);
(8))设置http请求的返回数据的回调函数的上下文指针
crulCode = curl_easy_setopt(m_lpCurl, CURLOPT_WRITEDATA, (void*)m_lpBody);
(9)设置http请求的返回数据的回调函数,body数据的回调
crulCode = curl_easy_setopt(m_lpCurl, CURLOPT_WRITEFUNCTION, BodyCallBack); //回调http的响应数据
7.https相关属性设置
(1)设置SSL证书的路径
crulCode = curl_easy_setopt(m_lpCurl, CURLOPT_CAINFO, s8KeyPathString);
(2)设置是否验证SSL证书
crulCode = curl_easy_setopt(m_lpCurl, CURLOPT_SSL_VERIFYPEER, TRUE);
crulCode = curl_easy_setopt(m_lpCurl, CURLOPT_SSL_VERIFYPEER, TRUE);
(3)设置SSL证书版本
crulCode = curl_easy_setopt(m_lpCurl, CURLOPT_SSLVERSION , CURL_SSLVERSION_TLSv1_1);
crulCode = curl_easy_setopt(m_lpCurl, CURLOPT_SSLVERSION , CURL_SSLVERSION_TLSv1_1);
(4)设置是否验证host的证书
crulCode = curl_easy_setopt(m_lpCurl, CURLOPT_SSL_VERIFYHOST, FALSE);
crulCode = curl_easy_setopt(m_lpCurl, CURLOPT_SSL_VERIFYHOST, FALSE);
(5)设置用户名密码
crulCode = curl_easy_setopt(m_lpCurl, CURLOPT_USERPWD, s8Param);
crulCode = curl_easy_setopt(m_lpCurl, CURLOPT_USERPWD, s8Param);
(6)设置认证方式为DIGEST
crulCode = curl_easy_setopt(m_lpCurl, CURLOPT_HTTPAUTH, (long)CURLAUTH_DIGEST);
crulCode = curl_easy_setopt(m_lpCurl, CURLOPT_HTTPAUTH, (long)CURLAUTH_DIGEST);
(7)设置验证方式BASIC
crulCode = curl_easy_setopt(m_lpCurl, CURLOPT_HTTPAUTH, (long)CURLAUTH_BASIC);
crulCode = curl_easy_setopt(m_lpCurl, CURLOPT_HTTPAUTH, (long)CURLAUTH_BASIC);
(8)加入curl的标示头
crulCode = curl_easy_setopt(m_lpCurl, CURLOPT_USERAGENT, "curl/7.47.1");
crulCode = curl_easy_setopt(m_lpCurl, CURLOPT_USERAGENT, "curl/7.47.1");
(9)设置XHASH,CHASH,XHASH等属性值
lpCurlList = curl_slist_append(lpCurlList, GetSHash( ));
lpCurlList = curl_slist_append(lpCurlList, GetCHash( ));
lpCurlList = curl_slist_append(lpCurlList, GetXHash( ));
curl_easy_setopt(m_lpCurl, CURLOPT_HTTPHEADER, lpCurlList);
lpCurlList = curl_slist_append(lpCurlList, GetCHash( ));
lpCurlList = curl_slist_append(lpCurlList, GetXHash( ));
curl_easy_setopt(m_lpCurl, CURLOPT_HTTPHEADER, lpCurlList);
8.上传文件相关设置
(1)设置上传的文件路径
struct curl_httppost *post = NULL;
struct curl_httppost *last = NULL;
eFormRet = curl_formadd(&post, &last, CURLFORM_COPYNAME, "file", CURLFORM_FILE, lpInBuffer, CURLFORM_END) ;
struct curl_httppost *last = NULL;
eFormRet = curl_formadd(&post, &last, CURLFORM_COPYNAME, "file", CURLFORM_FILE, lpInBuffer, CURLFORM_END) ;
9.代码示例:
头文件(头文件还需要包含CURL的头文件这里不列举):
#ifndef _I8H_HTTP_H
#define _I8H_HTTP_H
#include <string.h>
#include "curl.h"
#ifndef VOID
typedef void VOID;
#endif
#ifndef U64
typedef unsigned long long U64 ;
#endif
#ifndef U32
typedef unsigned int U32;
#endif
#ifndef U16
typedef unsigned short U16 ;
#endif
#ifndef U8
typedef unsigned char U8 ;
#endif
#ifndef S32
typedef int S32;
#endif
#ifndef S16
typedef short S16 ;
#endif
#ifndef S8
typedef char S8 ;
#endif
#ifndef TRUE
#define TRUE 1
#endif
#ifndef FALSE
#define FALSE 0
#endif
#define MAX_HASH_CODE_LEN 64
#define I8H_ERROR_CODE_NOERROR 0 //!没有错误
#define I8H_ERROR_CODE_FAIL 1 //!失败
#define I8H_ERROR_CODE_PASSWORD_ERROR 2 //!用户名密码错误
#define I8H_ERROR_CODE_NOENOUGHPRI 3 //!权限不足
#define I8H_ERROR_CODE_NOINIT 4 //!没有初始化
#define I8H_ERROR_CODE_HASINIT 5 //!已经初始化
#define I8H_ERROR_CODE_ORDER_ERROR 6 //!调用次序错误
#define I8H_ERROR_CODE_PARAMETER_ERROR 7 //!参数错误
#define I8H_ERROR_CODE_ALLOC_RESOURCE_ERROR 8 //!资源分配错误
#define I8H_ERROR_CODE_CALL3THAPI_ERROR 9 //!调用第三方接口错误
#define I8H_ERROR_CODE_CHAN_ERROR 10 //!通道号错误
#define I8H_ERROR_CODE_CHAN_NOTSUPPORT <span style="white-space:pre"> </span>11 //!通道不支持该操作
#define I8H_ERROR_CODE_OVER_MAXLINK 12 //!连接到DVR的客户端个数超过最大
#define I8H_ERROR_CODE_VERSIONNOMATCH 13 //!版本不匹配
#define I8H_ERROR_CODE_NETWORK_FAIL 14 //!网络错误(包括连接 发送 接收等错误)
#define I8H_ERROR_CODE_OPENFILE_FAIL 15 //!打开文件出错
#define I8H_ERROR_CODE_UPGRADE_FAIL 16 //!DVR升级失败
#define I8H_ERROR_CODE_DATASERIALIZE_FAIL 17 //!数据序列化错误
#define I8H_ERROR_CODE_DATADESERIALIZE_FAIL 18 //!数据反序列化错误
#define I8H_ERROR_CODE_NOENOUGH_BUF 19 //!缓冲区太小
#define I8H_ERROR_CODE_USERNOTEXIST 20 //!用户不存在
#define I8H_ERROR_CODE_COMMAND_UNSUPPORT 21 //!命令不支持
#define I8H_ERROR_CODE_INVALID_HANDLE 22 //!无效句柄
#define I8H_ERROR_CODE_SERVER_FORBIDDEN 23 //!服务禁止
#define I8H_ERROR_CODE_CONNECT_SSL_ERROR 24 //!SSL连接错误
#define UTILITY_FREE_POINT(x) \
{ \
if (NULL != x) \
{ \
delete x; \
x = NULL; \
} \
}
//!检查并释放数组
#define UTILITY_FREE_ARRAY(x) \
{ \
if (NULL != x) \
{ \
delete[] x; \
x = NULL; \
} \
}
#define UTILITY_CLEAN_ARRAY(x, size) \
{ \
if(NULL != x) \
{ \
memset(x, 0, size) ; \
} \
}
#define UTILITY_COPY_ARRAY(x, y, size) \
{ \
if(NULL != (x) && NULL != (y)) \
{ \
memcpy((x), (y), size) ; \
} \
}
typedef struct _tagHttpHead
{
U16 u16ResultCode ;
U16 u16DataType ;
}HttpHead ;
typedef struct _tagHttpBody
{
S8* lpBuffer;
U8 u8Full;
U32 u32Offset;
U32 u32TotalSize;
}HttpBody;
namespace HTTPSDK
{
class CHttpSession
{
public:
CHttpSession( ) ;
~CHttpSession( ) ;
S8 *GetUserName( ) ;
S8 *GetPassword( ) ;
S8 *GetSHash( );
S8 *GetCHash( );
S8 *GetXHash( );
VOID SetUser(S8 *lpUserName, S8 *lpPassword) ;
VOID SetHashCode(const S8* lpSHash, const S8* lpCHash, const S8* lpXHash);
S32 OnGetRequest(S8* lpUrl, S8* lpHeader, S8* lpInBuffer,U32 u32InSize, S8** lpOutBuffer, U32* u32OutSize, U32 u32Time);
S32 OnPostRequest(S8* lpUrl, S8* lpHeader, S8* lpInBuffer,U32 u32InSize, S8** lpOutBuffer, U32* u32OutSize, U32 u32Time);
S32 OnRequest4Https(S8* lpUrl, S8* lpHeader, S8* lpInBuffer,U32 u32InSize, S8** lpOutBuffer, U32* u32OutSize, U32 u32Time, VOID* lpUser, U32 u32Type);
S32 OnHeartBeatRequest(S8* lpUrl, S8* lpHeader, S8* lpInBuffer,U32 u32InSize, S8** lpOutBuffer, U32* u32OutSize, U32 u32Time);
S32 OnUpload(S8* lpUrl, S8* lpHeader, S8* lpInBuffer,U32 u32InSize, S8** lpOutBuffer, U32* u32OutSize, U32 u32Time);
S32 OnUpload4Https(S8* lpUrl, S8* lpHeader, S8* lpInBuffer,U32 u32InSize, S8** lpOutBuffer, U32* u32OutSize, U32 u32Time);
static size_t BodyCallBack(void *buffer, size_t size, size_t nmemb, void *stream);
static size_t HeadCallBack(void *buffer, size_t size, size_t nmemb, void *stream);
static VOID SafeCopyString(const S8 *lpSrc, S8 *lpDest, S32 DestLen) ;
private:
CHttpSession(const CHttpSession&){ }
CHttpSession& operator=(const CHttpSession&){return (*this);}
private:
CURL* m_lpCurl ;
HttpHead *m_lpHead ;
HttpBody *m_lpBody ;
S8 m_s8UserName[32] ;
S8 m_s8Password[16] ;
S8 m_s8SHash[MAX_HASH_CODE_LEN];
S8 m_s8XHash[MAX_HASH_CODE_LEN];
S8 m_s8CHash[MAX_HASH_CODE_LEN];
};
}
#endif
源文件:
#include "I8H_Http.h"
extern S8 s8KeyPathString[256];
namespace HTTPSDK
{
CHttpSession::CHttpSession( )
:m_lpCurl(NULL)
,m_lpHead(NULL)
,m_lpBody(NULL)
{
UTILITY_CLEAN_ARRAY(m_s8UserName, sizeof(m_s8UserName));
UTILITY_CLEAN_ARRAY(m_s8Password, sizeof(m_s8Password));
UTILITY_CLEAN_ARRAY(m_s8SHash, sizeof(m_s8SHash));
UTILITY_CLEAN_ARRAY(m_s8XHash, sizeof(m_s8XHash));
UTILITY_CLEAN_ARRAY(m_s8CHash, sizeof(m_s8CHash));
}
CHttpSession::~CHttpSession( )
{
UTILITY_FREE_POINT(m_lpHead);
if(m_lpBody != NULL)
{
UTILITY_FREE_ARRAY(m_lpBody->lpBuffer);
}
UTILITY_FREE_POINT(m_lpBody) ;
}
S8 *CHttpSession::GetUserName( )
{
return m_s8UserName ;
}
S8 *CHttpSession::GetPassword( )
{
return m_s8Password ;
}
VOID CHttpSession::SetUser(S8 *lpUserName, S8 *lpPassword)
{
CHttpSession::SafeCopyString(lpUserName, m_s8UserName, sizeof(m_s8UserName)) ;
CHttpSession::SafeCopyString(lpPassword, m_s8Password, sizeof(m_s8Password)) ;
}
S8 * CHttpSession::GetSHash()
{
return m_s8SHash;
}
S8 * CHttpSession::GetCHash()
{
return m_s8CHash;
}
S8 * CHttpSession::GetXHash()
{
return m_s8XHash;
}
VOID CHttpSession::SetHashCode(const S8* lpSHash, const S8* lpCHash, const S8* lpXHash)
{
if(lpSHash != NULL)
{
CHttpSession::SafeCopyString(lpSHash, m_s8SHash, sizeof(m_s8SHash));
}
if(lpCHash != NULL)
{
CHttpSession::SafeCopyString(lpCHash, m_s8CHash, sizeof(m_s8CHash));
}
if(lpXHash != NULL)
{
CHttpSession::SafeCopyString(lpXHash, m_s8XHash, sizeof(m_s8XHash));
}
}
VOID CHttpSession::SafeCopyString(const S8 *lpSrc, S8 *lpDest, S32 DestLen)
{
S32 SrcLen = 0 ;
if(lpSrc == NULL || lpDest == NULL)
{
return ;
}
SrcLen = (S32)strlen(lpSrc) ;
if(SrcLen >= DestLen)
{
memcpy(lpDest, lpSrc, DestLen - 1) ;
lpDest[DestLen - 1] = '\0' ;
}
else
{
if(SrcLen >= 1)
{
strcpy(lpDest, lpSrc) ;
}
else
{
memset(lpDest, 0, DestLen) ;
}
}
}
S32 CHttpSession::OnGetRequest(S8* lpUrl, S8* lpHeader, S8* lpInBuffer,U32 u32InSize, S8** lpOutBuffer, U32* u32OutSize, U32 u32Time)
{
U32 u32WaitTime = 0;
U32 u32TryTimes = 0;
CURLcode crulCode = CURLE_OK;
if(lpUrl == NULL || lpHeader == NULL || lpInBuffer == NULL || lpOutBuffer == NULL || u32InSize <= 0 || u32Time <= 0 || u32OutSize == NULL)
{
return I8H_ERROR_CODE_PARAMETER_ERROR;
}
m_lpHead = new HttpHead;
m_lpBody = new HttpBody;
if(m_lpHead == NULL || m_lpBody == NULL)
{
UTILITY_FREE_POINT(m_lpHead);
UTILITY_FREE_POINT(m_lpBody);
return I8H_ERROR_CODE_ALLOC_RESOURCE_ERROR;
}
memset(m_lpHead, 0, sizeof(HttpHead));
memset(m_lpBody, 0, sizeof(HttpBody));
u32WaitTime = (u32Time >> 16) & 0xFFFF;
u32TryTimes = u32Time & 0xFFFF;
m_lpBody->u32TotalSize = 1024*1024;
m_lpCurl = curl_easy_init( );
if(m_lpCurl == NULL )
{
return I8H_ERROR_CODE_ALLOC_RESOURCE_ERROR;
}
m_lpBody->lpBuffer = new S8[m_lpBody->u32TotalSize];
if(m_lpBody->lpBuffer == NULL)
{
curl_easy_cleanup(m_lpCurl);
m_lpCurl = NULL;
UTILITY_FREE_POINT(m_lpHead);
UTILITY_FREE_POINT(m_lpBody);
return I8H_ERROR_CODE_ALLOC_RESOURCE_ERROR;
}
memset(m_lpBody->lpBuffer, 0, m_lpBody->u32TotalSize* sizeof(S8));
crulCode = curl_easy_setopt(m_lpCurl, CURLOPT_CONNECTTIMEOUT, u32WaitTime);
if(crulCode != CURLE_OK)
{
UTILITY_FREE_ARRAY(m_lpBody->lpBuffer);
UTILITY_FREE_POINT(m_lpHead);
UTILITY_FREE_POINT(m_lpBody);
if(m_lpCurl != NULL)
{
curl_easy_cleanup(m_lpCurl);
m_lpCurl = NULL;
}
return I8H_ERROR_CODE_CALL3THAPI_ERROR;
}
crulCode = curl_easy_setopt(m_lpCurl, CURLOPT_FRESH_CONNECT, TRUE);
if(crulCode != CURLE_OK)
{
UTILITY_FREE_ARRAY(m_lpBody->lpBuffer);
UTILITY_FREE_POINT(m_lpHead);
UTILITY_FREE_POINT(m_lpBody);
if(m_lpCurl != NULL)
{
curl_easy_cleanup(m_lpCurl);
m_lpCurl = NULL;
}
return I8H_ERROR_CODE_CALL3THAPI_ERROR;
}
crulCode = curl_easy_setopt(m_lpCurl, CURLOPT_URL, lpUrl);
if(crulCode != CURLE_OK)
{
UTILITY_FREE_ARRAY(m_lpBody->lpBuffer);
UTILITY_FREE_POINT(m_lpHead);
UTILITY_FREE_POINT(m_lpBody);
if(m_lpCurl != NULL)
{
curl_easy_cleanup(m_lpCurl);
m_lpCurl = NULL;
}
return I8H_ERROR_CODE_CALL3THAPI_ERROR;
}
crulCode = curl_easy_setopt( m_lpCurl, CURLOPT_HEADERFUNCTION, HeadCallBack );
if(crulCode != CURLE_OK)
{
UTILITY_FREE_ARRAY(m_lpBody->lpBuffer);
UTILITY_FREE_POINT(m_lpHead);
UTILITY_FREE_POINT(m_lpBody);
if(m_lpCurl != NULL)
{
curl_easy_cleanup(m_lpCurl);
m_lpCurl = NULL;
}
return I8H_ERROR_CODE_CALL3THAPI_ERROR;
}
crulCode = curl_easy_setopt( m_lpCurl, CURLOPT_HEADERDATA, this );
if(crulCode != CURLE_OK)
{
UTILITY_FREE_ARRAY(m_lpBody->lpBuffer);
UTILITY_FREE_POINT(m_lpHead);
UTILITY_FREE_POINT(m_lpBody);
if(m_lpCurl != NULL)
{
curl_easy_cleanup(m_lpCurl);
m_lpCurl = NULL;
}
return I8H_ERROR_CODE_CALL3THAPI_ERROR;
}
crulCode = curl_easy_setopt(m_lpCurl, CURLOPT_WRITEDATA, (void*)m_lpBody);
if(crulCode != CURLE_OK)
{
UTILITY_FREE_ARRAY(m_lpBody->lpBuffer);
UTILITY_FREE_POINT(m_lpHead);
UTILITY_FREE_POINT(m_lpBody);
if(m_lpCurl != NULL)
{
curl_easy_cleanup(m_lpCurl);
m_lpCurl = NULL;
}
return I8H_ERROR_CODE_CALL3THAPI_ERROR;
}
crulCode = curl_easy_setopt(m_lpCurl, CURLOPT_WRITEFUNCTION, BodyCallBack); //回调http的响应数据
if(crulCode != CURLE_OK)
{
UTILITY_FREE_ARRAY(m_lpBody->lpBuffer);
UTILITY_FREE_POINT(m_lpHead);
UTILITY_FREE_POINT(m_lpBody);
if(m_lpCurl != NULL)
{
curl_easy_cleanup(m_lpCurl);
m_lpCurl = NULL;
}
return I8H_ERROR_CODE_CALL3THAPI_ERROR;
}
while(u32TryTimes)
{
crulCode = curl_easy_perform(m_lpCurl);
if(crulCode == CURLE_OK)
{
break;
}
else
{
u32TryTimes--;
}
}
if(crulCode != CURLE_OK)
{
UTILITY_FREE_ARRAY(m_lpBody->lpBuffer);
UTILITY_FREE_POINT(m_lpHead);
UTILITY_FREE_POINT(m_lpBody);
if(m_lpCurl != NULL)
{
curl_easy_cleanup(m_lpCurl);
m_lpCurl = NULL;
}
return I8H_ERROR_CODE_CALL3THAPI_ERROR;
}
if(m_lpBody->u8Full == 1)
{
UTILITY_FREE_ARRAY(m_lpBody->lpBuffer);
UTILITY_FREE_POINT(m_lpHead);
UTILITY_FREE_POINT(m_lpBody);
if(m_lpCurl != NULL)
{
curl_easy_cleanup(m_lpCurl);
m_lpCurl = NULL;
}
return I8H_ERROR_CODE_NOENOUGH_BUF;
}
if(m_lpCurl != NULL)
{
curl_easy_cleanup(m_lpCurl);
m_lpCurl = NULL;
}
if(m_lpHead->u16ResultCode == 404)
{
UTILITY_FREE_ARRAY(m_lpBody->lpBuffer);
UTILITY_FREE_POINT(m_lpHead);
UTILITY_FREE_POINT(m_lpBody);
return I8H_ERROR_CODE_COMMAND_UNSUPPORT;
}
else
{
*lpOutBuffer = m_lpBody->lpBuffer;
*u32OutSize = m_lpBody->u32Offset;
if (m_lpHead->u16ResultCode == 200)
{
return I8H_ERROR_CODE_NOERROR;
}
return I8H_ERROR_CODE_COMMAND_UNSUPPORT;
}
}
S32 CHttpSession::OnPostRequest(S8* lpUrl, S8* lpHeader, S8* lpInBuffer,U32 u32InSize, S8** lpOutBuffer, U32* u32OutSize, U32 u32Time)
{
U32 u32WaitTime = 0;
U32 u32TryTimes = 0;
CURLcode crulCode = CURLE_OK;
if(lpUrl == NULL || lpHeader == NULL || lpInBuffer == NULL || lpOutBuffer == NULL || u32InSize <= 0 || u32Time <= 0 || u32OutSize == NULL)
{
return I8H_ERROR_CODE_PARAMETER_ERROR;
}
m_lpHead = new HttpHead;
m_lpBody = new HttpBody;
if(m_lpHead == NULL || m_lpBody == NULL)
{
UTILITY_FREE_POINT(m_lpHead);
UTILITY_FREE_POINT(m_lpBody);
return I8H_ERROR_CODE_ALLOC_RESOURCE_ERROR;
}
memset(m_lpHead, 0, sizeof(HttpHead));
memset(m_lpBody, 0, sizeof(HttpBody));
u32WaitTime = (u32Time >> 16) & 0xFFFF;
u32TryTimes = u32Time & 0xFFFF;
m_lpBody->u32TotalSize = 1024*1024;
m_lpCurl = curl_easy_init( );
if(m_lpCurl == NULL )
{
return I8H_ERROR_CODE_ALLOC_RESOURCE_ERROR;
}
m_lpBody->lpBuffer = new S8[m_lpBody->u32TotalSize];
if(m_lpBody->lpBuffer == NULL)
{
curl_easy_cleanup(m_lpCurl);
m_lpCurl = NULL;
UTILITY_FREE_POINT(m_lpHead);
UTILITY_FREE_POINT(m_lpBody);
return I8H_ERROR_CODE_ALLOC_RESOURCE_ERROR;
}
memset(m_lpBody->lpBuffer, 0, m_lpBody->u32TotalSize* sizeof(S8));
crulCode = curl_easy_setopt(m_lpCurl, CURLOPT_CONNECTTIMEOUT, u32WaitTime);
if(crulCode != CURLE_OK)
{
UTILITY_FREE_ARRAY(m_lpBody->lpBuffer);
UTILITY_FREE_POINT(m_lpHead);
UTILITY_FREE_POINT(m_lpBody);
if(m_lpCurl != NULL)
{
curl_easy_cleanup(m_lpCurl);
m_lpCurl = NULL;
}
return I8H_ERROR_CODE_CALL3THAPI_ERROR;
}
crulCode = curl_easy_setopt(m_lpCurl, CURLOPT_FRESH_CONNECT, TRUE);
if(crulCode != CURLE_OK)
{
UTILITY_FREE_ARRAY(m_lpBody->lpBuffer);
UTILITY_FREE_POINT(m_lpHead);
UTILITY_FREE_POINT(m_lpBody);
if(m_lpCurl != NULL)
{
curl_easy_cleanup(m_lpCurl);
m_lpCurl = NULL;
}
return I8H_ERROR_CODE_CALL3THAPI_ERROR;
}
crulCode = curl_easy_setopt(m_lpCurl, CURLOPT_URL, lpUrl);
if(crulCode != CURLE_OK)
{
UTILITY_FREE_ARRAY(m_lpBody->lpBuffer);
UTILITY_FREE_POINT(m_lpHead);
UTILITY_FREE_POINT(m_lpBody);
if(m_lpCurl != NULL)
{
curl_easy_cleanup(m_lpCurl);
m_lpCurl = NULL;
}
return I8H_ERROR_CODE_CALL3THAPI_ERROR;
}
crulCode = curl_easy_setopt( m_lpCurl, CURLOPT_HEADERFUNCTION, HeadCallBack );
if(crulCode != CURLE_OK)
{
UTILITY_FREE_ARRAY(m_lpBody->lpBuffer);
UTILITY_FREE_POINT(m_lpHead);
UTILITY_FREE_POINT(m_lpBody);
if(m_lpCurl != NULL)
{
curl_easy_cleanup(m_lpCurl);
m_lpCurl = NULL;
}
return I8H_ERROR_CODE_CALL3THAPI_ERROR;
}
crulCode = curl_easy_setopt( m_lpCurl, CURLOPT_HEADERDATA, this );
if(crulCode != CURLE_OK)
{
UTILITY_FREE_ARRAY(m_lpBody->lpBuffer);
UTILITY_FREE_POINT(m_lpHead);
UTILITY_FREE_POINT(m_lpBody);
if(m_lpCurl != NULL)
{
curl_easy_cleanup(m_lpCurl);
m_lpCurl = NULL;
}
return I8H_ERROR_CODE_CALL3THAPI_ERROR;
}
crulCode = curl_easy_setopt(m_lpCurl, CURLOPT_POST, 1L);
if(crulCode != CURLE_OK)
{
UTILITY_FREE_ARRAY(m_lpBody->lpBuffer);
UTILITY_FREE_POINT(m_lpHead);
UTILITY_FREE_POINT(m_lpBody);
if(m_lpCurl != NULL)
{
curl_easy_cleanup(m_lpCurl);
m_lpCurl = NULL;
}
return I8H_ERROR_CODE_CALL3THAPI_ERROR;
}
crulCode = curl_easy_setopt(m_lpCurl, CURLOPT_POSTFIELDS, lpInBuffer);
if(crulCode != CURLE_OK)
{
UTILITY_FREE_ARRAY(m_lpBody->lpBuffer);
UTILITY_FREE_POINT(m_lpHead);
UTILITY_FREE_POINT(m_lpBody);
if(m_lpCurl != NULL)
{
curl_easy_cleanup(m_lpCurl);
m_lpCurl = NULL;
}
return I8H_ERROR_CODE_CALL3THAPI_ERROR;
}
crulCode = curl_easy_setopt(m_lpCurl, CURLOPT_POSTFIELDSIZE, u32InSize);
if(crulCode != CURLE_OK)
{
UTILITY_FREE_ARRAY(m_lpBody->lpBuffer);
UTILITY_FREE_POINT(m_lpHead);
UTILITY_FREE_POINT(m_lpBody);
if(m_lpCurl != NULL)
{
curl_easy_cleanup(m_lpCurl);
m_lpCurl = NULL;
}
return I8H_ERROR_CODE_CALL3THAPI_ERROR;
}
crulCode = curl_easy_setopt(m_lpCurl, CURLOPT_WRITEDATA, (void*)m_lpBody);
if(crulCode != CURLE_OK)
{
UTILITY_FREE_ARRAY(m_lpBody->lpBuffer);
UTILITY_FREE_POINT(m_lpHead);
UTILITY_FREE_POINT(m_lpBody);
if(m_lpCurl != NULL)
{
curl_easy_cleanup(m_lpCurl);
m_lpCurl = NULL;
}
return I8H_ERROR_CODE_CALL3THAPI_ERROR;
}
crulCode = curl_easy_setopt(m_lpCurl, CURLOPT_WRITEFUNCTION, BodyCallBack); //回调http的响应数据
if(crulCode != CURLE_OK)
{
UTILITY_FREE_ARRAY(m_lpBody->lpBuffer);
UTILITY_FREE_POINT(m_lpHead);
UTILITY_FREE_POINT(m_lpBody);
if(m_lpCurl != NULL)
{
curl_easy_cleanup(m_lpCurl);
m_lpCurl = NULL;
}
return I8H_ERROR_CODE_CALL3THAPI_ERROR;
}
while(u32TryTimes)
{
crulCode = curl_easy_perform(m_lpCurl);
if(crulCode == CURLE_OK)
{
break;
}
else
{
u32TryTimes--;
}
}
if(crulCode != CURLE_OK)
{
UTILITY_FREE_ARRAY(m_lpBody->lpBuffer);
UTILITY_FREE_POINT(m_lpHead);
UTILITY_FREE_POINT(m_lpBody);
if(m_lpCurl != NULL)
{
curl_easy_cleanup(m_lpCurl);
m_lpCurl = NULL;
}
return I8H_ERROR_CODE_CALL3THAPI_ERROR;
}
if(m_lpBody->u8Full == 1)
{
UTILITY_FREE_ARRAY(m_lpBody->lpBuffer);
UTILITY_FREE_POINT(m_lpHead);
UTILITY_FREE_POINT(m_lpBody);
if(m_lpCurl != NULL)
{
curl_easy_cleanup(m_lpCurl);
m_lpCurl = NULL;
}
return I8H_ERROR_CODE_NOENOUGH_BUF;
}
if(m_lpCurl != NULL)
{
curl_easy_cleanup(m_lpCurl);
m_lpCurl = NULL;
}
if(m_lpHead->u16ResultCode == 404)
{
UTILITY_FREE_ARRAY(m_lpBody->lpBuffer);
UTILITY_FREE_POINT(m_lpHead);
UTILITY_FREE_POINT(m_lpBody);
return I8H_ERROR_CODE_COMMAND_UNSUPPORT;
}
else
{
*lpOutBuffer = m_lpBody->lpBuffer;
*u32OutSize = m_lpBody->u32Offset;
if (m_lpHead->u16ResultCode == 200)
{
return I8H_ERROR_CODE_NOERROR;
}
return I8H_ERROR_CODE_COMMAND_UNSUPPORT;
}
}
S32 CHttpSession::OnRequest4Https(S8* lpUrl, S8* lpHeader, S8* lpInBuffer,U32 u32InSize, S8** lpOutBuffer, U32* u32OutSize, U32 u32Time, VOID* lpUser, U32 u32Type)
{
U32 u32WaitTime = 0;
U32 u32TryTimes = 0;
S8 s8Param[128]={0};
char* lpDigest = strstr(lpUrl,"/digest/");
char* lpBasic = strstr(lpUrl,"/basic/");
CURLcode crulCode = CURLE_OK;
struct curl_slist *lpCurlList = NULL;
if(lpUrl == NULL || lpHeader == NULL || lpInBuffer == NULL || lpOutBuffer == NULL || u32InSize < 0 || u32Time <= 0 || u32OutSize == NULL )
{
return I8H_ERROR_CODE_PARAMETER_ERROR;
}
if(lpDigest != NULL && lpBasic != NULL)
{
return I8H_ERROR_CODE_PARAMETER_ERROR;
}
m_lpHead = new HttpHead;
m_lpBody = new HttpBody;
if(m_lpHead == NULL || m_lpBody == NULL)
{
UTILITY_FREE_POINT(m_lpHead);
UTILITY_FREE_POINT(m_lpBody);
return I8H_ERROR_CODE_ALLOC_RESOURCE_ERROR;
}
memset(m_lpHead, 0, sizeof(HttpHead));
memset(m_lpBody, 0, sizeof(HttpBody));
u32WaitTime = (u32Time >> 16) & 0xFFFF;
u32TryTimes = u32Time & 0xFFFF;
m_lpBody->u32TotalSize = 1024*1024;
m_lpCurl = curl_easy_init( );
if(m_lpCurl == NULL )
{
return I8H_ERROR_CODE_ALLOC_RESOURCE_ERROR;
}
m_lpBody->lpBuffer = new S8[m_lpBody->u32TotalSize];
if(m_lpBody->lpBuffer == NULL)
{
curl_easy_cleanup(m_lpCurl);
m_lpCurl = NULL;
UTILITY_FREE_POINT(m_lpHead);
UTILITY_FREE_POINT(m_lpBody);
return I8H_ERROR_CODE_ALLOC_RESOURCE_ERROR;
}
memset(m_lpBody->lpBuffer, 0, m_lpBody->u32TotalSize* sizeof(S8));
crulCode = curl_easy_setopt(m_lpCurl, CURLOPT_CONNECTTIMEOUT, u32WaitTime);
if(crulCode != CURLE_OK)
{
UTILITY_FREE_ARRAY(m_lpBody->lpBuffer);
UTILITY_FREE_POINT(m_lpHead);
UTILITY_FREE_POINT(m_lpBody);
if(m_lpCurl != NULL)
{
curl_easy_cleanup(m_lpCurl);
m_lpCurl = NULL;
}
return I8H_ERROR_CODE_CALL3THAPI_ERROR;
}
crulCode = curl_easy_setopt(m_lpCurl, CURLOPT_FRESH_CONNECT, TRUE);
if(crulCode != CURLE_OK)
{
UTILITY_FREE_ARRAY(m_lpBody->lpBuffer);
UTILITY_FREE_POINT(m_lpHead);
UTILITY_FREE_POINT(m_lpBody);
if(m_lpCurl != NULL)
{
curl_easy_cleanup(m_lpCurl);
m_lpCurl = NULL;
}
return I8H_ERROR_CODE_CALL3THAPI_ERROR;
}
crulCode = curl_easy_setopt(m_lpCurl, CURLOPT_URL, lpUrl);
if(crulCode != CURLE_OK)
{
UTILITY_FREE_ARRAY(m_lpBody->lpBuffer);
UTILITY_FREE_POINT(m_lpHead);
UTILITY_FREE_POINT(m_lpBody);
if(m_lpCurl != NULL)
{
curl_easy_cleanup(m_lpCurl);
m_lpCurl = NULL;
}
return I8H_ERROR_CODE_CALL3THAPI_ERROR;
}
crulCode = curl_easy_setopt( m_lpCurl, CURLOPT_HEADERFUNCTION, HeadCallBack );
if(crulCode != CURLE_OK)
{
UTILITY_FREE_ARRAY(m_lpBody->lpBuffer);
UTILITY_FREE_POINT(m_lpHead);
UTILITY_FREE_POINT(m_lpBody);
if(m_lpCurl != NULL)
{
curl_easy_cleanup(m_lpCurl);
m_lpCurl = NULL;
}
return I8H_ERROR_CODE_CALL3THAPI_ERROR;
}
crulCode = curl_easy_setopt( m_lpCurl, CURLOPT_HEADERDATA, this);
if(crulCode != CURLE_OK)
{
UTILITY_FREE_ARRAY(m_lpBody->lpBuffer);
UTILITY_FREE_POINT(m_lpHead);
UTILITY_FREE_POINT(m_lpBody);
if(m_lpCurl != NULL)
{
curl_easy_cleanup(m_lpCurl);
m_lpCurl = NULL;
}
return I8H_ERROR_CODE_CALL3THAPI_ERROR;
}
if(u32Type != 0)
{
crulCode = curl_easy_setopt(m_lpCurl, CURLOPT_POST, 1L);
if(crulCode != CURLE_OK)
{
UTILITY_FREE_ARRAY(m_lpBody->lpBuffer);
UTILITY_FREE_POINT(m_lpHead);
UTILITY_FREE_POINT(m_lpBody);
if(m_lpCurl != NULL)
{
curl_easy_cleanup(m_lpCurl);
m_lpCurl = NULL;
}
return I8H_ERROR_CODE_CALL3THAPI_ERROR;
}
crulCode = curl_easy_setopt(m_lpCurl, CURLOPT_POSTFIELDS, lpInBuffer);
if(crulCode != CURLE_OK)
{
UTILITY_FREE_ARRAY(m_lpBody->lpBuffer);
UTILITY_FREE_POINT(m_lpHead);
UTILITY_FREE_POINT(m_lpBody);
if(m_lpCurl != NULL)
{
curl_easy_cleanup(m_lpCurl);
m_lpCurl = NULL;
}
return I8H_ERROR_CODE_CALL3THAPI_ERROR;
}
crulCode = curl_easy_setopt(m_lpCurl, CURLOPT_POSTFIELDSIZE, u32InSize);
if(crulCode != CURLE_OK)
{
UTILITY_FREE_ARRAY(m_lpBody->lpBuffer);
UTILITY_FREE_POINT(m_lpHead);
UTILITY_FREE_POINT(m_lpBody);
if(m_lpCurl != NULL)
{
curl_easy_cleanup(m_lpCurl);
m_lpCurl = NULL;
}
return I8H_ERROR_CODE_CALL3THAPI_ERROR;
}
}
crulCode = curl_easy_setopt(m_lpCurl, CURLOPT_WRITEDATA, (void*)m_lpBody);
if(crulCode != CURLE_OK)
{
UTILITY_FREE_ARRAY(m_lpBody->lpBuffer);
UTILITY_FREE_POINT(m_lpHead);
UTILITY_FREE_POINT(m_lpBody);
if(m_lpCurl != NULL)
{
curl_easy_cleanup(m_lpCurl);
m_lpCurl = NULL;
}
return I8H_ERROR_CODE_CALL3THAPI_ERROR;
}
crulCode = curl_easy_setopt(m_lpCurl, CURLOPT_WRITEFUNCTION, BodyCallBack); //回调http的响应数据
if(crulCode != CURLE_OK)
{
UTILITY_FREE_ARRAY(m_lpBody->lpBuffer);
UTILITY_FREE_POINT(m_lpHead);
UTILITY_FREE_POINT(m_lpBody);
if(m_lpCurl != NULL)
{
curl_easy_cleanup(m_lpCurl);
m_lpCurl = NULL;
}
return I8H_ERROR_CODE_CALL3THAPI_ERROR;
}
crulCode = curl_easy_setopt(m_lpCurl, CURLOPT_CAINFO, s8KeyPathString);
if(crulCode != CURLE_OK)
{
UTILITY_FREE_ARRAY(m_lpBody->lpBuffer);
UTILITY_FREE_POINT(m_lpHead);
UTILITY_FREE_POINT(m_lpBody);
if(m_lpCurl != NULL)
{
curl_easy_cleanup(m_lpCurl);
m_lpCurl = NULL;
}
return I8H_ERROR_CODE_CALL3THAPI_ERROR;
}
crulCode = curl_easy_setopt(m_lpCurl, CURLOPT_SSL_VERIFYPEER, TRUE);
if(crulCode != CURLE_OK)
{
UTILITY_FREE_ARRAY(m_lpBody->lpBuffer);
UTILITY_FREE_POINT(m_lpHead);
UTILITY_FREE_POINT(m_lpBody);
if(m_lpCurl != NULL)
{
curl_easy_cleanup(m_lpCurl);
m_lpCurl = NULL;
}
return I8H_ERROR_CODE_CALL3THAPI_ERROR;
}
crulCode = curl_easy_setopt(m_lpCurl, CURLOPT_SSLVERSION , CURL_SSLVERSION_TLSv1_1);
if(crulCode != CURLE_OK)
{
UTILITY_FREE_ARRAY(m_lpBody->lpBuffer);
UTILITY_FREE_POINT(m_lpHead);
UTILITY_FREE_POINT(m_lpBody);
if(m_lpCurl != NULL)
{
curl_easy_cleanup(m_lpCurl);
m_lpCurl = NULL;
}
return I8H_ERROR_CODE_CALL3THAPI_ERROR;
}
crulCode = curl_easy_setopt(m_lpCurl, CURLOPT_SSL_VERIFYHOST, FALSE);
if(crulCode != CURLE_OK)
{
UTILITY_FREE_ARRAY(m_lpBody->lpBuffer);
UTILITY_FREE_POINT(m_lpHead);
UTILITY_FREE_POINT(m_lpBody);
if(m_lpCurl != NULL)
{
curl_easy_cleanup(m_lpCurl);
m_lpCurl = NULL;
}
return I8H_ERROR_CODE_CALL3THAPI_ERROR;
}
sprintf(s8Param, "%s:%s", GetUserName(), GetPassword());
crulCode = curl_easy_setopt(m_lpCurl, CURLOPT_USERPWD, s8Param);
if(crulCode != CURLE_OK)
{
UTILITY_FREE_ARRAY(m_lpBody->lpBuffer);
UTILITY_FREE_POINT(m_lpHead);
UTILITY_FREE_POINT(m_lpBody);
if(m_lpCurl != NULL)
{
curl_easy_cleanup(m_lpCurl);
m_lpCurl = NULL;
}
return I8H_ERROR_CODE_CALL3THAPI_ERROR;
}
if(lpDigest != NULL)
{
crulCode = curl_easy_setopt(m_lpCurl, CURLOPT_HTTPAUTH, (long)CURLAUTH_DIGEST);
if(crulCode != CURLE_OK)
{
UTILITY_FREE_ARRAY(m_lpBody->lpBuffer);
UTILITY_FREE_POINT(m_lpHead);
UTILITY_FREE_POINT(m_lpBody);
if(m_lpCurl != NULL)
{
curl_easy_cleanup(m_lpCurl);
m_lpCurl = NULL;
}
return I8H_ERROR_CODE_CALL3THAPI_ERROR;
}
}
if(lpBasic!= NULL)
{
crulCode = curl_easy_setopt(m_lpCurl, CURLOPT_HTTPAUTH, (long)CURLAUTH_BASIC);
if(crulCode != CURLE_OK)
{
UTILITY_FREE_ARRAY(m_lpBody->lpBuffer);
UTILITY_FREE_POINT(m_lpHead);
UTILITY_FREE_POINT(m_lpBody);
if(m_lpCurl != NULL)
{
curl_easy_cleanup(m_lpCurl);
m_lpCurl = NULL;
}
return I8H_ERROR_CODE_CALL3THAPI_ERROR;
}
}
crulCode = curl_easy_setopt(m_lpCurl, CURLOPT_USERAGENT, "curl/7.47.1");
if(crulCode != CURLE_OK)
{
UTILITY_FREE_ARRAY(m_lpBody->lpBuffer);
UTILITY_FREE_POINT(m_lpHead);
UTILITY_FREE_POINT(m_lpBody);
if(m_lpCurl != NULL)
{
curl_easy_cleanup(m_lpCurl);
m_lpCurl = NULL;
}
return I8H_ERROR_CODE_CALL3THAPI_ERROR;
}
if((strlen(GetSHash( )) != 0) && (strlen(GetCHash( )) != 0) && (strlen(GetXHash( )) != 0))
{
lpCurlList = curl_slist_append(lpCurlList, GetSHash( ));
lpCurlList = curl_slist_append(lpCurlList, GetCHash( ));
lpCurlList = curl_slist_append(lpCurlList, GetXHash( ));
curl_easy_setopt(m_lpCurl, CURLOPT_HTTPHEADER, lpCurlList);
}
while(u32TryTimes)
{
crulCode = curl_easy_perform(m_lpCurl);
if(crulCode == CURLE_OK)
{
break;
}
else
{
u32TryTimes--;
}
}
if(lpCurlList != NULL)
{
curl_slist_free_all(lpCurlList);
}
if(crulCode != CURLE_OK)
{
UTILITY_FREE_ARRAY(m_lpBody->lpBuffer);
UTILITY_FREE_POINT(m_lpHead);
UTILITY_FREE_POINT(m_lpBody);
if(m_lpCurl != NULL)
{
curl_easy_cleanup(m_lpCurl);
m_lpCurl = NULL;
}
if(crulCode == CURLE_SSL_CONNECT_ERROR)
{
return I8H_ERROR_CODE_CONNECT_SSL_ERROR;
}
return I8H_ERROR_CODE_CALL3THAPI_ERROR;
}
if(m_lpBody->u8Full == 1)
{
UTILITY_FREE_ARRAY(m_lpBody->lpBuffer);
UTILITY_FREE_POINT(m_lpHead);
UTILITY_FREE_POINT(m_lpBody);
if(m_lpCurl != NULL)
{
curl_easy_cleanup(m_lpCurl);
m_lpCurl = NULL;
}
return I8H_ERROR_CODE_NOENOUGH_BUF;
}
if(m_lpCurl != NULL)
{
curl_easy_cleanup(m_lpCurl);
m_lpCurl = NULL;
}
if(m_lpHead->u16ResultCode == 404)
{
UTILITY_FREE_ARRAY(m_lpBody->lpBuffer);
UTILITY_FREE_POINT(m_lpHead);
UTILITY_FREE_POINT(m_lpBody);
return I8H_ERROR_CODE_COMMAND_UNSUPPORT;
}
else if(m_lpHead->u16ResultCode == 403)
{
UTILITY_FREE_ARRAY(m_lpBody->lpBuffer);
UTILITY_FREE_POINT(m_lpHead);
UTILITY_FREE_POINT(m_lpBody);
return I8H_ERROR_CODE_SERVER_FORBIDDEN;
}
else
{
if(m_lpHead->u16ResultCode == 200)
{
}
*lpOutBuffer = m_lpBody->lpBuffer;
*u32OutSize = m_lpBody->u32Offset;
return I8H_ERROR_CODE_NOERROR;
}
}
S32 CHttpSession::OnHeartBeatRequest(S8* lpUrl, S8* lpHeader, S8* lpInBuffer,U32 u32InSize, S8** lpOutBuffer, U32* u32OutSize, U32 u32Time)
{
U32 u32WaitTime = 0;
CURLcode crulCode = CURLE_OK;
if(lpUrl == NULL || lpHeader == NULL || lpInBuffer == NULL || lpOutBuffer == NULL || u32InSize <= 0 || u32Time <= 0 || u32OutSize == NULL)
{
return I8H_ERROR_CODE_PARAMETER_ERROR;
}
m_lpHead = new HttpHead;
if(m_lpHead == NULL)
{
UTILITY_FREE_POINT(m_lpHead);
return I8H_ERROR_CODE_ALLOC_RESOURCE_ERROR;
}
memset(m_lpHead, 0, sizeof(HttpHead));
u32WaitTime = (u32Time >> 16) & 0xFFFF;
m_lpCurl = curl_easy_init( );
if(m_lpCurl == NULL )
{
return I8H_ERROR_CODE_ALLOC_RESOURCE_ERROR;
}
crulCode = curl_easy_setopt(m_lpCurl, CURLOPT_CONNECTTIMEOUT, u32WaitTime);
if(crulCode != CURLE_OK)
{
UTILITY_FREE_POINT(m_lpHead);
if(m_lpCurl != NULL)
{
curl_easy_cleanup(m_lpCurl);
m_lpCurl = NULL;
}
return I8H_ERROR_CODE_CALL3THAPI_ERROR;
}
crulCode = curl_easy_setopt(m_lpCurl, CURLOPT_URL, lpUrl);
if(crulCode != CURLE_OK)
{
UTILITY_FREE_POINT(m_lpHead);
if(m_lpCurl != NULL)
{
curl_easy_cleanup(m_lpCurl);
m_lpCurl = NULL;
}
return I8H_ERROR_CODE_CALL3THAPI_ERROR;
}
crulCode = curl_easy_setopt( m_lpCurl, CURLOPT_HEADERFUNCTION, HeadCallBack );
if(crulCode != CURLE_OK)
{
UTILITY_FREE_POINT(m_lpHead);
if(m_lpCurl != NULL)
{
curl_easy_cleanup(m_lpCurl);
m_lpCurl = NULL;
}
return I8H_ERROR_CODE_CALL3THAPI_ERROR;
}
crulCode = curl_easy_setopt( m_lpCurl, CURLOPT_HEADERDATA, this );
if(crulCode != CURLE_OK)
{
UTILITY_FREE_POINT(m_lpHead);
if(m_lpCurl != NULL)
{
curl_easy_cleanup(m_lpCurl);
m_lpCurl = NULL;
}
return I8H_ERROR_CODE_CALL3THAPI_ERROR;
}
crulCode = curl_easy_setopt(m_lpCurl, CURLOPT_WRITEFUNCTION, BodyCallBack); //回调http的响应数据
if(crulCode != CURLE_OK)
{
UTILITY_FREE_POINT(m_lpHead);
if(m_lpCurl != NULL)
{
curl_easy_cleanup(m_lpCurl);
m_lpCurl = NULL;
}
return I8H_ERROR_CODE_CALL3THAPI_ERROR;
}
crulCode = curl_easy_perform(m_lpCurl);
UTILITY_FREE_POINT(m_lpHead);
if(m_lpCurl != NULL)
{
curl_easy_cleanup(m_lpCurl);
m_lpCurl = NULL;
}
if(crulCode != CURLE_OK)
{
return I8H_ERROR_CODE_CALL3THAPI_ERROR;
}
else
{
return I8H_ERROR_CODE_NOERROR;
}
}
S32 CHttpSession::OnUpload4Https(S8* lpUrl, S8* lpHeader, S8* lpInBuffer,U32 u32InSize, S8** lpOutBuffer, U32* u32OutSize, U32 u32Time)
{
U32 u32WaitTime = 0;
CURLcode crulCode = CURLE_OK;
CURLFORMcode eFormRet = CURL_FORMADD_OK;
struct curl_httppost *post = NULL;
struct curl_httppost *last = NULL;
struct curl_slist *headers = NULL;
if(lpUrl == NULL || lpHeader == NULL || lpInBuffer == NULL || lpOutBuffer == NULL || u32InSize <= 0 || u32Time <= 0 || u32OutSize == NULL)
{
return I8H_ERROR_CODE_PARAMETER_ERROR;
}
u32WaitTime = (u32Time >> 16) & 0xFFFF;
m_lpCurl = curl_easy_init( );
if(m_lpCurl == NULL )
{
return I8H_ERROR_CODE_ALLOC_RESOURCE_ERROR;
}
headers = curl_slist_append(headers, "Expect:");
crulCode = curl_easy_setopt(m_lpCurl, CURLOPT_HTTPHEADER, headers);
if(crulCode != CURLE_OK)
{
if(m_lpCurl != NULL)
{
curl_easy_cleanup(m_lpCurl);
m_lpCurl = NULL;
}
if(headers != NULL)
{
curl_slist_free_all(headers);
}
return I8H_ERROR_CODE_CALL3THAPI_ERROR;
}
crulCode = curl_easy_setopt(m_lpCurl, CURLOPT_VERBOSE, 1);
crulCode = curl_easy_setopt(m_lpCurl, CURLOPT_CAINFO, s8KeyPathString);
if(crulCode != CURLE_OK)
{
if(m_lpCurl != NULL)
{
curl_easy_cleanup(m_lpCurl);
m_lpCurl = NULL;
}
if(headers != NULL)
{
curl_slist_free_all(headers);
}
return I8H_ERROR_CODE_CALL3THAPI_ERROR;
}
crulCode = curl_easy_setopt(m_lpCurl, CURLOPT_SSL_VERIFYPEER, TRUE);
if(crulCode != CURLE_OK)
{
if(m_lpCurl != NULL)
{
curl_easy_cleanup(m_lpCurl);
m_lpCurl = NULL;
}
if(headers != NULL)
{
curl_slist_free_all(headers);
}
return I8H_ERROR_CODE_CALL3THAPI_ERROR;
}
crulCode = curl_easy_setopt(m_lpCurl, CURLOPT_SSL_VERIFYHOST, FALSE);
if(crulCode != CURLE_OK)
{
if(m_lpCurl != NULL)
{
curl_easy_cleanup(m_lpCurl);
m_lpCurl = NULL;
}
if(headers != NULL)
{
curl_slist_free_all(headers);
}
return I8H_ERROR_CODE_CALL3THAPI_ERROR;
}
eFormRet = curl_formadd(&post, &last, CURLFORM_COPYNAME, "file", CURLFORM_FILE, lpInBuffer, CURLFORM_END) ;
if(eFormRet != CURL_FORMADD_OK)
{
if(m_lpCurl != NULL)
{
curl_easy_cleanup(m_lpCurl);
m_lpCurl = NULL;
}
if(headers != NULL)
{
curl_slist_free_all(headers);
}
if(post != NULL)
{
curl_formfree(post);
}
return I8H_ERROR_CODE_CALL3THAPI_ERROR;
}
crulCode = curl_easy_setopt(m_lpCurl, CURLOPT_URL, lpUrl);
if(crulCode != CURLE_OK)
{
if(m_lpCurl != NULL)
{
curl_easy_cleanup(m_lpCurl);
m_lpCurl = NULL;
}
if(headers != NULL)
{
curl_slist_free_all(headers);
}
if(post != NULL)
{
curl_formfree(post);
}
return I8H_ERROR_CODE_CALL3THAPI_ERROR;
}
crulCode = curl_easy_setopt(m_lpCurl, CURLOPT_HTTPPOST, post);
if(crulCode != CURLE_OK)
{
if(m_lpCurl != NULL)
{
curl_easy_cleanup(m_lpCurl);
m_lpCurl = NULL;
}
if(headers != NULL)
{
curl_slist_free_all(headers);
}
if(post != NULL)
{
curl_formfree(post);
}
return I8H_ERROR_CODE_CALL3THAPI_ERROR;
}
crulCode = curl_easy_setopt(m_lpCurl, CURLOPT_CONNECTTIMEOUT, u32WaitTime);
if(crulCode != CURLE_OK)
{
if(m_lpCurl != NULL)
{
curl_easy_cleanup(m_lpCurl);
m_lpCurl = NULL;
}
if(headers != NULL)
{
curl_slist_free_all(headers);
}
if(post != NULL)
{
curl_formfree(post);
}
return I8H_ERROR_CODE_CALL3THAPI_ERROR;
}
crulCode = curl_easy_perform(m_lpCurl);
if(crulCode != CURLE_OK)
{
if(m_lpCurl != NULL)
{
curl_easy_cleanup(m_lpCurl);
m_lpCurl = NULL;
}
if(headers != NULL)
{
curl_slist_free_all(headers);
}
if(post != NULL)
{
curl_formfree(post);
}
return I8H_ERROR_CODE_CALL3THAPI_ERROR;
}
*lpOutBuffer = NULL;
*u32OutSize = 0;
if(m_lpCurl != NULL)
{
curl_easy_cleanup(m_lpCurl);
m_lpCurl = NULL;
}
if(post != NULL)
{
curl_formfree(post);
}
if(headers != NULL)
{
curl_slist_free_all(headers);
}
return I8H_ERROR_CODE_NOERROR;
}
S32 CHttpSession::OnUpload(S8* lpUrl, S8* lpHeader, S8* lpInBuffer,U32 u32InSize, S8** lpOutBuffer, U32* u32OutSize, U32 u32Time)
{
U32 u32WaitTime = 0;
CURLcode crulCode = CURLE_OK;
CURLFORMcode eFormRet = CURL_FORMADD_OK;
struct curl_httppost *post = NULL;
struct curl_httppost *last = NULL;
struct curl_slist *headers = NULL;
if(lpUrl == NULL || lpHeader == NULL || lpInBuffer == NULL || lpOutBuffer == NULL || u32InSize <= 0 || u32Time <= 0 || u32OutSize == NULL)
{
return I8H_ERROR_CODE_PARAMETER_ERROR;
}
u32WaitTime = (u32Time >> 16) & 0xFFFF;
m_lpCurl = curl_easy_init( );
if(m_lpCurl == NULL )
{
return I8H_ERROR_CODE_ALLOC_RESOURCE_ERROR;
}
headers = curl_slist_append(headers, "Expect:");
headers = curl_slist_append(headers,"Cookie:s_browsertype=1;");
crulCode = curl_easy_setopt(m_lpCurl, CURLOPT_HTTPHEADER, headers);
if(crulCode != CURLE_OK)
{
if(m_lpCurl != NULL)
{
curl_easy_cleanup(m_lpCurl);
m_lpCurl = NULL;
}
if(headers != NULL)
{
curl_slist_free_all(headers);
}
return I8H_ERROR_CODE_CALL3THAPI_ERROR;
}
crulCode = curl_easy_setopt(m_lpCurl, CURLOPT_VERBOSE, 1);
eFormRet = curl_formadd(&post, &last, CURLFORM_COPYNAME, "file", CURLFORM_FILE, lpInBuffer, CURLFORM_END) ;
if(eFormRet != CURL_FORMADD_OK)
{
if(m_lpCurl != NULL)
{
curl_easy_cleanup(m_lpCurl);
m_lpCurl = NULL;
}
if(headers != NULL)
{
curl_slist_free_all(headers);
}
if(post != NULL)
{
curl_formfree(post);
}
return I8H_ERROR_CODE_CALL3THAPI_ERROR;
}
crulCode = curl_easy_setopt(m_lpCurl, CURLOPT_URL, lpUrl);
if(crulCode != CURLE_OK)
{
if(m_lpCurl != NULL)
{
curl_easy_cleanup(m_lpCurl);
m_lpCurl = NULL;
}
if(headers != NULL)
{
curl_slist_free_all(headers);
}
if(post != NULL)
{
curl_formfree(post);
}
return I8H_ERROR_CODE_CALL3THAPI_ERROR;
}
crulCode = curl_easy_setopt(m_lpCurl, CURLOPT_HTTPPOST, post);
if(crulCode != CURLE_OK)
{
if(m_lpCurl != NULL)
{
curl_easy_cleanup(m_lpCurl);
m_lpCurl = NULL;
}
if(headers != NULL)
{
curl_slist_free_all(headers);
}
if(post != NULL)
{
curl_formfree(post);
}
return I8H_ERROR_CODE_CALL3THAPI_ERROR;
}
crulCode = curl_easy_setopt(m_lpCurl, CURLOPT_CONNECTTIMEOUT, u32WaitTime);
if(crulCode != CURLE_OK)
{
if(m_lpCurl != NULL)
{
curl_easy_cleanup(m_lpCurl);
m_lpCurl = NULL;
}
if(headers != NULL)
{
curl_slist_free_all(headers);
}
if(post != NULL)
{
curl_formfree(post);
}
return I8H_ERROR_CODE_CALL3THAPI_ERROR;
}
crulCode = curl_easy_perform(m_lpCurl);
if(crulCode != CURLE_OK)
{
if(m_lpCurl != NULL)
{
curl_easy_cleanup(m_lpCurl);
m_lpCurl = NULL;
}
if(headers != NULL)
{
curl_slist_free_all(headers);
}
if(post != NULL)
{
curl_formfree(post);
}
return I8H_ERROR_CODE_CALL3THAPI_ERROR;
}
*lpOutBuffer = NULL;
*u32OutSize = 0;
if(m_lpCurl != NULL)
{
curl_easy_cleanup(m_lpCurl);
m_lpCurl = NULL;
}
if(headers != NULL)
{
curl_slist_free_all(headers);
}
if(post != NULL)
{
curl_formfree(post);
}
return I8H_ERROR_CODE_NOERROR;
}
size_t CHttpSession::HeadCallBack(void *buffer, size_t size, size_t nmemb, void *userp)
{
printf("\r\n HeadCallBack:buffer: %s\r\n", (char*)buffer);
int retCode = 0 ;
char* lpSrc = NULL;
CHttpSession* lpHttp = (CHttpSession*)userp;
int ret = sscanf((char*)buffer,"HTTP/1.%*c %3d",&retCode);
if(ret)
{
lpHttp->m_lpHead->u16ResultCode = retCode;
}
if((lpSrc = strstr((char*)buffer,"S-HASH")) != NULL)
{
CHttpSession::SafeCopyString(lpSrc, lpHttp->m_s8SHash, (S32)strlen(lpSrc) );
}
else if((lpSrc = strstr((char*)buffer,"C-HASH")) != NULL)
{
CHttpSession::SafeCopyString(lpSrc, lpHttp->m_s8CHash, (S32)strlen(lpSrc));
}
else if((lpSrc = strstr((char*)buffer,"X-HASH")) != NULL)
{
CHttpSession::SafeCopyString(lpSrc, lpHttp->m_s8XHash, (S32)strlen(lpSrc));
}
return size * nmemb;
}
size_t CHttpSession::BodyCallBack(void *ptr, size_t size, size_t nmemb, void *stream)
{
printf("\r\n BodyCallBack:buffer: %s\r\n", (char*)ptr);
size_t tSize = 0;
HttpBody* lpWebParam = (HttpBody*)stream;
if(lpWebParam->lpBuffer != NULL)
{
if(lpWebParam->u32Offset + size * nmemb > lpWebParam->u32TotalSize)
{
lpWebParam->u8Full = 1;
}
else
{
memcpy(lpWebParam->lpBuffer + lpWebParam->u32Offset, ptr, size * nmemb);
tSize = size * nmemb;
lpWebParam->u32Offset = (U32)tSize + lpWebParam->u32Offset ;
}
}
return size * nmemb;
}
}
#include "I8H_Http.h"
#include <stdlib.h>
#ifdef WIN32
#include <direct.h>
#else
#include<unistd.h>
#endif
using namespace std;
S8 s8KeyPathString[256] = {0};
S32 OnHttpReq(S8* lpUrl, S8* lpHeader, S8* lpInBuffer,U32 u32InSize, S8** lpOutBuffer, U32* u32OutSize, U32 u32Time, U32 u32Type);
int main(int argc, char* argv[])
{
CURLcode crulCode = CURLE_OK;
char *lpKeyPath = NULL;
S8* lpInBuffer = (S8*)"{\"type\":0,\"ch\":1,\"param\":{\"ip\":\"192.168.0.216\",\"username\":\"admin\",\"pwd\":\"\"},\"data\":{}}";
S8* lpOutBuffer = NULL;
S8 s8Url[256]="www.baidu.com" ;
S8 s8Header[4] = {0};
S32 s32Result = 0;
U32 u32BufferSize = strlen(lpInBuffer) + 1;
U32 u32OutSize = 0;
#ifdef WIN32
lpKeyPath=_getcwd(NULL,0);
strcpy((char*)s8KeyPathString, lpKeyPath);
strcat((char*)s8KeyPathString, "\\self.pem");
#else
lpKeyPath = getcwd(NULL,0);
strcpy((char*)s8KeyPathString, lpKeyPath);
strcat((char*)s8KeyPathString, "/self.pem");
#endif
printf("%s\r\n", s8KeyPathString);
crulCode = curl_global_init(CURL_GLOBAL_ALL);
s32Result = OnHttpReq(s8Url, s8Header, s8Header, u32BufferSize, &lpOutBuffer, &u32OutSize, (5 << 16)|1, 0);
char c = getchar( );
s32Result = OnHttpReq((S8*)"http://192.168.0.216:80//goform//frmDevicePara", s8Header, lpInBuffer, u32BufferSize, &lpOutBuffer, &u32OutSize, (5 << 16)|1, 1);
curl_global_cleanup();
return 0;
}
S32 OnHttpReq(S8* lpUrl, S8* lpHeader, S8* lpInBuffer,U32 u32InSize, S8** lpOutBuffer, U32* u32OutSize, U32 u32Time, U32 u32Type)
{
S32 s32Result = -1;
HTTPSDK::CHttpSession* lpHttp = NULL;
lpHttp = new HTTPSDK::CHttpSession;
if(u32Type == 0)
{
s32Result = lpHttp->OnGetRequest(lpUrl, lpHeader, lpInBuffer, u32InSize, lpOutBuffer, u32OutSize, u32Time);
}
else if(u32Type == 1)
{
s32Result = lpHttp->OnPostRequest(lpUrl, lpHeader, lpInBuffer, u32InSize, lpOutBuffer, u32OutSize, u32Time);
}
if (s32Result != I8H_ERROR_CODE_NOERROR)
{
printf("http request error!\r\n");
}
UTILITY_FREE_POINT(lpHttp);
return s32Result;
}
github源码: https://github.com/JannyMon/CurlDemo