#include "httpConn.h"
#include "curl.h"
static unsigned int RetriveContentCallback(void *contents, unsigned int size, unsigned int nmemb, void *userp)
unsigned int realsize = size * nmemb;
struct MemoryStruct *mem = (struct MemoryStruct *)userp;
char *ptr = (char*)realloc((void *)mem->memory, mem->size + realsize + 1);
if (ptr == NULL) {
printf("not enough memory (realloc returned NULL)\n");
return -6;
mem->memory = ptr;
memcpy(&(mem->memory[mem->size]), contents, realsize);
mem->size += realsize;
mem->memory[mem->size] = 0;
return realsize;
static unsigned int RetriveHeaderCallback(void *contents, unsigned int size, unsigned int nmemb, void *userp)
unsigned int realsize = size * nmemb;
struct MemoryStruct *mem = (struct MemoryStruct *)userp;
char *ptr = (char*)realloc((void *)mem->memory, mem->size + realsize + 1);
if (ptr == NULL) {
printf("not enough memory (realloc returned NULL)\n");
return -6;
mem->memory = ptr;
memcpy(&(mem->memory[mem->size]), contents, realsize);
mem->size += realsize;
mem->memory[mem->size] = 0;
return realsize;
HttpRequest::HttpRequest()
curl_res = CURLE_OK;
http_code = 0;
curl_handle = NULL;
http_headers = NULL;
retry_times = RETRY_TIMES;
receive_content.memory = (char*)malloc(1);
receive_header.memory = (char*)malloc(1);
error_message.memory = (char*)malloc(1);
receive_content.size = 0;
receive_header.size = 0
;
curl_global_init(CURL_GLOBAL_ALL);
curl_handle = curl_easy_init();
HttpRequest::~HttpRequest()
if (curl_handle)
curl_easy_cleanup(curl_handle);
free(receive_content.memory);
free(receive_header.memory);
free(error_message.memory);
if (http_headers)
curl_slist_free_all(http_headers);
curl_global_cleanup();
int HttpRequest::setRequestUrl(const char *url)
if (0 == memcmp(url, "https", 5))
curl_res = curl_easy_setopt(curl_handle, CURLOPT_SSL_VERIFYPEER, 0L);
if (CURLE_OK != curl_res)
printf("curl_easy_setopt CURLOPT_SSL_VERIFYPEER failed. curl_res = %d, curl_strerror = %s\n", curl_res, curl_easy_strerror(curl_res));
return -1;
curl_res = curl_easy_setopt(curl_handle, CURLOPT_SSL_VERIFYHOST, 0L);
if (CURLE_OK != curl_res)
printf("curl_easy_setopt CURLOPT_SSL_VERIFYHOST failed. curl_res = %d, curl_strerror = %s\n", curl_res, curl_easy_strerror(curl_res));
return -1;
#ifdef USE_PROXY
curl_res = curl_easy_setopt(curl_handle, CURLOPT_PROXY, PROXY_ADDRESS);
if (CURLE_OK != curl_res)
printf("curl_easy_setopt CURLOPT_PROXY failed. curl_res = %d, curl_strerror = %s\n", curl_res, curl_easy_strerror(curl_res));
return -1;
#endif
curl_res = curl_easy_setopt(curl_handle, CURLOPT_URL, url);
if (CURLE_OK != curl_res)
printf("curl_easy_setopt CURLOPT_URL failed. curl_res = %d, curl_strerror = %s\n", curl_res, curl_easy_strerror(curl_res));
return -1;
return 0;
int HttpRequest::setRequestHeader(const char * header)
http_headers = curl_slist_append(http_headers, header);
curl_res = http_headers ? CURLE_OK : CURLE_FAILED_INIT;
if (CURLE_OK != curl_res)
printf("Set request header: curl_slist_append failed.");
return -2;
return 0;
int HttpRequest::setRequestTimeout(long time)
curl_res = curl_easy_setopt(curl_handle, CURLOPT_TIMEOUT, time);
if (CURLE_OK != curl_res)
printf("curl_easy_setopt CURLOPT_TIMEOUT failed. curl_res = %d, curl_strerror = %s\n", curl_res, curl_easy_strerror(curl_res));
return -1;
return 0;
int HttpRequest::setPostData(const char *data, unsigned int size)
curl_res = curl_easy_setopt(curl_handle, CURLOPT_POST, 1);
if (CURLE_OK != curl_res)
printf("curl_easy_setopt CURLOPT_POST failed. curl_res = %d, curl_strerror = %s\n", curl_res, curl_easy_strerror(curl_res));
return -1;
curl_res = curl_easy_setopt(curl_handle, CURLOPT_POSTFIELDS, data);
if (CURLE_OK != curl_res)
printf("curl_easy_setopt CURLOPT_POSTFIELDS failed. curl_res = %d, curl_strerror = %s\n", curl_res, curl_easy_strerror(curl_res));
return -1;
curl_res = curl_easy_setopt(curl_handle, CURLOPT_POSTFIELDSIZE, size);
if (CURLE_OK != curl_res)
printf("curl_easy_setopt CURLOPT_POSTFIELDSIZE failed. curl_res = %d, curl_strerror = %s\n", curl_res, curl_easy_strerror(curl_res));
return -1;
return 0;
int HttpRequest::setResultCallback()
curl_res = curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, RetriveContentCallback);
if (CURLE_OK != curl_res)
printf("curl_easy_setopt CURLOPT_WRITEFUNCTION failed. curl_res = %d, curl_strerror = %s\n", curl_res, curl_easy_strerror(curl_res));
return -1;
curl_res = curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, (void *)&receive_content);
if (CURLE_OK != curl_res)
printf("curl_easy_setopt CURLOPT_WRITEDATA failed. curl_res = %d, curl_strerror = %s\n", curl_res, curl_easy_strerror(curl_res));
return -1;