curlApi.c 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408
  1. /*
  2. * curlApi.c
  3. *
  4. * Created on: 2021/6/1
  5. * Author: foluswen
  6. */
  7. #include <sys/time.h>
  8. #include <sys/timeb.h>
  9. #include <sys/types.h>
  10. #include <sys/stat.h>
  11. #include <sys/types.h>
  12. #include <sys/ioctl.h>
  13. #include <sys/socket.h>
  14. #include <sys/ipc.h>
  15. #include <sys/shm.h>
  16. #include <sys/shm.h>
  17. #include <sys/mman.h>
  18. #include <linux/wireless.h>
  19. #include <arpa/inet.h>
  20. #include <netinet/in.h>
  21. #include <unistd.h>
  22. #include <stdarg.h>
  23. #include <stdio.h>
  24. #include <stdlib.h>
  25. #include <unistd.h>
  26. #include <fcntl.h>
  27. #include <termios.h>
  28. #include <errno.h>
  29. #include <errno.h>
  30. #include <string.h>
  31. #include <time.h>
  32. #include <ctype.h>
  33. #include <ifaddrs.h>
  34. #include <signal.h>
  35. #include <curl/curl.h>
  36. #include <curl/easy.h>
  37. #include "SystemLogMessage.h"
  38. #include "curlApi.h"
  39. struct MemoryStruct
  40. {
  41. uint8_t memory[4096];
  42. size_t size;
  43. };
  44. struct MemoryStruct chunk;
  45. /**
  46. * HTTP get/post data response callback
  47. * @param contents
  48. * @param size
  49. * @param nmemb
  50. * @param userp
  51. */
  52. static size_t WriteMemoryCallback(void *contents, size_t size, size_t nmemb, void *userp)
  53. {
  54. size_t realsize = size*nmemb;
  55. struct MemoryStruct *mem = (struct MemoryStruct *)userp;
  56. mem->size = realsize;;
  57. memset(mem->memory, 0x00, ARRAY_SIZE(mem->memory));
  58. chunk.size = realsize;
  59. memcpy(mem->memory, contents, realsize);
  60. return realsize;
  61. }
  62. /**
  63. * HTTP get request/response
  64. * @param url
  65. * @param responseData
  66. * @return
  67. */
  68. int httpGet(uint8_t *url, uint8_t *responseData)
  69. {
  70. int result = FAIL;
  71. CURL *curl;
  72. CURLcode res;
  73. curl_global_init(CURL_GLOBAL_ALL);
  74. curl = curl_easy_init();
  75. if(curl)
  76. {
  77. curl_easy_setopt(curl, CURLOPT_URL, (char*)url);
  78. curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);
  79. curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk);
  80. //curl_easy_setopt(curl, CURLOPT_USERAGENT, "libcurl-agent/1.0");
  81. //curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, (long)strlen((char*)postData));
  82. curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, FALSE);
  83. //curl_easy_setopt(curl, CURLOPT_HTTPAUTH, (long)CURLAUTH_ANY);
  84. //curl_easy_setopt(curl, CURLOPT_USERPWD, "user:password");
  85. curl_easy_setopt(curl, CURLOPT_TIMEOUT_MS, 2500L);
  86. res = curl_easy_perform(curl);
  87. if(res != CURLE_OK)
  88. {
  89. DEBUG_ERROR("curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
  90. }
  91. else
  92. {
  93. if(chunk.size > 0)
  94. {
  95. //DEBUG_INFO("Response content: %s\n", chunk.memory);
  96. memcpy(responseData, chunk.memory, ARRAY_SIZE(chunk.memory));
  97. }
  98. result = PASS;
  99. }
  100. curl_easy_cleanup(curl);
  101. }
  102. curl_global_cleanup();
  103. return result;
  104. }
  105. /**
  106. * HTTP post request/response
  107. * @param url
  108. * @param postData
  109. * @return
  110. */
  111. int httpPost(uint8_t *url, uint8_t *postData, uint8_t *responseData)
  112. {
  113. int result = FAIL;
  114. CURL *curl;
  115. CURLcode res;
  116. curl_global_init(CURL_GLOBAL_ALL);
  117. curl = curl_easy_init();
  118. if(curl)
  119. {
  120. curl_easy_setopt(curl, CURLOPT_URL, (char*)url);
  121. curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);
  122. curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk);
  123. //curl_easy_setopt(curl, CURLOPT_USERAGENT, "libcurl-agent/1.0");
  124. curl_easy_setopt(curl, CURLOPT_POSTFIELDS, (char*)postData);
  125. //curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, (long)strlen((char*)postData));
  126. curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, FALSE);
  127. //curl_easy_setopt(curl, CURLOPT_HTTPAUTH, (long)CURLAUTH_ANY);
  128. //curl_easy_setopt(curl, CURLOPT_USERPWD, "user:password");
  129. curl_easy_setopt(curl, CURLOPT_TIMEOUT_MS, 2500L);
  130. res = curl_easy_perform(curl);
  131. if(res != CURLE_OK)
  132. {
  133. DEBUG_ERROR("curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
  134. }
  135. else
  136. {
  137. if(chunk.size > 0)
  138. {
  139. //DEBUG_INFO("Response content: %s\n", chunk.memory);
  140. memcpy(responseData, chunk.memory, ARRAY_SIZE(chunk.memory));
  141. }
  142. result = PASS;
  143. }
  144. curl_easy_cleanup(curl);
  145. }
  146. curl_global_cleanup();
  147. return result;
  148. }
  149. /**
  150. * HTTP put request
  151. * @param url
  152. * @param postData
  153. * @return
  154. */
  155. int httpPut(uint8_t *url, uint8_t *postData)
  156. {
  157. int result = FAIL;
  158. CURL *curl;
  159. CURLcode res;
  160. curl_global_init(CURL_GLOBAL_ALL);
  161. curl = curl_easy_init();
  162. if(curl)
  163. {
  164. struct curl_slist *headers = NULL;
  165. headers = curl_slist_append(headers, "Content-Type: literature/classic");
  166. curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
  167. curl_easy_setopt(curl, CURLOPT_URL, (char*)url);
  168. curl_easy_setopt(curl, CURLOPT_POSTFIELDS, (char*)postData);
  169. curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "PUT");
  170. curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, FALSE);
  171. //curl_easy_setopt(curl, CURLOPT_HTTPAUTH, (long)CURLAUTH_ANY);
  172. //curl_easy_setopt(curl, CURLOPT_USERPWD, "user:password");
  173. curl_easy_setopt(curl, CURLOPT_TIMEOUT_MS, 2500L);
  174. res = curl_easy_perform(curl);
  175. if(res != CURLE_OK)
  176. {
  177. DEBUG_ERROR("curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
  178. }
  179. else
  180. {
  181. result = PASS;
  182. }
  183. curl_easy_cleanup(curl);
  184. curl_slist_free_all(headers);
  185. }
  186. curl_global_cleanup();
  187. return result;
  188. }
  189. /**
  190. * HTTP download response callback
  191. * @param ptr
  192. * @param size
  193. * @param nmemb
  194. * @param stream
  195. * @return
  196. */
  197. static size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream)
  198. {
  199. size_t written = fwrite(ptr, size, nmemb, (FILE *)stream);
  200. return written;
  201. }
  202. /**
  203. * Curl download request
  204. * @param url
  205. * @return
  206. */
  207. int curlDownload(uint8_t *url, uint8_t *filename)
  208. {
  209. int result = FAIL;
  210. CURL *curl;
  211. CURLcode res;
  212. FILE *downloadFile;
  213. curl_global_init(CURL_GLOBAL_ALL);
  214. curl = curl_easy_init();
  215. if(curl)
  216. {
  217. curl_easy_setopt(curl, CURLOPT_TIMEOUT_MS, 30000L);
  218. curl_easy_setopt(curl, CURLOPT_URL, (char*)url);
  219. curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
  220. curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, FALSE);
  221. //curl_easy_setopt(curl, CURLOPT_HTTPAUTH, (long)CURLAUTH_ANY);
  222. //curl_easy_setopt(curl, CURLOPT_USERPWD, "user:password");
  223. downloadFile = fopen((char*)filename, "wb");
  224. if(downloadFile)
  225. {
  226. curl_easy_setopt(curl, CURLOPT_WRITEDATA, downloadFile);
  227. res = curl_easy_perform(curl);
  228. if(res != CURLE_OK)
  229. {
  230. DEBUG_ERROR("curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
  231. }
  232. else
  233. {
  234. //DEBUG_INFO("Download %s success.\n", url);
  235. result = PASS;
  236. }
  237. fclose(downloadFile);
  238. }
  239. curl_easy_cleanup(curl);
  240. }
  241. curl_global_cleanup();
  242. return result;
  243. }
  244. /**
  245. * HTTP upload request
  246. * @param url
  247. * @param filename
  248. * @return
  249. */
  250. int httpUpload(uint8_t *url, uint8_t *filename)
  251. {
  252. int result = FAIL;
  253. CURL *curl;
  254. CURLcode res;
  255. FILE *upFile;
  256. struct stat file_info;
  257. curl_off_t speed_upload, total_time;
  258. if((upFile = fopen((char*)filename, "rb")))
  259. {
  260. if(fstat(fileno(upFile), &file_info) == 0)
  261. {
  262. curl = curl_easy_init();
  263. if(curl)
  264. {
  265. curl_easy_setopt(curl, CURLOPT_TIMEOUT_MS, 30000L);
  266. curl_easy_setopt(curl, CURLOPT_URL, (char*)url);
  267. curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);
  268. curl_easy_setopt(curl, CURLOPT_READDATA, upFile);
  269. curl_easy_setopt(curl, CURLOPT_INFILESIZE_LARGE, (curl_off_t)file_info.st_size);
  270. curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
  271. //curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, FALSE);
  272. //curl_easy_setopt(curl, CURLOPT_HTTPAUTH, (long)CURLAUTH_ANY);
  273. //curl_easy_setopt(curl, CURLOPT_USERPWD, "user:password");
  274. res = curl_easy_perform(curl);
  275. if(res != CURLE_OK)
  276. {
  277. DEBUG_ERROR("curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
  278. }
  279. else
  280. {
  281. curl_easy_getinfo(curl, CURLINFO_SPEED_UPLOAD, &speed_upload);
  282. curl_easy_getinfo(curl, CURLINFO_TOTAL_TIME, &total_time);
  283. /*DEBUG_INFO("Upload %s to %s success.\n", filename, url);
  284. DEBUG_INFO("Speed: %" CURL_FORMAT_CURL_OFF_T " bytes/sec during %"
  285. CURL_FORMAT_CURL_OFF_T ".%06ld seconds\n",
  286. speed_upload,
  287. (total_time / 1000000), (long)(total_time % 1000000));*/
  288. result = PASS;
  289. }
  290. fclose(upFile);
  291. curl_easy_cleanup(curl);
  292. }
  293. }
  294. }
  295. return result;
  296. }
  297. /**
  298. * File read callback
  299. * @param ptr
  300. * @param size
  301. * @param nmemb
  302. * @param stream
  303. * @return
  304. */
  305. static size_t read_callback(char *ptr, size_t size, size_t nmemb, void *stream)
  306. {
  307. curl_off_t nread;
  308. size_t retcode = fread(ptr, size, nmemb, stream);
  309. nread = (curl_off_t)retcode;
  310. DEBUG_INFO("Read %" CURL_FORMAT_CURL_OFF_T " bytes from file\n", nread);
  311. return retcode;
  312. }
  313. /**
  314. * FTP upload request
  315. * @param url
  316. * @param filename
  317. * @return
  318. */
  319. int ftpUpload(uint8_t *url, uint8_t *filename)
  320. {
  321. int result = FAIL;
  322. CURL *curl;
  323. CURLcode res;
  324. FILE *upFile;
  325. struct stat file_info;
  326. curl_off_t fsize;
  327. curl_global_init(CURL_GLOBAL_ALL);
  328. if(!stat((char*)filename, &file_info))
  329. {
  330. fsize = (curl_off_t)file_info.st_size;
  331. DEBUG_INFO("%s size: %" CURL_FORMAT_CURL_OFF_T " bytes.\n", filename, fsize);
  332. if((upFile = fopen((char*)filename, "rb")))
  333. {
  334. curl = curl_easy_init();
  335. if(curl)
  336. {
  337. curl_easy_setopt(curl, CURLOPT_TIMEOUT_MS, 30000L);
  338. curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_callback);
  339. curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);
  340. curl_easy_setopt(curl, CURLOPT_URL, url);
  341. curl_easy_setopt(curl, CURLOPT_READDATA, upFile);
  342. curl_easy_setopt(curl, CURLOPT_INFILESIZE_LARGE, (curl_off_t)fsize);
  343. res = curl_easy_perform(curl);
  344. if(res != CURLE_OK)
  345. {
  346. DEBUG_ERROR("curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
  347. }
  348. else
  349. {
  350. //DEBUG_INFO("Upload %s success.\n", url);
  351. }
  352. curl_easy_cleanup(curl);
  353. }
  354. fclose(upFile);
  355. }
  356. }
  357. curl_global_cleanup();
  358. return result;
  359. }