X-Git-Url: https://gitweb.ps.run/matrix_esp_thesis/blobdiff_plain/7cba6b3cdbd3b82ec9092ce9bda8ec20739096cb..71b13552379398dafcbc8fa8347d119a8984f448:/src/matrix_http_curl.c 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 + + + +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