abouttreesummaryrefslogcommitdiff
path: root/src/matrix_http_curl.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/matrix_http_curl.c')
-rw-r--r--src/matrix_http_curl.c113
1 files changed, 113 insertions, 0 deletions
diff --git a/src/matrix_http_curl.c b/src/matrix_http_curl.c
new file mode 100644
index 0000000..577c5ec
--- /dev/null
+++ b/src/matrix_http_curl.c
@@ -0,0 +1,113 @@
+#include "matrix.h"
+
+#include <curl/curl.h>
+
+
+
+typedef struct {
+ char * ptr;
+ int cap;
+ int len;
+} WriteStr;
+
+// typedef struct {
+// Str str;
+// size_t pos;
+// } ReadStr;
+
+size_t curlWriteString(char *ptr, size_t size, size_t nmemb, void *userdata) {
+ WriteStr *writeStr = (WriteStr *)userdata;
+
+ int toWrite = (int)size*nmemb;
+
+ int writable = writeStr->cap - writeStr->len;
+ int gonnaWrite = writable < (toWrite) ? writable : (toWrite);
+
+ for (int i = 0; i < gonnaWrite; i++)
+ {
+ int offset = writeStr->len;
+ writeStr->ptr[i+offset] = ptr[i];
+ }
+
+ writeStr->len += gonnaWrite;
+
+ return gonnaWrite;
+}
+// size_t curlReadString(char *dst, size_t size, size_t nmemb, void *userdata) {
+// ReadStr *readStr = (ReadStr *)userdata;
+
+// size_t copyAmount = size*nmemb;
+// if (copyAmount > (readStr->str.len - readStr->pos)) {
+// copyAmount = (readStr->str.len - readStr->pos);
+// }
+
+// memcpy(dst, readStr->str.str + readStr->pos, copyAmount);
+// readStr->pos += copyAmount;
+// return copyAmount;
+// }
+
+CURLcode
+curlPerform(CURL *curl) {
+ // struct curl_slist *list = NULL;
+ // list = curl_slist_append(list, uTokenHeaderStr);
+
+ // curl_easy_setopt(curl, CURLOPT_HTTPHEADER, list);
+
+ CURLcode result = curl_easy_perform(curl);
+
+ // curl_slist_free_all(list);
+
+ return result;
+}
+
+
+
+bool
+MatrixHttpPost(
+ MatrixClient * client,
+ const char * url,
+ char * requestBuffer, int requestLen,
+ char * outResponseBuffer, int outResponseCap, int * outResponseLen
+) {
+ CURL *curl = (CURL *)client->httpUserData;
+
+ CURLcode res;
+
+ if(curl) {
+ int urlLen = strlen(url);
+
+ char fullUrl[MAX_URL_LEN];
+ for (int i = 0; i < client->serverLen; i++)
+ fullUrl[i] = client->server[i];
+ for (int i = 0; i < urlLen; i++)
+ fullUrl[client->serverLen+i] = url[i];
+ fullUrl[client->serverLen+urlLen] = '\0';
+ curl_easy_setopt(curl, CURLOPT_URL, fullUrl);
+
+ curl_easy_setopt(curl, CURLOPT_POST, 1L);
+ curl_easy_setopt(curl, CURLOPT_POSTFIELDS, requestBuffer);
+ curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, requestLen);
+
+ curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
+ curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
+
+ WriteStr writeStr = {
+ outResponseBuffer,
+ outResponseCap,
+ 0
+ };
+ curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, curlWriteString);
+ curl_easy_setopt(curl, CURLOPT_WRITEDATA, &writeStr);
+
+ res = curlPerform(curl);
+
+ *outResponseLen = writeStr.len;
+
+ if(res != CURLE_OK)
+ fprintf(stderr, "curl_easy_perform() failed: %s\n",
+ curl_easy_strerror(res));
+ }
+
+
+ return res == CURLE_OK;
+} \ No newline at end of file