summaryrefslogtreecommitdiff
path: root/src/curl
diff options
context:
space:
mode:
Diffstat (limited to 'src/curl')
-rw-r--r--src/curl/curl.c66
-rw-r--r--src/curl/curl.h16
-rw-r--r--src/curl/http.c194
-rw-r--r--src/curl/http.h58
-rw-r--r--src/curl/websocket.c66
-rw-r--r--src/curl/websocket.h16
6 files changed, 225 insertions, 191 deletions
diff --git a/src/curl/curl.c b/src/curl/curl.c
index b96d46f..c996011 100644
--- a/src/curl/curl.c
+++ b/src/curl/curl.c
@@ -3,12 +3,13 @@
#include "curl.h"
// TODO: https://curl.se/libcurl/c/externalsocket.html
+// TODO: Use timer again/repeat.
static void curl_socket_action_callback(struct ev_loop *loop, ev_io *w, s32 revents)
{
(void)loop;
- struct aki_curl *curl = (struct aki_curl *)w->data;
- s32 action = ((revents & EV_READ) ? CURL_CSELECT_IN : 0) | ((revents & EV_WRITE) ? CURL_CSELECT_OUT : 0);
+ struct nn_curl *curl = (struct nn_curl *)w->data;
+ s32 action = (revents & EV_READ ? CURL_CSELECT_IN : 0) | (revents & EV_WRITE ? CURL_CSELECT_OUT : 0);
s32 running;
CURLMcode mc = curl_multi_socket_action(curl->multi_handle, curl->sock, action, &running);
if (mc != CURLM_OK) {
@@ -18,10 +19,10 @@ static void curl_socket_action_callback(struct ev_loop *loop, ev_io *w, s32 reve
curl->handle_events(curl->userdata, curl);
}
-static void set_sock(struct aki_curl *curl, s32 what)
+static void set_sock(struct nn_curl *curl, s32 what)
{
- s32 action = ((what & CURL_POLL_IN) ? EV_READ : 0) | ((what & CURL_POLL_OUT) ? EV_WRITE : 0);
if (curl->event.active) ev_io_stop(curl->loop->ev, &curl->event);
+ s32 action = (what & CURL_POLL_IN ? EV_READ : 0) | (what & CURL_POLL_OUT ? EV_WRITE : 0);
ev_io_init(&curl->event, curl_socket_action_callback, curl->sock, action);
ev_io_start(curl->loop->ev, &curl->event);
}
@@ -29,7 +30,7 @@ static void set_sock(struct aki_curl *curl, s32 what)
static s32 sock_callback(CURL *e, curl_socket_t s, s32 what, void *cbp, void *sockp)
{
(void)e;
- struct aki_curl *curl = (struct aki_curl *)cbp;
+ struct nn_curl *curl = (struct nn_curl *)cbp;
if (what == CURL_POLL_REMOVE) {
ev_io_stop(curl->loop->ev, &curl->event);
curl_multi_assign(curl->multi_handle, curl->sock, NULL);
@@ -47,10 +48,14 @@ static s32 sock_callback(CURL *e, curl_socket_t s, s32 what, void *cbp, void *so
static void timeout_callback(struct ev_loop *loop, ev_timer *w, s32 revents)
{
(void)loop;
- struct aki_curl *curl = (struct aki_curl *)w->data;
+ struct nn_curl *curl = (struct nn_curl *)w->data;
(void)revents;
- ev_timer_stop(curl->loop->ev, w);
- curl->timer_started = false;
+
+ if (curl->timer_started) {
+ ev_timer_stop(curl->loop->ev, w);
+ curl->timer_started = false;
+ }
+
s32 running;
curl_multi_socket_action(curl->multi_handle, CURL_SOCKET_TIMEOUT, 0, &running);
curl->handle_events(curl->userdata, curl);
@@ -59,58 +64,64 @@ static void timeout_callback(struct ev_loop *loop, ev_timer *w, s32 revents)
static s32 timer_callback(CURLM *multi, s64 timeout_ms, void *userp)
{
(void)multi;
- struct aki_curl *curl = (struct aki_curl *)userp;
- if (timeout_ms == -1) {
- ev_timer_stop(curl->loop->ev, &curl->timer);
- return 0;
- }
+ struct nn_curl *curl = (struct nn_curl *)userp;
+
if (curl->timer_started) {
ev_timer_stop(curl->loop->ev, &curl->timer);
+ curl->timer_started = false;
}
+
+ if (timeout_ms == -1)
+ return 0;
+
curl->timer.data = curl;
ev_timer_init(&curl->timer, timeout_callback, timeout_ms / 1000.0, 0.0);
+
curl->timer_started = true;
ev_timer_start(curl->loop->ev, &curl->timer);
+
return 0;
}
-bool aki_curl_init(struct aki_curl *curl)
+bool nn_curl_init(struct nn_curl *curl)
{
curl->handle = curl_easy_init();
if (!curl->handle) goto err;
-#ifdef _DEBUG_
//curl_easy_setopt(curl->handle, CURLOPT_VERBOSE, 1L);
-#endif
curl_easy_setopt(curl->handle, CURLOPT_NOPROGRESS, 1L);
+
curl->multi_handle = curl_multi_init();
if (!curl->multi_handle) goto err;
curl_multi_setopt(curl->multi_handle, CURLMOPT_SOCKETFUNCTION, sock_callback);
curl_multi_setopt(curl->multi_handle, CURLMOPT_SOCKETDATA, curl);
curl_multi_setopt(curl->multi_handle, CURLMOPT_TIMERFUNCTION, timer_callback);
curl_multi_setopt(curl->multi_handle, CURLMOPT_TIMERDATA, curl);
- curl->added = false;
- curl->timer_started = false;
+
curl->loop = NULL;
curl->event.data = curl;
curl->event.active = 0;
+ curl->timer_started = false;
+ curl->added = false;
+
return true;
err:
- aki_curl_close(curl);
+ nn_curl_close(curl);
+
return false;
}
-void aki_curl_set_url(struct aki_curl *curl, str *url)
+void nn_curl_set_url(struct nn_curl *curl, str *url)
{
char *c_str = al_str_to_c_str(url);
curl_easy_setopt(curl->handle, CURLOPT_URL, c_str);
al_free(c_str);
}
-bool aki_curl_add_handle(struct aki_curl *curl)
+bool nn_curl_add_handle(struct nn_curl *curl)
{
al_assert(!curl->added);
- // CURLM_RECURSIVE_API_CALL (8) also means we can't even call this
- // while a callback is running on another thread.
+ // CURLM_RECURSIVE_API_CALL (8) also means we can't call this while
+ // a callback is running on another thread.
CURLMcode mc = curl_multi_add_handle(curl->multi_handle, curl->handle);
if (mc != CURLM_OK) {
al_log_error("curl", "curl_multi_add_handle() failed (%s).", curl_multi_strerror(mc));
@@ -120,7 +131,7 @@ bool aki_curl_add_handle(struct aki_curl *curl)
return true;
}
-bool aki_curl_remove_handle(struct aki_curl *curl)
+bool nn_curl_remove_handle(struct nn_curl *curl)
{
al_assert(curl->added);
CURLMcode mc = curl_multi_remove_handle(curl->multi_handle, curl->handle);
@@ -132,11 +143,10 @@ bool aki_curl_remove_handle(struct aki_curl *curl)
return true;
}
-void aki_curl_close(struct aki_curl *curl)
+void nn_curl_close(struct nn_curl *curl)
{
- if (curl->handle && curl->multi_handle && curl->added) {
- aki_curl_remove_handle(curl);
- }
+ if (curl->handle && curl->multi_handle && curl->added)
+ nn_curl_remove_handle(curl);
if (curl->handle) curl_easy_cleanup(curl->handle);
if (curl->multi_handle) curl_multi_cleanup(curl->multi_handle);
}
diff --git a/src/curl/curl.h b/src/curl/curl.h
index f3a1bfc..7a5e31f 100644
--- a/src/curl/curl.h
+++ b/src/curl/curl.h
@@ -5,21 +5,21 @@
#include "../loop.h"
-struct aki_curl {
+struct nn_curl {
+ struct nn_event_loop *loop;
ev_io event;
ev_timer timer;
bool timer_started;
- struct aki_event_loop *loop;
CURL *handle;
CURLM *multi_handle;
bool added;
curl_socket_t sock;
- void (*handle_events)(void *, struct aki_curl *);
+ void (*handle_events)(void *, struct nn_curl *);
void *userdata;
};
-bool aki_curl_init(struct aki_curl *curl);
-void aki_curl_set_url(struct aki_curl *curl, str *url);
-bool aki_curl_add_handle(struct aki_curl *curl);
-bool aki_curl_remove_handle(struct aki_curl *curl);
-void aki_curl_close(struct aki_curl *curl);
+bool nn_curl_init(struct nn_curl *curl);
+void nn_curl_set_url(struct nn_curl *curl, str *url);
+bool nn_curl_add_handle(struct nn_curl *curl);
+bool nn_curl_remove_handle(struct nn_curl *curl);
+void nn_curl_close(struct nn_curl *curl);
diff --git a/src/curl/http.c b/src/curl/http.c
index b3c13a2..00d5cd9 100644
--- a/src/curl/http.c
+++ b/src/curl/http.c
@@ -2,59 +2,69 @@
#include "http.h"
-static void check_status_codes(struct aki_curl *curl)
+static void check_status_codes(struct nn_curl *curl)
{
- struct aki_http *http = (struct aki_http *)curl;
- if (http->response_code <= 0) {
- curl_easy_getinfo(curl->handle, CURLINFO_RESPONSE_CODE, &http->response_code);
- if (http->response_code > 0) {
- http->callback(http->userdata, AKI_HTTP_RESPONSE_CODE, NULL, http->response_code);
- }
+ struct nn_http *http = (struct nn_http *)curl;
+
+ if (http->status_code <= 0) {
+ curl_easy_getinfo(curl->handle, CURLINFO_RESPONSE_CODE, &http->status_code);
+ if (http->status_code > 0)
+ http->callback(http->userdata, NNWT_HTTP_RESPONSE_CODE, NULL, http->status_code);
}
- if (http->response_code == 200 && http->content_length < 0) {
+
+ if (http->content_length < 0 && http->status_code == 200) {
curl_easy_getinfo(curl->handle, CURLINFO_CONTENT_LENGTH_DOWNLOAD_T, &http->content_length);
- if (http->content_length >= 0) {
- http->callback(http->userdata, AKI_HTTP_CONTENT_LENGTH, NULL, (s64)http->content_length);
- }
+ if (http->content_length >= 0)
+ http->callback(http->userdata, NNWT_HTTP_CONTENT_LENGTH, NULL, (s64)http->content_length);
}
}
-static void http_handle_events(void *userdata, struct aki_curl *curl)
+static void http_handle_events(void *userdata, struct nn_curl *curl)
{
(void)userdata;
s32 pending;
CURLMsg *msg;
- struct aki_http *http = (struct aki_http *)curl;
+ struct nn_http *http = (struct nn_http *)curl;
while ((msg = curl_multi_info_read(curl->multi_handle, &pending))) {
switch (msg->msg) {
- case CURLMSG_DONE:
+ case CURLMSG_DONE: {
al_assert(msg->easy_handle == curl->handle);
+
CURLcode code = msg->data.result;
if (code != CURLE_OK) {
al_log_error("http", "Curl error: %s.", curl_easy_strerror(code));
- http->callback(http->userdata, AKI_HTTP_ERROR, NULL, -1);
+ http->callback(http->userdata, NNWT_HTTP_ERROR, NULL, -1);
return;
}
- if (!aki_curl_remove_handle(curl)) return;
+
+ if (!nn_curl_remove_handle(curl))
+ return;
+
check_status_codes(curl);
- if (http->response_code == 200) {
- http->callback(http->userdata, AKI_HTTP_FINISHED, NULL, http->response_code);
- } else if (http->response_code / 100 == 3) {
+
+ if (http->status_code == 200) {
+ http->callback(http->userdata, NNWT_HTTP_FINISHED, NULL, http->status_code);
+ } else if (http->status_code / 100 == 3) {
+ http->callback(http->userdata, NNWT_HTTP_REDIRECT, NULL, http->status_code);
+
char *redirect_url = NULL;
curl_easy_getinfo(curl->handle, CURLINFO_REDIRECT_URL, &redirect_url);
if (!redirect_url) {
- http->callback(http->userdata, AKI_HTTP_ERROR, NULL, http->response_code);
+ http->callback(http->userdata, NNWT_HTTP_ERROR, NULL, http->status_code);
return;
}
- aki_curl_set_url(curl, al_str_cr(redirect_url));
- http->response_code = -1;
+ nn_curl_set_url(curl, al_str_cr(redirect_url));
+
+ http->status_code = -1;
http->content_length = -1;
- if (!aki_curl_add_handle(curl)) return;
- http->callback(http->userdata, AKI_HTTP_REDIRECT, NULL, http->response_code);
+ if (!nn_curl_add_handle(curl))
+ return;
} else {
- http->callback(http->userdata, AKI_HTTP_ERROR, NULL, http->response_code);
+ http->callback(http->userdata, NNWT_HTTP_ERROR, NULL, http->status_code);
}
+
return;
+ }
case CURLMSG_LAST:
al_log_debug("http", "Unhandled CURLMSG_LAST.");
break;
@@ -65,34 +75,34 @@ static void http_handle_events(void *userdata, struct aki_curl *curl)
}
}
-bool aki_http_init(struct aki_http *http)
+bool nn_http_init(struct nn_http *http)
{
- http->headers = NULL;
- http->response_code = -1;
+ http->status_code = -1;
http->content_length = -1;
- return aki_curl_init(&http->curl);
+ http->headers = NULL;
+ return nn_curl_init(&http->curl);
}
-void aki_http_set_url(struct aki_http *http, str *url)
+void nn_http_set_url(struct nn_http *http, str *url)
{
- aki_curl_set_url(&http->curl, url);
+ nn_curl_set_url(&http->curl, url);
}
-void aki_http_set_user_agent(struct aki_http *http, str *user_agent)
+void nn_http_set_user_agent(struct nn_http *http, str *user_agent)
{
char *c_str = al_str_to_c_str(user_agent);
curl_easy_setopt(http->curl.handle, CURLOPT_USERAGENT, c_str);
al_free(c_str);
}
-void aki_http_add_header(struct aki_http *http, str *header)
+void nn_http_add_header(struct nn_http *http, str *header)
{
char *c_str = al_str_to_c_str(header);
http->headers = curl_slist_append(http->headers, c_str);
al_free(c_str);
}
-void aki_http_set_range(struct aki_http *http, size_t start, size_t end)
+void nn_http_set_range(struct nn_http *http, size_t start, size_t end)
{
char range[44];
if (start == 0u) al_snprintf(range, sizeof(range), "-%zu", end);
@@ -101,128 +111,132 @@ void aki_http_set_range(struct aki_http *http, size_t start, size_t end)
curl_easy_setopt(http->curl.handle, CURLOPT_RANGE, range);
}
-void aki_http_close(struct aki_http *http)
+void nn_http_close(struct nn_http *http)
{
- aki_curl_close(&http->curl);
+ nn_curl_close(&http->curl);
}
static size_t stream_write_callback(char *buffer, size_t size, size_t nmemb, void *userdata)
{
- struct aki_http *http = (struct aki_http *)userdata;
+ struct nn_http *http = (struct nn_http *)userdata;
check_status_codes(&http->curl);
- return http->callback(http->userdata, AKI_HTTP_WRITE, (u8 *)buffer, size * nmemb);
+ return http->callback(http->userdata, NNWT_HTTP_WRITE, (u8 *)buffer, size * nmemb);
}
static size_t stream_read_callback(char *buffer, size_t size, size_t nmemb, void *userdata)
{
- struct aki_http *http = (struct aki_http *)userdata;
- return http->callback(http->userdata, AKI_HTTP_READ, (u8 *)buffer, size * nmemb);
+ struct nn_http *http = (struct nn_http *)userdata;
+ return http->callback(http->userdata, NNWT_HTTP_READ, (u8 *)buffer, size * nmemb);
}
static size_t request_callback(void *userdata, u8 op, u8 *buf, s64 int0)
{
- struct aki_http_request *request = (struct aki_http_request *)userdata;
+ struct nn_http_request *request = (struct nn_http_request *)userdata;
switch (op) {
- case AKI_HTTP_FINISHED: {
- request->callback(request->userdata, request, true);
+ case NNWT_HTTP_READ: {
+ al_assert(request->pointer >= 0);
+
+ size_t size = nn_buffer_get_size(&request->payload);
+ if (request->pointer + int0 > (off_t)size)
+ int0 = size - request->pointer;
+
+ nn_buffer_read(&request->payload, buf, request->pointer, int0);
+ request->pointer += int0;
+
break;
}
- case AKI_HTTP_ERROR: {
- request->callback(request->userdata, request, false);
+ case NNWT_HTTP_WRITE:
+ nn_buffer_append(&request->response, buf, int0);
break;
- }
- case AKI_HTTP_RESPONSE_CODE: {
+ case NNWT_HTTP_RESPONSE_CODE:
break;
- }
- case AKI_HTTP_CONTENT_LENGTH: {
- aki_buffer_ensure_space(&request->response, int0);
+ case NNWT_HTTP_CONTENT_LENGTH:
+ nn_buffer_ensure_space(&request->response, int0);
break;
- }
- case AKI_HTTP_WRITE: {
- aki_buffer_append(&request->response, buf, int0);
+ case NNWT_HTTP_REDIRECT:
break;
- }
- case AKI_HTTP_READ: {
- al_assert(request->pointer >= 0);
- size_t size = aki_buffer_get_size(&request->payload);
- if (request->pointer + int0 > (off_t)size) {
- int0 = size - request->pointer;
- }
- aki_buffer_read(&request->payload, buf, request->pointer, int0);
- request->pointer += int0;
+ case NNWT_HTTP_FINISHED:
+ request->callback(request->userdata, request, true);
+ break;
+ case NNWT_HTTP_ERROR:
+ request->callback(request->userdata, request, false);
break;
- }
}
return int0;
}
-static bool init_request_internal(struct aki_http *http, u8 method)
+static bool init_request_internal(struct nn_http *http, u8 method)
{
- struct aki_curl *curl = &http->curl;
+ struct nn_curl *curl = &http->curl;
+
switch (method) {
- case AKI_HTTP_HEAD:
+ case NNWT_HTTP_HEAD:
curl_easy_setopt(curl->handle, CURLOPT_NOBODY, 1L);
break;
- case AKI_HTTP_GET:
+ case NNWT_HTTP_GET:
curl_easy_setopt(curl->handle, CURLOPT_HTTPGET, 1L);
break;
- case AKI_HTTP_POST:
+ case NNWT_HTTP_POST:
curl_easy_setopt(curl->handle, CURLOPT_POST, 1L);
break;
}
+
curl_easy_setopt(curl->handle, CURLOPT_WRITEFUNCTION, stream_write_callback);
curl_easy_setopt(curl->handle, CURLOPT_WRITEDATA, http);
curl_easy_setopt(curl->handle, CURLOPT_READFUNCTION, stream_read_callback);
curl_easy_setopt(curl->handle, CURLOPT_READDATA, http);
- if (http->headers) {
+
+ if (http->headers)
curl_easy_setopt(curl->handle, CURLOPT_HTTPHEADER, http->headers);
- }
+
curl->handle_events = http_handle_events;
- return aki_curl_add_handle(curl);
+
+ return nn_curl_add_handle(curl);
}
-bool aki_http_request_stream(struct aki_http *http, u8 method, struct aki_event_loop *loop,
+bool nn_http_request_stream(struct nn_http *http, u8 method, struct nn_event_loop *loop,
size_t (*callback)(void *, u8, u8 *, s64), void *userdata)
{
- struct aki_curl *curl = &http->curl;
+ struct nn_curl *curl = &http->curl;
al_assert(curl->loop == NULL);
- al_assert(method != AKI_HTTP_POST); // Not implemented.
+ al_assert(method != NNWT_HTTP_POST); // Not implemented.
curl->loop = loop;
http->callback = callback;
http->userdata = userdata;
return init_request_internal(http, method);
}
-bool aki_http_request_init(struct aki_http_request *request)
+bool nn_http_request_init(struct nn_http_request *request)
{
request->pointer = 0;
- aki_buffer_init(&request->payload);
- aki_buffer_init(&request->response);
- return aki_http_init(&request->http);
+ nn_buffer_init(&request->payload);
+ nn_buffer_init(&request->response);
+ return nn_http_init(&request->http);
}
-bool aki_http_request(struct aki_http_request *request, u8 method, struct aki_event_loop *loop,
- void (*callback)(void *, struct aki_http_request *, bool), void *userdata)
+bool nn_http_request(struct nn_http_request *request, u8 method, struct nn_event_loop *loop,
+ void (*callback)(void *, struct nn_http_request *, bool), void *userdata)
{
- struct aki_curl *curl = &request->http.curl;
+ struct nn_curl *curl = &request->http.curl;
al_assert(curl->loop == NULL);
curl->loop = loop;
+
request->http.callback = request_callback;
request->http.userdata = request;
- size_t payload = aki_buffer_get_size(&request->payload);
- if (payload > 0) {
+
+ size_t payload = nn_buffer_get_size(&request->payload);
+ if (payload > 0)
curl_easy_setopt(curl->handle, CURLOPT_POSTFIELDSIZE, (s64)payload);
- } else {
- al_assert(method != AKI_HTTP_POST);
- }
+
request->callback = callback;
request->userdata = userdata;
+
return init_request_internal(&request->http, method);
}
-void aki_http_request_close(struct aki_http_request *request)
+void nn_http_request_close(struct nn_http_request *request)
{
- aki_buffer_free(&request->payload);
- aki_buffer_free(&request->response);
- aki_http_close(&request->http);
+ nn_buffer_free(&request->payload);
+ nn_buffer_free(&request->response);
+ nn_http_close(&request->http);
}
diff --git a/src/curl/http.h b/src/curl/http.h
index 3d0b796..d5efcf9 100644
--- a/src/curl/http.h
+++ b/src/curl/http.h
@@ -9,48 +9,48 @@
#include "curl.h"
enum {
- AKI_HTTP_HEAD = 0,
- AKI_HTTP_GET,
- AKI_HTTP_POST
+ NNWT_HTTP_HEAD = 0,
+ NNWT_HTTP_GET,
+ NNWT_HTTP_POST
};
enum {
- AKI_HTTP_WRITE = 0,
- AKI_HTTP_READ,
- AKI_HTTP_RESPONSE_CODE,
- AKI_HTTP_CONTENT_LENGTH,
- AKI_HTTP_FINISHED,
- AKI_HTTP_REDIRECT,
- AKI_HTTP_ERROR
+ NNWT_HTTP_READ = 0,
+ NNWT_HTTP_WRITE,
+ NNWT_HTTP_RESPONSE_CODE,
+ NNWT_HTTP_CONTENT_LENGTH,
+ NNWT_HTTP_REDIRECT,
+ NNWT_HTTP_FINISHED,
+ NNWT_HTTP_ERROR
};
-struct aki_http {
- struct aki_curl curl;
- s64 response_code;
+struct nn_http {
+ struct nn_curl curl;
+ s64 status_code;
curl_off_t content_length;
struct curl_slist *headers;
size_t (*callback)(void *, u8, u8 *, s64);
void *userdata;
};
-struct aki_http_request {
- struct aki_http http;
+struct nn_http_request {
+ struct nn_http http;
off_t pointer;
- struct aki_buffer payload;
- struct aki_buffer response;
- void (*callback)(void *, struct aki_http_request *, bool);
+ struct nn_buffer payload;
+ struct nn_buffer response;
+ void (*callback)(void *, struct nn_http_request *, bool);
void *userdata;
};
-bool aki_http_init(struct aki_http *http);
-void aki_http_set_url(struct aki_http *http, str *url);
-void aki_http_set_user_agent(struct aki_http *http, str *user_agent);
-void aki_http_add_header(struct aki_http *http, str *header);
-void aki_http_set_range(struct aki_http *http, size_t start, size_t end);
-void aki_http_close(struct aki_http *http);
-bool aki_http_request_stream(struct aki_http *http, u8 method, struct aki_event_loop *loop,
+bool nn_http_init(struct nn_http *http);
+void nn_http_set_url(struct nn_http *http, str *url);
+void nn_http_set_user_agent(struct nn_http *http, str *user_agent);
+void nn_http_add_header(struct nn_http *http, str *header);
+void nn_http_set_range(struct nn_http *http, size_t start, size_t end);
+void nn_http_close(struct nn_http *http);
+bool nn_http_request_stream(struct nn_http *http, u8 method, struct nn_event_loop *loop,
size_t (*callback)(void *, u8, u8 *, s64), void *userdata);
-bool aki_http_request_init(struct aki_http_request *request);
-bool aki_http_request(struct aki_http_request *request, u8 method, struct aki_event_loop *loop,
- void (*callback)(void *, struct aki_http_request *, bool), void *userdata);
-void aki_http_request_close(struct aki_http_request *request);
+bool nn_http_request_init(struct nn_http_request *request);
+bool nn_http_request(struct nn_http_request *request, u8 method, struct nn_event_loop *loop,
+ void (*callback)(void *, struct nn_http_request *, bool), void *userdata);
+void nn_http_request_close(struct nn_http_request *request);
diff --git a/src/curl/websocket.c b/src/curl/websocket.c
index 8016981..25c9996 100644
--- a/src/curl/websocket.c
+++ b/src/curl/websocket.c
@@ -1,19 +1,20 @@
#include <al/log.h>
-#include <aki/socket.h>
+
+#include "../socket/socket.h"
#include "websocket.h"
-static void websocket_handle_events(void *userdata, struct aki_curl *curl)
+static void websocket_handle_events(void *userdata, struct nn_curl *curl)
{
- struct aki_websocket *ws = (struct aki_websocket *)userdata;
+ struct nn_websocket *ws = (struct nn_websocket *)userdata;
s32 pending;
CURLMsg *msg;
while ((msg = curl_multi_info_read(curl->multi_handle, &pending))) {
switch (msg->msg) {
case CURLMSG_DONE:
- aki_curl_remove_handle(curl);
- aki_curl_close(curl);
- aki_buffer_free(&ws->frame);
+ nn_curl_remove_handle(curl);
+ nn_curl_close(curl);
+ nn_buffer_free(&ws->frame);
ws->callback(ws->userdata, NULL, NULL, 0);
return;
case CURLMSG_LAST:
@@ -28,52 +29,61 @@ static size_t stream_write_callback(char *buffer, size_t size, size_t nmemb, voi
{
(void)size;
(void)nmemb;
- struct aki_websocket *ws = (struct aki_websocket *)userdata;
+ struct nn_websocket *ws = (struct nn_websocket *)userdata;
+
const struct curl_ws_frame *m = curl_ws_meta(ws->curl.handle);
size_t frame_size = m->offset + m->len + m->bytesleft;
al_log_debug("ws", "frame_size: %zu, bytesleft: %zu.", frame_size, m->bytesleft);
- aki_buffer_ensure_space(&ws->frame, frame_size);
- al_memcpy(aki_buffer_get_ptr(&ws->frame, m->offset), buffer, m->len);
- if (m->bytesleft == 0) {
- ws->callback(ws->userdata, m, aki_buffer_get_ptr(&ws->frame, 0), frame_size);
- }
+
+ nn_buffer_ensure_space(&ws->frame, frame_size);
+ al_memcpy(nn_buffer_get_ptr(&ws->frame, m->offset), buffer, m->len);
+
+ if (m->bytesleft == 0)
+ ws->callback(ws->userdata, m, nn_buffer_get_ptr(&ws->frame, 0), frame_size);
+
return m->len;
}
-bool aki_websocket_init(struct aki_websocket *ws)
+bool nn_websocket_init(struct nn_websocket *ws)
{
- aki_buffer_init(&ws->frame);
- return aki_curl_init(&ws->curl);
+ nn_buffer_init(&ws->frame);
+ return nn_curl_init(&ws->curl);
}
-void aki_websocket_set_url(struct aki_websocket *ws, str *url)
+void nn_websocket_set_url(struct nn_websocket *ws, str *url)
{
- aki_curl_set_url(&ws->curl, url);
+ nn_curl_set_url(&ws->curl, url);
}
-bool aki_websocket_connect(struct aki_websocket *ws, struct aki_event_loop *loop,
+bool nn_websocket_connect(struct nn_websocket *ws, struct nn_event_loop *loop,
void (*callback)(void *, const struct curl_ws_frame *, u8 *, size_t), void *userdata)
{
- curl_easy_setopt(ws->curl.handle, CURLOPT_CONNECT_ONLY, 0L);
- ws->curl.loop = loop;
+ struct nn_curl *curl = &ws->curl;
+ al_assert(curl->loop == NULL);
+ curl->loop = loop;
+
+ curl_easy_setopt(curl->handle, CURLOPT_CONNECT_ONLY, 0L);
ws->callback = callback;
ws->userdata = userdata;
- curl_easy_setopt(ws->curl.handle, CURLOPT_WRITEFUNCTION, stream_write_callback);
- curl_easy_setopt(ws->curl.handle, CURLOPT_WRITEDATA, ws);
- ws->curl.handle_events = websocket_handle_events;
- ws->curl.userdata = ws;
- return aki_curl_add_handle(&ws->curl);
+
+ curl_easy_setopt(curl->handle, CURLOPT_WRITEFUNCTION, stream_write_callback);
+ curl_easy_setopt(curl->handle, CURLOPT_WRITEDATA, ws);
+
+ curl->handle_events = websocket_handle_events;
+ curl->userdata = ws;
+
+ return nn_curl_add_handle(&ws->curl);
}
-void aki_websocket_disconnect(struct aki_websocket *ws, u16 status)
+void nn_websocket_disconnect(struct nn_websocket *ws, u16 status)
{
size_t sent;
- status = aki_htons(status);
+ status = nn_htons(status);
curl_ws_send(ws->curl.handle, &status, sizeof(u16), &sent, 0, CURLWS_CLOSE);
al_assert(sent == sizeof(u16));
}
-bool aki_websocket_send_frame(struct aki_websocket *ws, u8 *data, size_t size)
+bool nn_websocket_send_frame(struct nn_websocket *ws, u8 *data, size_t size)
{
size_t sent;
CURLcode code = curl_ws_send(ws->curl.handle, data, size, &sent, 0, CURLWS_TEXT);
diff --git a/src/curl/websocket.h b/src/curl/websocket.h
index 276f6bc..5eee73f 100644
--- a/src/curl/websocket.h
+++ b/src/curl/websocket.h
@@ -4,16 +4,16 @@
#include "curl.h"
-struct aki_websocket {
- struct aki_curl curl;
- struct aki_buffer frame;
+struct nn_websocket {
+ struct nn_curl curl;
+ struct nn_buffer frame;
void (*callback)(void *, const struct curl_ws_frame *, u8 *, size_t);
void *userdata;
};
-bool aki_websocket_init(struct aki_websocket *ws);
-void aki_websocket_set_url(struct aki_websocket *ws, str *url);
-bool aki_websocket_connect(struct aki_websocket *ws, struct aki_event_loop *loop,
+bool nn_websocket_init(struct nn_websocket *ws);
+void nn_websocket_set_url(struct nn_websocket *ws, str *url);
+bool nn_websocket_connect(struct nn_websocket *ws, struct nn_event_loop *loop,
void (*callback)(void *, const struct curl_ws_frame *, u8 *, size_t), void *userdata);
-void aki_websocket_disconnect(struct aki_websocket *ws, u16 status);
-bool aki_websocket_send_frame(struct aki_websocket *ws, u8 *data, size_t size);
+void nn_websocket_disconnect(struct nn_websocket *ws, u16 status);
+bool nn_websocket_send_frame(struct nn_websocket *ws, u8 *data, size_t size);