diff options
Diffstat (limited to 'src/http.c')
| -rw-r--r-- | src/http.c | 138 | 
1 files changed, 23 insertions, 115 deletions
| @@ -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); -} | 
