diff options
| author | Garrett D'Amore <garrett@damore.org> | 2018-01-03 10:26:11 -0800 |
|---|---|---|
| committer | Garrett D'Amore <garrett@damore.org> | 2018-01-03 10:26:11 -0800 |
| commit | 303f84fbbfc4ee04b9f62e12bb2c1106834a2371 (patch) | |
| tree | e9161c05125372bf01cfa2927c3b57561caf800f /src/supplemental/http | |
| parent | a14e5369efe66f4955e1378087d889b59448cde1 (diff) | |
| download | nng-303f84fbbfc4ee04b9f62e12bb2c1106834a2371.tar.gz nng-303f84fbbfc4ee04b9f62e12bb2c1106834a2371.tar.bz2 nng-303f84fbbfc4ee04b9f62e12bb2c1106834a2371.zip | |
Fix websocket hang after sending one message.
This fixes a problem where the websocket would only send one message,
then no others, due to not clearing the "frame" busy flag on completion
of the frame transmit.
We have also added a test that tries to send 10 messages back and
forth to make sure that we catch this kind of problem in the future.
Finally we've fixed some problems that were found when testing edge
cases around the protocol, which were responsible for invalid memory
accesses.
Diffstat (limited to 'src/supplemental/http')
| -rw-r--r-- | src/supplemental/http/http_msg.c | 41 | ||||
| -rw-r--r-- | src/supplemental/http/server.c | 9 |
2 files changed, 28 insertions, 22 deletions
diff --git a/src/supplemental/http/http_msg.c b/src/supplemental/http/http_msg.c index ff931240..da8c70f3 100644 --- a/src/supplemental/http/http_msg.c +++ b/src/supplemental/http/http_msg.c @@ -1,6 +1,6 @@ // -// Copyright 2017 Staysail Systems, Inc. <info@staysail.tech> -// Copyright 2017 Capitar IT Group BV <info@capitar.com> +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> // // This software is supplied under the terms of the MIT License, a // copy of which should be located in the distribution where this @@ -614,25 +614,25 @@ nni_http_res_init(nni_http_res **resp) const char * nni_http_req_get_method(nni_http_req *req) { - return (req->meth); + return (req->meth != NULL ? req->meth : ""); } const char * nni_http_req_get_uri(nni_http_req *req) { - return (req->uri); + return (req->uri != NULL ? req->uri : ""); } const char * nni_http_req_get_version(nni_http_req *req) { - return (req->vers); + return (req->vers != NULL ? req->vers : ""); } const char * nni_http_res_get_version(nni_http_res *res) { - return (res->vers); + return (res->vers != NULL ? res->vers : ""); } int @@ -678,7 +678,7 @@ nni_http_res_get_status(nni_http_res *res) const char * nni_http_res_get_reason(nni_http_res *res) { - return (res->rsn); + return (res->rsn != NULL ? res->rsn : ""); } static int @@ -864,10 +864,11 @@ nni_http_res_init_error(nni_http_res **resp, uint16_t err) char * rsn; char rsnbuf[80]; char html[1024]; + int rv; nni_http_res *res; - if ((nni_http_res_init(&res)) != 0) { - return (NNG_ENOMEM); + if ((rv = nni_http_res_init(&res)) != 0) { + return (rv); } // Note that it is expected that redirect URIs will update the @@ -957,7 +958,7 @@ nni_http_res_init_error(nni_http_res **resp, uint16_t err) } // very simple builtin error page - snprintf(html, sizeof(html), + (void) snprintf(html, sizeof(html), "<head><title>%d %s</title></head>" "<body><p/><h1 align=\"center\">" "<span style=\"font-size: 36px; border-radius: 5px; " @@ -968,14 +969,14 @@ nni_http_res_init_error(nni_http_res **resp, uint16_t err) "%s</span></p></body>", err, rsn, err, rsn); - nni_http_res_set_status(res, err, rsn); - nni_http_res_copy_data(res, html, strlen(html)); - nni_http_res_set_version(res, "HTTP/1.1"); - nni_http_res_set_header( - res, "Content-Type", "text/html; charset=UTF-8"); - // We could set the date, but we don't necessarily have a portable - // way to get the time of day. - - *resp = res; - return (0); + if (((rv = nni_http_res_set_status(res, err, rsn)) != 0) || + ((rv = nni_http_res_set_version(res, "HTTP/1.1")) != 0) || + ((rv = nni_http_res_set_header( + res, "Content-Type", "text/html; charset=UTF-8")) != 0) || + ((rv = nni_http_res_copy_data(res, html, strlen(html))) != 0)) { + nni_http_res_fini(res); + } else { + *resp = res; + } + return (rv); } diff --git a/src/supplemental/http/server.c b/src/supplemental/http/server.c index 64ed9e11..cce73765 100644 --- a/src/supplemental/http/server.c +++ b/src/supplemental/http/server.c @@ -1,6 +1,6 @@ // -// Copyright 2017 Staysail Systems, Inc. <info@staysail.tech> -// Copyright 2017 Capitar IT Group BV <info@capitar.com> +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> // // This software is supplied under the terms of the MIT License, a // copy of which should be located in the distribution where this @@ -298,6 +298,11 @@ http_sconn_error(http_sconn *sc, uint16_t err) return; } + if (sc->close) { + if (nni_http_res_set_header(res, "Connection", "close") != 0) { + http_sconn_close(sc); + } + } sc->res = res; nni_http_write_res(sc->http, res, sc->txaio); } |
