123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446 |
- /*
- * curlApi.c
- *
- * Created on: 2021/6/1
- * Author: foluswen
- */
- #include <sys/time.h>
- #include <sys/timeb.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <sys/types.h>
- #include <sys/ioctl.h>
- #include <sys/socket.h>
- #include <sys/ipc.h>
- #include <sys/shm.h>
- #include <sys/shm.h>
- #include <sys/mman.h>
- #include <linux/wireless.h>
- #include <arpa/inet.h>
- #include <netinet/in.h>
- #include <unistd.h>
- #include <stdarg.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <fcntl.h>
- #include <termios.h>
- #include <errno.h>
- #include <errno.h>
- #include <string.h>
- #include <time.h>
- #include <ctype.h>
- #include <ifaddrs.h>
- #include <signal.h>
- #include <curl/curl.h>
- #include <curl/easy.h>
- #include "SystemLogMessage.h"
- #include "curlApi.h"
- struct MemoryStruct
- {
- uint8_t memory[4096];
- size_t size;
- uint16_t index;
- };
- struct MemoryStruct chunk;
- /**
- * HTTP get/post data response callback
- * @param contents
- * @param size
- * @param nmemb
- * @param userp
- */
- static size_t WriteMemoryCallback(void *contents, size_t size, size_t nmemb, void *userp)
- {
- size_t realsize = size*nmemb;
- struct MemoryStruct *mem = (struct MemoryStruct *)userp;
- mem->size += realsize;;
- memcpy(mem->memory + mem->index, contents, realsize);
- mem->index += realsize;
- return realsize;
- }
- /**
- * HTTP get request/response
- * @param url
- * @param responseData
- * @return
- */
- int httpGet(uint8_t *url, uint8_t *responseData)
- {
- int result = FAIL;
- CURL *curl;
- CURLcode res;
- curl_global_init(CURL_GLOBAL_ALL);
- curl = curl_easy_init();
- memset(&chunk, 0x00, sizeof(struct MemoryStruct));
- if(curl)
- {
- curl_easy_setopt(curl, CURLOPT_URL, (char*)url);
- curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);
- curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk);
- //curl_easy_setopt(curl, CURLOPT_USERAGENT, "libcurl-agent/1.0");
- //curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, (long)strlen((char*)postData));
- curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, FALSE);
- //curl_easy_setopt(curl, CURLOPT_HTTPAUTH, (long)CURLAUTH_ANY);
- //curl_easy_setopt(curl, CURLOPT_USERPWD, "user:password");
- curl_easy_setopt(curl, CURLOPT_TIMEOUT_MS, 2500L);
- struct curl_slist *headers = NULL;
- headers = curl_slist_append(headers, "Accept: application/json");
- headers = curl_slist_append(headers, "Content-Type: application/json");
- headers = curl_slist_append(headers, "charset: utf-8");
- curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "GET");
- headers = curl_slist_append(headers, "length: 20");
- headers = curl_slist_append(headers, "numbers: true");
- curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
- res = curl_easy_perform(curl);
- long http_code = 0;
- curl_easy_getinfo (curl, CURLINFO_RESPONSE_CODE, &http_code);
- if(res != CURLE_OK || http_code != 200)
- {
- DEBUG_ERROR("curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
- }
- else
- {
- if(chunk.size > 0)
- {
- //DEBUG_INFO("Response content: %s\n", chunk.memory);
- memcpy(responseData, chunk.memory, ARRAY_SIZE(chunk.memory));
- }
- result = PASS;
- }
- curl_easy_cleanup(curl);
- }
- curl_global_cleanup();
- return result;
- }
- /**
- * HTTP post request/response
- * @param url
- * @param postData
- * @return
- */
- int httpPost(uint8_t *url, uint8_t *postData, uint8_t *responseData)
- {
- int result = FAIL;
- CURL *curl;
- CURLcode res;
- curl_global_init(CURL_GLOBAL_ALL);
- curl = curl_easy_init();
-
- printf("post url : %s\n", url);
- printf("post data : %s\n", postData);
-
- memset(&chunk, 0x00, sizeof(struct MemoryStruct));
- if(curl)
- {
- curl_easy_setopt(curl, CURLOPT_URL, (char*)url);
- curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);
- curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk);
- //curl_easy_setopt(curl, CURLOPT_USERAGENT, "libcurl-agent/1.0");
- curl_easy_setopt(curl, CURLOPT_POSTFIELDS, (char*)postData);
- //curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, (long)strlen((char*)postData));
- curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, FALSE);
- //curl_easy_setopt(curl, CURLOPT_HTTPAUTH, (long)CURLAUTH_ANY);
- //curl_easy_setopt(curl, CURLOPT_USERPWD, "user:password");
- curl_easy_setopt(curl, CURLOPT_TIMEOUT_MS, 2500L);
- res = curl_easy_perform(curl);
- if(res != CURLE_OK)
- {
- DEBUG_ERROR("curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
- }
- else
- {
- if(chunk.size > 0)
- {
- //DEBUG_INFO("Response content: %s\n", chunk.memory);
- memcpy(responseData, chunk.memory, ARRAY_SIZE(chunk.memory));
- }
- result = PASS;
- }
- curl_easy_cleanup(curl);
- }
- curl_global_cleanup();
- return result;
- }
- /**
- * HTTP put request
- * @param url
- * @param postData
- * @return
- */
- int httpPut(uint8_t *url, uint8_t *postData, uint8_t *responseData)
- {
- int result = FAIL;
- CURL *curl;
- CURLcode res;
- curl_global_init(CURL_GLOBAL_ALL);
- curl = curl_easy_init();
-
- memset(&chunk, 0x00, sizeof(struct MemoryStruct));
- if(curl)
- { struct curl_slist* headerlist = NULL;
- struct curl_httppost* formpost = NULL;
- struct curl_httppost* lastptr = NULL;
- curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "PUT");
- // 设置表头,表头内容可能不同
- //headerlist = curl_slist_append(headerlist, "Content-Type:application/x-www-form-urlencoded");
- headerlist = curl_slist_append(headerlist, "Content-Type:application/json");
- curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerlist);
- // 设置URL
- curl_easy_setopt(curl, CURLOPT_URL, "http://postit.example.com/moo.cgi");
- curl_easy_setopt(curl, CURLOPT_URL, (char*)url);
- curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);
- curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk);
- //curl_easy_setopt(curl, CURLOPT_USERAGENT, "libcurl-agent/1.0");
- curl_easy_setopt(curl, CURLOPT_POSTFIELDS, (char*)postData);
- //curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, (long)strlen((char*)postData));
- curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0);
- curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0);
- //curl_easy_setopt(curl, CURLOPT_HTTPAUTH, (long)CURLAUTH_ANY);
- //curl_easy_setopt(curl, CURLOPT_USERPWD, "user:password");
- // curl_easy_setopt(curl, CURLOPT_TIMEOUT_MS, 2500L);
- curl_easy_setopt(curl, CURLOPT_TIMEOUT, 20L);
- res = curl_easy_perform(curl);
- if(res != CURLE_OK)
- {
- DEBUG_ERROR("curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
- }
- else
- {
- if(chunk.size > 0)
- {
- //DEBUG_INFO("Response content: %s\n", chunk.memory);
- memcpy(responseData, chunk.memory, ARRAY_SIZE(chunk.memory));
- }
- result = PASS;
- }
- curl_easy_cleanup(curl);
- }
- curl_global_cleanup();
- return result;
- }
- /**
- * HTTP download response callback
- * @param ptr
- * @param size
- * @param nmemb
- * @param stream
- * @return
- */
- static size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream)
- {
- size_t written = fwrite(ptr, size, nmemb, (FILE *)stream);
- return written;
- }
- /**
- * Curl download request
- * @param url
- * @return
- */
- int curlDownload(uint8_t *url, uint8_t *filename)
- {
- int result = FAIL;
- CURL *curl;
- CURLcode res;
- FILE *downloadFile;
- curl_global_init(CURL_GLOBAL_ALL);
- curl = curl_easy_init();
- if(curl)
- {
- curl_easy_setopt(curl, CURLOPT_TIMEOUT_MS, 30000L);
- curl_easy_setopt(curl, CURLOPT_URL, (char*)url);
- curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
- curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, FALSE);
- //curl_easy_setopt(curl, CURLOPT_HTTPAUTH, (long)CURLAUTH_ANY);
- //curl_easy_setopt(curl, CURLOPT_USERPWD, "user:password");
- downloadFile = fopen((char*)filename, "wb");
- if(downloadFile)
- {
- curl_easy_setopt(curl, CURLOPT_WRITEDATA, downloadFile);
- res = curl_easy_perform(curl);
- if(res != CURLE_OK)
- {
- DEBUG_ERROR("curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
- }
- else
- {
- //DEBUG_INFO("Download %s success.\n", url);
- result = PASS;
- }
- fclose(downloadFile);
- }
- curl_easy_cleanup(curl);
- }
- curl_global_cleanup();
- return result;
- }
- /**
- * HTTP upload request
- * @param url
- * @param filename
- * @return
- */
- int httpUpload(uint8_t *url, uint8_t *filename)
- {
- int result = FAIL;
- CURL *curl;
- CURLcode res;
- FILE *upFile;
- struct stat file_info;
- curl_off_t speed_upload, total_time;
- if((upFile = fopen((char*)filename, "rb")))
- {
- if(fstat(fileno(upFile), &file_info) == 0)
- {
- curl = curl_easy_init();
- if(curl)
- {
- curl_easy_setopt(curl, CURLOPT_TIMEOUT_MS, 30000L);
- curl_easy_setopt(curl, CURLOPT_URL, (char*)url);
- curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);
- curl_easy_setopt(curl, CURLOPT_READDATA, upFile);
- curl_easy_setopt(curl, CURLOPT_INFILESIZE_LARGE, (curl_off_t)file_info.st_size);
- curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
- //curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, FALSE);
- //curl_easy_setopt(curl, CURLOPT_HTTPAUTH, (long)CURLAUTH_ANY);
- //curl_easy_setopt(curl, CURLOPT_USERPWD, "user:password");
- res = curl_easy_perform(curl);
- if(res != CURLE_OK)
- {
- DEBUG_ERROR("curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
- }
- else
- {
- curl_easy_getinfo(curl, CURLINFO_SPEED_UPLOAD, &speed_upload);
- curl_easy_getinfo(curl, CURLINFO_TOTAL_TIME, &total_time);
- /*DEBUG_INFO("Upload %s to %s success.\n", filename, url);
- DEBUG_INFO("Speed: %" CURL_FORMAT_CURL_OFF_T " bytes/sec during %"
- CURL_FORMAT_CURL_OFF_T ".%06ld seconds\n",
- speed_upload,
- (total_time / 1000000), (long)(total_time % 1000000));*/
- result = PASS;
- }
- fclose(upFile);
- curl_easy_cleanup(curl);
- }
- }
- }
- return result;
- }
- /**
- * File read callback
- * @param ptr
- * @param size
- * @param nmemb
- * @param stream
- * @return
- */
- static size_t read_callback(char *ptr, size_t size, size_t nmemb, void *stream)
- {
- curl_off_t nread;
- size_t retcode = fread(ptr, size, nmemb, stream);
- nread = (curl_off_t)retcode;
- DEBUG_INFO("Read %" CURL_FORMAT_CURL_OFF_T " bytes from file\n", nread);
- return retcode;
- }
- /**
- * FTP upload request
- * @param url
- * @param filename
- * @return
- */
- int ftpUpload(uint8_t *url, uint8_t *filename)
- {
- int result = FAIL;
- CURL *curl;
- CURLcode res;
- FILE *upFile;
- struct stat file_info;
- curl_off_t fsize;
- curl_global_init(CURL_GLOBAL_ALL);
- if(!stat((char*)filename, &file_info))
- {
- fsize = (curl_off_t)file_info.st_size;
- DEBUG_INFO("%s size: %" CURL_FORMAT_CURL_OFF_T " bytes.\n", filename, fsize);
- if((upFile = fopen((char*)filename, "rb")))
- {
- curl = curl_easy_init();
- if(curl)
- {
- curl_easy_setopt(curl, CURLOPT_TIMEOUT_MS, 30000L);
- curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_callback);
- curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);
- curl_easy_setopt(curl, CURLOPT_URL, url);
- curl_easy_setopt(curl, CURLOPT_READDATA, upFile);
- curl_easy_setopt(curl, CURLOPT_INFILESIZE_LARGE, (curl_off_t)fsize);
- res = curl_easy_perform(curl);
- if(res != CURLE_OK)
- {
- DEBUG_ERROR("curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
- }
- else
- {
- //DEBUG_INFO("Upload %s success.\n", url);
- }
- curl_easy_cleanup(curl);
- }
- fclose(upFile);
- }
- }
- curl_global_cleanup();
- return result;
- }
|