abouttreesummaryrefslogcommitdiff
path: root/src/matrix_http_curl.c
blob: 577c5ec9800b57e49c186ff83b92da96d936e874 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
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;
}