summaryrefslogtreecommitdiff
path: root/src/http.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/http.c')
-rw-r--r--src/http.c138
1 files changed, 23 insertions, 115 deletions
diff --git a/src/http.c b/src/http.c
index 4c9f9dc..ec1ecc5 100644
--- a/src/http.c
+++ b/src/http.c
@@ -6,6 +6,7 @@
#include <curl/curl.h>
#include "string-util.h"
#include "auth.h"
+#include "log.h"
#define BUFFER_SIZE (256 * 1024)
#define AUTH_HEADER_STR_PREFIX "Authorization: Bearer "
@@ -31,7 +32,7 @@ static size_t write_response(void *ptr, size_t size, size_t nmemb, void *stream)
struct write_result *result = (struct write_result *)stream;
if (result->pos + size * nmemb >= BUFFER_SIZE - 1) {
- fprintf(stderr, "error: too small buffer\n");
+ log_msg(LOG_ERROR, "write_response", "buffer too small");
return 0;
}
@@ -60,12 +61,12 @@ char *get_request(const char *url)
struct write_result write_result = {.data = data, .pos = 0};
- if (access_token) {
- char *auth_header_val =
- malloc(strlen(AUTH_HEADER_STR_PREFIX) + strlen(access_token) + 1);
- strlcpy(auth_header_val, AUTH_HEADER_STR_PREFIX,
- sizeof(auth_header_val));
- strlcat(auth_header_val, access_token, sizeof(auth_header_val));
+ if (is_logged_in()) {
+ const char *token = get_access_token();
+ size_t s = strlen(AUTH_HEADER_STR_PREFIX) + strlen(token) + 1;
+ char *auth_header_val = malloc(s);
+ strlcpy(auth_header_val, AUTH_HEADER_STR_PREFIX, s);
+ strlcat(auth_header_val, token, s);
headers = curl_slist_append(headers, auth_header_val);
}
@@ -76,14 +77,16 @@ char *get_request(const char *url)
status = curl_easy_perform(curl);
if (status != 0) {
- fprintf(stderr, "get_request(): unable to request data from %s: %s\n",
- url, curl_easy_strerror(status));
+ log_msg(LOG_ERROR, "get_request",
+ "unable to request data from %s: %s", url,
+ curl_easy_strerror(status));
goto error;
}
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &code);
if (code != 200) {
- fprintf(stderr, "error: server responded with code %ld\n", code);
+ log_msg(LOG_ERROR, "get_request", "server responded with code %ld",
+ code);
goto error;
}
@@ -121,12 +124,12 @@ char *post_request(const char *url, char *post_data)
struct write_result write_result = {.data = data, .pos = 0};
- if (access_token) {
- char *auth_header_val =
- malloc(strlen(AUTH_HEADER_STR_PREFIX) + strlen(access_token) + 1);
- strlcpy(auth_header_val, AUTH_HEADER_STR_PREFIX,
- sizeof(auth_header_val));
- strlcat(auth_header_val, access_token, sizeof(auth_header_val));
+ if (is_logged_in()) {
+ const char *token = get_access_token();
+ size_t s = strlen(AUTH_HEADER_STR_PREFIX) + strlen(token) + 1;
+ char *auth_header_val = malloc(s);
+ strlcpy(auth_header_val, AUTH_HEADER_STR_PREFIX, s);
+ strlcat(auth_header_val, token, s);
headers = curl_slist_append(headers, auth_header_val);
}
if (post_data) {
@@ -138,18 +141,19 @@ char *post_request(const char *url, char *post_data)
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_response);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &write_result);
- curl_easy_setopt(curl, CURLOPT_POSTFIELDS, post_data);
+ if (post_data)
+ curl_easy_setopt(curl, CURLOPT_POSTFIELDS, post_data);
status = curl_easy_perform(curl);
if (status != 0) {
- fprintf(stderr, "post_request(): unable to request data from %s: %s\n",
+ log_msg(LOG_ERROR, "post_request", "unable to request data from %s: %s",
url, curl_easy_strerror(status));
goto error;
}
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &code);
if (code != 200) {
- fprintf(stderr, "error: server responded with code %ld\n", code);
+ log_msg(LOG_ERROR, "post_request", "server responded with code %ld", code);
goto error;
}
@@ -168,99 +172,3 @@ error:
curl_easy_cleanup(curl);
return NULL;
}
-
-struct post_request_arg {
- char *url;
- char *post_data;
- void (*callback)(char *);
-};
-
-void *post_one_url(void *arg)
-{
-
- struct post_request_arg *req_args = (struct post_request_arg *)arg;
- CURL *curl = NULL;
- CURLcode status;
- struct curl_slist *headers = NULL;
- char *data = NULL;
- long code;
-
- curl = curl_easy_init();
- if (!curl)
- goto error;
-
- data = malloc(BUFFER_SIZE);
- if (!data)
- goto error;
-
- struct write_result write_result = {.data = data, .pos = 0};
-
- if (access_token) {
- char *auth_header_val =
- malloc(strlen(AUTH_HEADER_STR_PREFIX) + strlen(access_token) + 1);
- strlcpy(auth_header_val, AUTH_HEADER_STR_PREFIX,
- sizeof(auth_header_val));
- strlcat(auth_header_val, access_token, sizeof(auth_header_val));
- headers = curl_slist_append(headers, auth_header_val);
- }
- if (req_args->post_data) {
- char *content_type_header_val = "Content-Type: application/json";
- headers = curl_slist_append(headers, content_type_header_val);
- }
-
- curl_easy_setopt(curl, CURLOPT_URL, req_args->url);
- curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
- curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_response);
- curl_easy_setopt(curl, CURLOPT_WRITEDATA, &write_result);
- curl_easy_setopt(curl, CURLOPT_POSTFIELDS, req_args->post_data);
-
- status = curl_easy_perform(curl);
- if (status != 0) {
- fprintf(stderr, "post_request(): unable to request data from %s: %s\n",
- req_args->url, curl_easy_strerror(status));
- goto error;
- }
-
- fprintf(stderr, "http method: POST, url: %s, res: %s\n", req_args->url, data);
- curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &code);
- if (code != 200) {
- fprintf(stderr, "post_request(): server responded with code %ld\n", code);
- goto error;
- }
-
- data[write_result.pos] = '\0';
-
- curl_slist_free_all(headers);
- curl_easy_cleanup(curl);
-
- (*(req_args->callback))(data);
- return NULL;
-
-error:
- if (data)
- free(data);
- if (headers)
- curl_slist_free_all(headers);
- if (curl)
- curl_easy_cleanup(curl);
-
- (*(req_args->callback))(NULL);
- return NULL;
-}
-
-int http_post_async(char *url, char *post_data, void (*callback)(char *))
-{
- struct post_request_arg *arg;
- pthread_t t;
-
- arg = calloc(1, sizeof(struct post_request_arg));
- if (!arg) {
- err(1, "http_post_async(): calloc failed");
- return -1;
- }
- arg->url = url;
- arg->post_data = post_data;
- arg->callback = callback;
-
- return pthread_create(&t, NULL, post_one_url, arg);
-}