aboutsummaryrefslogtreecommitdiff
path: root/src/supplemental/websocket/websocket.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/supplemental/websocket/websocket.c')
-rw-r--r--src/supplemental/websocket/websocket.c68
1 files changed, 39 insertions, 29 deletions
diff --git a/src/supplemental/websocket/websocket.c b/src/supplemental/websocket/websocket.c
index 514cf22d..df404b81 100644
--- a/src/supplemental/websocket/websocket.c
+++ b/src/supplemental/websocket/websocket.c
@@ -69,8 +69,7 @@ struct nni_ws_listener {
nni_url * url;
bool started;
bool closed;
- void * hp; // handler pointer
- nni_http_handler handler;
+ nni_http_handler * handler;
nni_ws_listen_hook hookfn;
void * hookarg;
nni_list headers; // response headers
@@ -1333,6 +1332,9 @@ nni_ws_listener_fini(nni_ws_listener *l)
}
nni_mtx_unlock(&l->mtx);
+ if (l->handler != NULL) {
+ nni_http_handler_fini(l->handler);
+ }
if (l->server != NULL) {
nni_http_server_fini(l->server);
l->server = NULL;
@@ -1356,20 +1358,28 @@ nni_ws_listener_fini(nni_ws_listener *l)
static void
ws_handler(nni_aio *aio)
{
- nni_ws_listener *l;
- nni_ws * ws;
- nni_http * http;
- nni_http_req * req;
- nni_http_res * res;
- const char * ptr;
- const char * proto;
- uint16_t status;
- int rv;
- char key[29];
-
- http = nni_aio_get_input(aio, 0);
- req = nni_aio_get_input(aio, 1);
- l = nni_aio_get_input(aio, 2);
+ nni_ws_listener * l;
+ nni_ws * ws;
+ nni_http * http;
+ nni_http_req * req;
+ nni_http_res * res;
+ nni_http_handler *h;
+ nni_http_ctx * ctx;
+ const char * ptr;
+ const char * proto;
+ uint16_t status;
+ int rv;
+ char key[29];
+
+ req = nni_aio_get_input(aio, 0);
+ h = nni_aio_get_input(aio, 1);
+ ctx = nni_aio_get_input(aio, 2);
+ l = nni_http_handler_get_data(h, 0);
+
+ if ((rv = nni_http_ctx_stream(ctx, &http)) != 0) {
+ nni_aio_finish_error(aio, rv);
+ return;
+ }
// Now check the headers, etc.
if (strcmp(nni_http_req_get_version(req), "HTTP/1.1") != 0) {
@@ -1497,8 +1507,8 @@ ws_handler(nni_aio *aio)
nni_list_append(&l->reply, ws);
nni_aio_set_data(ws->httpaio, 0, l);
nni_http_write_res(http, res, ws->httpaio);
+ (void) nni_http_hijack(ctx);
nni_aio_set_output(aio, 0, NULL);
- nni_aio_set_input(aio, 1, NULL);
nni_aio_finish(aio, 0, 0);
return;
@@ -1535,7 +1545,7 @@ nni_ws_listener_init(nni_ws_listener **wslp, const char *addr)
}
host = l->url->u_hostname;
- if ((strlen(host) == 0) || (strcmp(host, "*") == 0)) {
+ if (strlen(host) == 0) {
host = NULL;
}
serv = l->url->u_port;
@@ -1543,14 +1553,15 @@ nni_ws_listener_init(nni_ws_listener **wslp, const char *addr)
serv = (strcmp(l->url->u_scheme, "wss") == 0) ? "443" : "80";
}
- l->handler.h_is_dir = false;
- l->handler.h_is_upgrader = true;
- l->handler.h_method = "GET";
- l->handler.h_path = l->url->u_path;
- l->handler.h_host = host; // ignore the port
- l->handler.h_cb = ws_handler;
+ rv = nni_http_handler_init(&l->handler, l->url->u_path, ws_handler);
+ if (rv != 0) {
+ nni_ws_listener_fini(l);
+ return (rv);
+ }
- if ((rv = nni_http_server_init(&l->server, addr)) != 0) {
+ if (((rv = nni_http_handler_set_host(l->handler, host)) != 0) ||
+ ((rv = nni_http_handler_set_data(l->handler, l, 0)) != 0) ||
+ ((rv = nni_http_server_init(&l->server, addr)) != 0)) {
nni_ws_listener_fini(l);
return (rv);
}
@@ -1632,7 +1643,7 @@ nni_ws_listener_close(nni_ws_listener *l)
}
l->closed = true;
if (l->started) {
- nni_http_server_del_handler(l->server, l->hp);
+ nni_http_server_del_handler(l->server, l->handler);
nni_http_server_stop(l->server);
l->started = false;
}
@@ -1660,8 +1671,7 @@ nni_ws_listener_listen(nni_ws_listener *l)
return (NNG_ESTATE);
}
- rv = nni_http_server_add_handler(&l->hp, l->server, &l->handler, l);
- if (rv != 0) {
+ if ((rv = nni_http_server_add_handler(l->server, l->handler)) != 0) {
nni_http_server_fini(l->server);
l->server = NULL;
nni_mtx_unlock(&l->mtx);
@@ -1669,7 +1679,7 @@ nni_ws_listener_listen(nni_ws_listener *l)
}
if ((rv = nni_http_server_start(l->server)) != 0) {
- nni_http_server_del_handler(l->server, l->hp);
+ nni_http_server_del_handler(l->server, l->handler);
nni_http_server_fini(l->server);
l->server = NULL;
nni_mtx_unlock(&l->mtx);