cpp-tizen-client.netclient-body.mustache Maven / Gradle / Ivy
#include "NetClient.h"
using namespace std;
NetClient::NetClient() {
}
/*
void
NetClient::success(void (*success) (HttpResponse*, void (*cb)(void*, Error*)), void (*cb)(void*, Error*)) {
this->successFunction = success;
this->cb = cb;
}
*/
NetClient::~NetClient() {
}
size_t WriteMemoryCallback(void *contents, size_t size, size_t nmemb, void *userp) {
size_t realsize = size * nmemb;
MemoryStruct_s *mem = (struct MemoryStruct_s *) userp;
mem->memory = (char *) realloc(mem->memory, mem->size + realsize + 1);
if (mem->memory == NULL) {
/* out of memory! */
//NET_LOGE("not enough memory (realloc returned NULL)\n");
printf("not enough memory (realloc returned NULL)\n");
return 0;
}
memcpy(&(mem->memory[mem->size]), contents, realsize);
mem->size += realsize;
mem->memory[mem->size] = 0;
return realsize;
}
static void curl_error_print(CURLcode res, const char *errbuf, int line) {
//NET_LOGD("start curl_error_print line:%d ", line);
if (res != CURLE_OK) {
//NET_LOGD("curl err=%d at line:%d ", res, line);
printf("curl err=%d at line:%d ", res, line);
size_t len = strlen(errbuf);
if (len)
//NET_LOGD("%s\n", errbuf);
printf("%s\n", errbuf);
}
}
class GlobalInit {
public:
GlobalInit()
{
CURLcode curl_res = curl_global_init(CURL_GLOBAL_ALL);
char errbuf[CURL_ERROR_SIZE] = {0,};
curl_error_print(curl_res, errbuf, __LINE__);
if (curl_res != CURLE_OK) {
printf("cannot global initialize curl");
}
}
~GlobalInit()
{
curl_global_cleanup();
}
};
static GlobalInit globalinit;
int NetClient::easycurl(string host, string path, string method, std::map queryParams,
string mBody, struct curl_slist* headerList, MemoryStruct_s *p_chunk, long *code, char * errormsg) {
char *url = NULL;
char *body = (char *) malloc(mBody.size() + 1);
memcpy(body, mBody.c_str(), mBody.size() + 1);
string uri = string(host);
uri.append(path);
NetHttpMethod httpMethod;
if (method.compare("GET") == 0)
httpMethod = NET_HTTP_GET;
else if (method.compare("PUT") == 0)
httpMethod = NET_HTTP_PUT;
else if (method.compare("POST") == 0)
httpMethod = NET_HTTP_POST;
else
httpMethod = NET_HTTP_DELETE;
CURL *curl_handle;
CURLcode curl_res;
errormsg = (char*) malloc(CURL_ERROR_SIZE);
char errbuf[CURL_ERROR_SIZE] = {0,};
MemoryStruct_s chunk;
int ret_val = {{prefix}}_ERROR_NONE;
// FILE *file;
printf("start NET_Utils::easycurl");
//NET_LOGD("start NET_Utils::easycurl");
/* if (put_method) {
file = fopen("tmp/sami_temp", "wb");
if (file == NULL) {
NET_LOGE("fopen() failed, file is NULL");
}
}
*/
//get_proxy_address();
chunk.memory = NULL;
/* init the curl session */
curl_handle = curl_easy_init();
if (curl_handle == NULL) {
printf("Unable to initialize cURL interface");
//NET_LOGE("Unable to initialize cURL interface");
ret_val = {{prefix}}_ERROR_UNKNOWN;
goto RETURN;
}
curl_res = curl_easy_setopt(curl_handle, CURLOPT_SSL_VERIFYPEER, 0L);
curl_error_print(curl_res, errbuf, __LINE__);
if (curl_res != CURLE_OK) {
ret_val = {{prefix}}_ERROR_UNKNOWN;
goto CURL_EASY_CLEANUP;
}
if (queryParams.size() > 0) {
string queryParam = "";
for (std::map::iterator queryIter = queryParams.begin(); queryIter != queryParams.end(); ++queryIter) {
if (queryIter == queryParams.begin())
queryParam.append("?");
else
queryParam.append("&");
string pKey = static_cast (queryIter->first);
string pValue = static_cast (queryIter->second);
char *encoded = curl_easy_escape(curl_handle, pKey.c_str(), 0);
queryParam.append(encoded);
curl_free(encoded);
queryParam.append("=");
encoded = curl_easy_escape(curl_handle, pValue.c_str(), 0);
queryParam.append(encoded);
curl_free(encoded);
}
uri.append(queryParam);
}
//AppLog("%ls", uri.c_str());
printf("%s", uri.c_str());
curl_res = curl_easy_setopt(curl_handle, CURLOPT_ERRORBUFFER, errbuf);
curl_error_print(curl_res, errbuf, __LINE__);
if (curl_res != CURLE_OK) {
ret_val = {{prefix}}_ERROR_UNKNOWN;
goto CURL_EASY_CLEANUP;
}
/* no progcurl_ress meter please */
//curl_easy_setopt(curl_handle, CURLOPT_FOLLOWLOCATION, 1L);
/* send all data to this function */
curl_res = curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);
curl_error_print(curl_res, errbuf, __LINE__);
if (curl_res != CURLE_OK) {
ret_val = {{prefix}}_ERROR_UNKNOWN;
goto CURL_EASY_CLEANUP;
}
switch (httpMethod) {
case NET_HTTP_GET:
curl_res = curl_easy_setopt(curl_handle, CURLOPT_HTTPGET, true);
curl_error_print(curl_res, errbuf, __LINE__);
if (curl_res != CURLE_OK) {
ret_val = {{prefix}}_ERROR_UNKNOWN;
goto CURL_EASY_CLEANUP;
}
break;
case NET_HTTP_POST:
curl_res = curl_easy_setopt(curl_handle, CURLOPT_POST, true);
curl_error_print(curl_res, errbuf, __LINE__);
if (curl_res != CURLE_OK) {
ret_val = {{prefix}}_ERROR_UNKNOWN;
goto CURL_EASY_CLEANUP;
}
curl_res = curl_easy_setopt(curl_handle, CURLOPT_POSTFIELDS, body);
curl_error_print(curl_res, errbuf, __LINE__);
if (curl_res != CURLE_OK) {
ret_val = {{prefix}}_ERROR_UNKNOWN;
goto CURL_EASY_CLEANUP;
}
break;
case NET_HTTP_DELETE:
curl_res = curl_easy_setopt(curl_handle, CURLOPT_CUSTOMREQUEST, "DELETE");
curl_error_print(curl_res, errbuf, __LINE__);
if (curl_res != CURLE_OK) {
ret_val = {{prefix}}_ERROR_UNKNOWN;
goto CURL_EASY_CLEANUP;
}
curl_res = curl_easy_setopt(curl_handle, CURLOPT_POSTFIELDS, body);
curl_error_print(curl_res, errbuf, __LINE__);
if (curl_res != CURLE_OK) {
ret_val = {{prefix}}_ERROR_UNKNOWN;
goto CURL_EASY_CLEANUP;
}
break;
case NET_HTTP_PUT:
//curl_res = curl_easy_setopt(curl_handle, CURLOPT_PUT, 1);
//curl_res = curl_easy_setopt(curl_handle, CURLOPT_UPLOAD, 1);
curl_res = curl_easy_setopt(curl_handle, CURLOPT_CUSTOMREQUEST, "PUT");
curl_error_print(curl_res, errbuf, __LINE__);
if (curl_res != CURLE_OK) {
ret_val = {{prefix}}_ERROR_UNKNOWN;
goto CURL_EASY_CLEANUP;
}
curl_res = curl_easy_setopt(curl_handle, CURLOPT_POSTFIELDS, body);
curl_error_print(curl_res, errbuf, __LINE__);
if (curl_res != CURLE_OK) {
ret_val = {{prefix}}_ERROR_UNKNOWN;
goto CURL_EASY_CLEANUP;
}
break;
default:
break;
}
/* set URL to get */
url = (char *) malloc(uri.size() + 1);
memcpy(url, uri.c_str(), uri.size() + 1);
printf("\n%s\n", url);
curl_res = curl_easy_setopt(curl_handle, CURLOPT_URL, url);
curl_error_print(curl_res, errbuf, __LINE__);
if (curl_res != CURLE_OK) {
ret_val = {{prefix}}_ERROR_UNKNOWN;
goto CURL_EASY_CLEANUP;
}
//curl_easy_setopt(curl_handle, CURLOPT_HEADER, 1);
// curl_res = curl_easy_setopt(curl_handle, CURLOPT_HEADER, true);
// curl_error_print(curl_res, errbuf, __LINE__);
curl_res = curl_easy_setopt(curl_handle, CURLOPT_HTTPHEADER, headerList);
curl_error_print(curl_res, errbuf, __LINE__);
if (curl_res != CURLE_OK) {
ret_val = {{prefix}}_ERROR_UNKNOWN;
goto CURL_EASY_CLEANUP;
}
/*
if(body != NULL) {
if (put_method == false) {
curl_res = curl_easy_setopt(curl_handle, CURLOPT_POSTFIELDS, body);
curl_error_print(curl_res, errbuf, 184);
}
else {
curl_res = curl_easy_setopt(curl_handle, CURLOPT_PUT, 1);
curl_error_print(curl_res, errbuf, 188);
//curl_easy_setopt(curl_handle, CURLOPT_BINARYTRANSFER, 1);
if (fwrite(body, sizeof(char), strlen(body), file) != strlen(body)) {
NET_LOGE("fwrite() failed");
}
curl_res = curl_easy_setopt(curl_handle, CURLOPT_INFILE, file);
curl_error_print(curl_res, errbuf, 195);
curl_res = curl_easy_setopt(curl_handle, CURLOPT_INFILESIZE, strlen(body));
curl_error_print(curl_res, errbuf, 197);
if (g_unlink("tmp/sami_temp") == -1) {
NET_LOGE("file was not deleted");
}
}
}
*/
chunk.memory = (char *) malloc(1); /* will be grown as needed by the realloc above */
chunk.size = 0; /* no data at this point */
/* we want the headers to this file handle */
curl_res = curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, (void *) &chunk);
curl_error_print(curl_res, errbuf, __LINE__);
if (curl_res != CURLE_OK) {
ret_val = {{prefix}}_ERROR_UNKNOWN;
goto FREE_CHUNK;
}
/* some servers don't like requests that are made without a user-agent
field, so we provide one */
curl_res = curl_easy_setopt(curl_handle, CURLOPT_USERAGENT, "libcurl-agent/1.0");
curl_error_print(curl_res, errbuf, __LINE__);
if (curl_res != CURLE_OK) {
ret_val = {{prefix}}_ERROR_UNKNOWN;
goto FREE_CHUNK;
}
/* set timeout */
curl_res = curl_easy_setopt(curl_handle, CURLOPT_TIMEOUT, 30L);
curl_error_print(curl_res, errbuf, __LINE__);
if (curl_res != CURLE_OK) {
ret_val = {{prefix}}_ERROR_UNKNOWN;
goto FREE_CHUNK;
}
//curl_res = curl_easy_setopt(curl_handle, CURLOPT_PROXY, "http://10.112.1.184:8080/");
curl_res = curl_easy_perform(curl_handle);
curl_error_print(curl_res, errbuf, __LINE__);
if (curl_res == CURLE_COULDNT_RESOLVE_HOST) {
ret_val = {{prefix}}_ERROR_UNREACHED_TO_SERVER;
goto FREE_CHUNK;
} else if (curl_res != CURLE_OK) {
ret_val = {{prefix}}_ERROR_UNKNOWN;
goto FREE_CHUNK;
}
curl_easy_getinfo(curl_handle, CURLINFO_RESPONSE_CODE, code);
p_chunk->memory = chunk.memory;
p_chunk->size = chunk.size;
/*
if (put_method) {
fclose(file);
if (g_unlink("tmp/sami_temp") == -1) {
NET_LOGE("file was not deleted");
}
}
*/
FREE_CHUNK:
if (curl_res != CURLE_OK) {
if (chunk.memory) {
free(chunk.memory);
chunk.memory = NULL;
}
size_t len = strlen(errbuf);
fprintf(stderr, "\nlibcurl: (%d) ", curl_res);
if (len) {
sprintf(errormsg, "%s%s", errbuf, ((errbuf[len - 1] != '\n') ? "\n" : ""));
} else {
sprintf(errormsg, "%s\n", curl_easy_strerror(curl_res));
}
}
CURL_EASY_CLEANUP:
/* cleanup curl stuff */
curl_easy_cleanup(curl_handle);
RETURN:
printf("end NET_Utils::easycurl");
free(url);
free(body);
//NET_LOGD("end NET_Utils::easycurl");
return ret_val;
}
© 2015 - 2024 Weber Informatics LLC | Privacy Policy