#ifndef HIK_HTTPUTIL_H
#define HIK_HTTPUTIL_H

#if (defined(WIN32) || defined(WIN64))
	#ifdef HTTPUTIL_EXPORTS
		#define HTTPUTIL_API extern "C" _declspec(dllexport)
	#else
		#define HTTPUTIL_API extern "C" _declspec(dllimport)
	#endif
#else  // LINUX
	#define HTTPUTIL_API extern "C"
#endif

namespace httpUtil
{
	// 状态码定义: 
	// 0 表示成功
	// 10000~20000 表示具体的错误码. 
	// 小于10000大于0 表示HTTP状态码（如404），HTTP状态码请自行查阅HTTP状态码定义
	const int  HTTPUTIL_ERR_SUCCESS = 0;                                   // 成功
	const int  HTTPUTIL_ERR_BASE = 10000;                                  // 错误码基准
	const int  HTTPUTIL_ERR_PARAM = (HTTPUTIL_ERR_BASE + 1);               // 参数错误，如传入空指针、超时时间不对
	const int  HTTPUTIL_ERR_ALLOC_SESSION = (HTTPUTIL_ERR_BASE + 2);       // HTTP请求分配session失败
	const int  HTTPUTIL_ERR_SET_HEADER_FIELD = (HTTPUTIL_ERR_BASE + 3);    // 头域设置失败
	const int  HTTPUTIL_ERR_SEND_REQUEST = (HTTPUTIL_ERR_BASE + 4);        // HTTP请求失败
	const int  HTTPUTIL_ERR_ALLOC_MEM = (HTTPUTIL_ERR_BASE + 5);           // 分配内存错误
	const int  HTTPUTIL_ERR_GET_REDIRECT_URL = (HTTPUTIL_ERR_BASE + 6);    // 获取重定向Url失败
	const int  HTTPUTIL_ERR_OTHER = (HTTPUTIL_ERR_BASE + 10000);           // 其它错误

	// HTTP POST
	// url: url
	// body: body
	// appkey: API网关提供的APPKey
	// secret: API网关提供的APPSecret
	// timeout: 秒级超时时间（内部分别使用此超时时间设置建立连接、请求发送、等待回复超时时间）
	// dataLen: 响应数据长度，如果确定返回的内容是字符串，可以指定NULL
	// return: HTTP请求响应，如果是二进制，请结合dataLen获取数据。失败返回NULL，可使用HTTPUTIL_GetLastStatus获取状态码。成功需使用HTTPUTIL_Free释放内存
	HTTPUTIL_API char* HTTPUTIL_Post(const char* url, const char* body, const char* appkey, const char* secret, int timeout, int* dataLen);

	// HTTP GET
	// url: url
	// appkey: API网关提供的APPKey
	// secret: API网关提供的APPSecret
	// timeout: 秒级超时时间（内部分别使用此超时时间设置建立连接、请求发送、等待回复超时时间）
	// dataLen: 响应数据长度，如果确定返回的内容是字符串，可以指定NULL
	// return: HTTP请求响应，如果是二进制，请结合dataLen获取数据。失败返回NULL，可使用HTTPUTIL_GetLastStatus获取状态码。成功需使用HTTPUTIL_Free释放内存
	HTTPUTIL_API char* HTTPUTIL_Get(const char* url, const char* appkey, const char* secret, int timeout, int* dataLen);

	// 释放内存
	// buffer: pHTTPUTIL_Get和HTTPUTIL_Post返回的非空指针
	HTTPUTIL_API void HTTPUTIL_Free(char* buffer);

	// 获取状态码，必须在调HTTPUTIL_Post或HTTPUTIL_Get所在线程中调此接口
	// return: 状态码, 详见HTTPUTIL_ERR_*或自行查阅HTTP状态码
	HTTPUTIL_API int HTTPUTIL_GetLastStatus();
}
#endif