diff options
| author | Garrett D'Amore <garrett@damore.org> | 2018-01-19 17:13:40 -0800 |
|---|---|---|
| committer | Garrett D'Amore <garrett@damore.org> | 2018-01-20 15:03:12 -0800 |
| commit | 7dbc9ae4fef34c6fd836b939bd559e54b8008b72 (patch) | |
| tree | 54660fef8a4a597c067a18953a295f1cfdb96cf0 /src/supplemental/websocket | |
| parent | 338706c2420ce3e51b546a6ba2574e10346a511b (diff) | |
| download | nng-7dbc9ae4fef34c6fd836b939bd559e54b8008b72.tar.gz nng-7dbc9ae4fef34c6fd836b939bd559e54b8008b72.tar.bz2 nng-7dbc9ae4fef34c6fd836b939bd559e54b8008b72.zip | |
fixes #216 HTTP server side API refactoring, directory serving support
This changes the backend (internal) HTTP API to provide a much more
sensible handler scheme, where the handlers are opaque objects and we
can allocate a handler for different types of tasks.
We've also added support serving up directories of static content, and
added code to validate that the directory serving is working as intended.
This is a key enabling step towards the public API.
Diffstat (limited to 'src/supplemental/websocket')
| -rw-r--r-- | src/supplemental/websocket/websocket.c | 68 |
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); |
