aboutsummaryrefslogtreecommitdiffstats
path: root/net/api.c
diff options
context:
space:
mode:
authorturret <turret@duck.com>2024-01-18 18:52:27 -0600
committerturret <turret@duck.com>2024-01-18 18:52:27 -0600
commite6c7c2f3d683a5c15e2be15563e2f52d8aed91ed (patch)
treed2619b8e6e7c37ff799276170cb33beb99b0d649 /net/api.c
parent694ea524ca6e2d08bb648ded5c45d455a7b5d340 (diff)
downloaddiscord-bot-skeleton-e6c7c2f3d683a5c15e2be15563e2f52d8aed91ed.tar.gz
discord-bot-skeleton-e6c7c2f3d683a5c15e2be15563e2f52d8aed91ed.tar.bz2
discord-bot-skeleton-e6c7c2f3d683a5c15e2be15563e2f52d8aed91ed.zip
api: extensify api api
Diffstat (limited to 'net/api.c')
-rw-r--r--net/api.c81
1 files changed, 62 insertions, 19 deletions
diff --git a/net/api.c b/net/api.c
index 9da0e8e..be36866 100644
--- a/net/api.c
+++ b/net/api.c
@@ -5,40 +5,83 @@
#include <curl/curl.h>
+#define __API_INTERNAL
+#include <api.h>
+#include <log.h>
+
extern char *token;
-int http_get(char *url)
+int http_request(HTTPMethod method, char *url,
+ struct curl_slist *_Nullable headers, char *writebuf, size_t bufsiz)
{
- int pipefd[2];
- if(pipe(pipefd) < 0)
- return -errno;
+ int inputpipe[2];
+ int outputpipe[2];
+
+ if(pipe(inputpipe) < 0)
+ return -(errno << 8);
+ if(pipe(outputpipe) < 0)
+ return -(errno << 8);
+
+ if(writebuf && bufsiz > 0)
+ write(inputpipe[1], writebuf, bufsiz);
+ close(inputpipe[1]);
- FILE *write_end = fdopen(pipefd[1], "w");
+ FILE *input_read = fdopen(inputpipe[0], "r");
+ FILE *output_write = fdopen(outputpipe[1], "w");
- int ret = pipefd[0];
+ int ret = outputpipe[0];
CURL *job = curl_easy_init();
- if(job == 0) {
- close(pipefd[0]);
- ret = -1;
- goto close_writepipe;
- }
+ if(job == NULL)
+ panic("api: curl_easy_init failed");
curl_easy_setopt(job, CURLOPT_URL, url);
- curl_easy_setopt(job, CURLOPT_WRITEDATA, write_end);
- curl_easy_setopt(job, CURLOPT_HTTPHEADER,
- curl_slist_append(NULL, token));
+ curl_easy_setopt(job, CURLOPT_READDATA, input_read);
+ curl_easy_setopt(job, CURLOPT_WRITEDATA, output_write);
+ char *requestmethod = "GET";
+ switch(method) {
+ case HTTP_PATCH:
+ requestmethod = "PATCH";
+ break;
+ case HTTP_DELETE:
+ requestmethod = "DELETE";
+ break;
+ case HTTP_PUT:
+ requestmethod = "PUT";
+ break;
+ case HTTP_POST:
+ requestmethod = "POST";
+ break;
+ case HTTP_GET: /* fallthrough */
+ default:
+ break;
+ }
+ curl_easy_setopt(job, CURLOPT_CUSTOMREQUEST, requestmethod);
+ if(headers)
+ curl_easy_setopt(job, CURLOPT_HTTPHEADER, headers);
CURLcode res = curl_easy_perform(job);
if(res > 0) {
+ close(outputpipe[0]);
ret = -res;
- close(pipefd[0]);
- goto cleanup;
}
-cleanup:
curl_easy_cleanup(job);
-close_writepipe:
- fclose(write_end);
+ fclose(input_read);
+ fclose(output_write);
+ return ret;
+}
+
+int api_request(HTTPMethod method, char *url,
+ struct curl_slist *_Nullable headers, char *writebuf, size_t bufsiz)
+{
+ char *new_url = calloc((strlen("https://discord.com/api") + strlen(url) + 1),
+ sizeof(char));
+ strcpy(new_url, "https://discord.com/api");
+ strcat(new_url, url);
+ struct curl_slist *headers_auth = curl_slist_append(headers, token);
+ int ret = http_request(method, new_url, headers_auth, writebuf, bufsiz);
+ free(new_url);
+ curl_slist_free_all(headers_auth);
return ret;
}