]> gitweb.ps.run Git - matrix_esp_thesis/blob - src/matrix_http_curl.c
Readme
[matrix_esp_thesis] / src / matrix_http_curl.c
1 #include "matrix.h"\r
2 \r
3 #include <curl/curl.h>\r
4 \r
5 \r
6 \r
7 typedef struct {\r
8     char * ptr;\r
9     int cap;\r
10     int len;\r
11 } WriteStr;\r
12 \r
13 // typedef struct {\r
14 //     Str str;\r
15 //     size_t pos;\r
16 // } ReadStr;\r
17 \r
18 size_t curlWriteString(char *ptr, size_t size, size_t nmemb, void *userdata) {\r
19     WriteStr *writeStr = (WriteStr *)userdata;\r
20 \r
21     int toWrite = (int)size*nmemb;\r
22 \r
23     int writable = writeStr->cap - writeStr->len;\r
24     int gonnaWrite = writable < (toWrite) ? writable : (toWrite);\r
25 \r
26     for (int i = 0; i < gonnaWrite; i++)\r
27     {\r
28         int offset = writeStr->len;\r
29         writeStr->ptr[i+offset] = ptr[i];\r
30     }\r
31 \r
32     writeStr->len += gonnaWrite;\r
33 \r
34     return gonnaWrite;\r
35 }\r
36 // size_t curlReadString(char *dst, size_t size, size_t nmemb, void *userdata) {\r
37 //     ReadStr *readStr = (ReadStr *)userdata;\r
38 \r
39 //     size_t copyAmount = size*nmemb;\r
40 //     if (copyAmount > (readStr->str.len - readStr->pos)) {\r
41 //         copyAmount = (readStr->str.len - readStr->pos);\r
42 //     }\r
43 \r
44 //     memcpy(dst, readStr->str.str + readStr->pos, copyAmount);\r
45 //     readStr->pos += copyAmount;\r
46 //     return copyAmount;\r
47 // }\r
48 \r
49 CURLcode\r
50 curlPerform(CURL *curl) {\r
51     // struct curl_slist *list = NULL;\r
52     // list = curl_slist_append(list, uTokenHeaderStr);\r
53     \r
54     // curl_easy_setopt(curl, CURLOPT_HTTPHEADER, list);\r
55     \r
56     CURLcode result = curl_easy_perform(curl);\r
57 \r
58     // curl_slist_free_all(list);\r
59 \r
60     return result;\r
61 }\r
62 \r
63 \r
64 \r
65 bool\r
66 MatrixHttpPost(\r
67     MatrixClient * client,\r
68     const char * url,\r
69     char * requestBuffer, int requestLen,\r
70     char * outResponseBuffer, int outResponseCap, int * outResponseLen\r
71 ) {\r
72     CURL *curl = (CURL *)client->httpUserData;\r
73 \r
74     CURLcode res;\r
75     \r
76     if(curl) {\r
77         int urlLen = strlen(url);\r
78 \r
79         char fullUrl[MAX_URL_LEN];\r
80         for (int i = 0; i < client->serverLen; i++)\r
81             fullUrl[i] = client->server[i];\r
82         for (int i = 0; i < urlLen; i++)\r
83             fullUrl[client->serverLen+i] = url[i];\r
84         fullUrl[client->serverLen+urlLen] = '\0';\r
85         curl_easy_setopt(curl, CURLOPT_URL, fullUrl);\r
86         \r
87         curl_easy_setopt(curl, CURLOPT_POST, 1L);\r
88         curl_easy_setopt(curl, CURLOPT_POSTFIELDS, requestBuffer);\r
89         curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, requestLen);\r
90     \r
91         curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);\r
92         curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);\r
93 \r
94         WriteStr writeStr = {\r
95             outResponseBuffer,\r
96             outResponseCap,\r
97             0\r
98         };\r
99         curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, curlWriteString);\r
100         curl_easy_setopt(curl, CURLOPT_WRITEDATA, &writeStr);\r
101 \r
102         res = curlPerform(curl);\r
103 \r
104         *outResponseLen = writeStr.len;\r
105 \r
106         if(res != CURLE_OK)\r
107             fprintf(stderr, "curl_easy_perform() failed: %s\n",\r
108                 curl_easy_strerror(res));\r
109     }\r
110     \r
111 \r
112     return res == CURLE_OK;\r
113 }