diff options
author | turret <turret@duck.com> | 2024-01-18 18:52:27 -0600 |
---|---|---|
committer | turret <turret@duck.com> | 2024-01-18 18:52:27 -0600 |
commit | e6c7c2f3d683a5c15e2be15563e2f52d8aed91ed (patch) | |
tree | d2619b8e6e7c37ff799276170cb33beb99b0d649 /net | |
parent | 694ea524ca6e2d08bb648ded5c45d455a7b5d340 (diff) | |
download | discord-bot-skeleton-e6c7c2f3d683a5c15e2be15563e2f52d8aed91ed.tar.gz discord-bot-skeleton-e6c7c2f3d683a5c15e2be15563e2f52d8aed91ed.tar.bz2 discord-bot-skeleton-e6c7c2f3d683a5c15e2be15563e2f52d8aed91ed.zip |
api: extensify api api
Diffstat (limited to 'net')
-rw-r--r-- | net/api.c | 81 | ||||
-rw-r--r-- | net/net.c | 4 |
2 files changed, 64 insertions, 21 deletions
@@ -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; } @@ -11,11 +11,11 @@ #include <cJSON.h> #include <curl/curl.h> +#include <api.h> #include <init.h> #include <log.h> #include <subsys.h> -extern int http_get(char *url); extern void ws_handle_event(cJSON *event); extern void ws_send_heartbeat(); CURL *ws_handle; @@ -149,7 +149,7 @@ void net_get_gateway_url() panic("net: wss not supported by libcurl"); /* fetch preferred url from discord */ - int fd = http_get("https://discord.com/api/gateway/bot"); + int fd = api_get("/gateway/bot", NULL, NULL, 0); if(fd < 0) { print(LOG_ERR "net: cannot get gateway url: %s", curl_easy_strerror(-fd)); goto assume; |