diff options
| author | Garrett D'Amore <garrett@damore.org> | 2019-03-12 23:53:50 -0700 |
|---|---|---|
| committer | Garrett D'Amore <garrett@damore.org> | 2019-03-13 00:11:50 -0700 |
| commit | f65f819f7fb3bbe9e24bc73342b4f335f5034fe0 (patch) | |
| tree | 7d757b3904719951c16ea66b8094ef744bc0b875 /src/supplemental | |
| parent | fff28350a84ed60df173ba73f1035db4f7b383bd (diff) | |
| download | nng-f65f819f7fb3bbe9e24bc73342b4f335f5034fe0.tar.gz nng-f65f819f7fb3bbe9e24bc73342b4f335f5034fe0.tar.bz2 nng-f65f819f7fb3bbe9e24bc73342b4f335f5034fe0.zip | |
fixes #907 WebSocket ephemeral port cannot be reused
Diffstat (limited to 'src/supplemental')
| -rw-r--r-- | src/supplemental/http/http_server.c | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/src/supplemental/http/http_server.c b/src/supplemental/http/http_server.c index 624ba1e4..b927d8f3 100644 --- a/src/supplemental/http/http_server.c +++ b/src/supplemental/http/http_server.c @@ -13,6 +13,7 @@ #include <ctype.h> #include <stdbool.h> #include <stdio.h> +#include <stdlib.h> #include <string.h> #include "core/nng_impl.h" @@ -79,7 +80,7 @@ struct nng_http_server { bool closed; nni_aio * accaio; nng_stream_listener *listener; - char * port; + int port; // native order char * hostname; nni_list errors; nni_mtx errors_mtx; @@ -830,7 +831,6 @@ http_server_fini(nni_http_server *s) nni_aio_fini(s->accaio); nni_mtx_fini(&s->mtx); nni_strfree(s->hostname); - nni_strfree(s->port); NNI_FREE_STRUCT(s); } @@ -869,10 +869,10 @@ http_server_init(nni_http_server **serverp, const nni_url *url) return (rv); } - if ((s->port = nni_strdup(url->u_port)) == NULL) { - http_server_fini(s); - return (NNG_ENOMEM); - } + // NB: We only support number port numbers, and the URL framework + // expands empty port numbers to 80 or 443 as appropriate. + s->port = atoi(url->u_port); + if ((s->hostname = nni_strdup(url->u_hostname)) == NULL) { http_server_fini(s); return (NNG_ENOMEM); @@ -898,7 +898,7 @@ nni_http_server_init(nni_http_server **serverp, const nni_url *url) nni_mtx_lock(&http_servers_lk); NNI_LIST_FOREACH (&http_servers, s) { - if ((!s->closed) && (strcmp(url->u_port, s->port) == 0) && + if ((!s->closed) && (atoi(url->u_port) == s->port) && (strcmp(url->u_hostname, s->hostname) == 0)) { *serverp = s; s->refcnt++; @@ -924,6 +924,10 @@ http_server_start(nni_http_server *s) if ((rv = nng_stream_listener_listen(s->listener)) != 0) { return (rv); } + if (s->port == 0) { + nng_stream_listener_get_int( + s->listener, NNG_OPT_TCP_BOUND_PORT, &s->port); + } nng_stream_listener_accept(s->listener, s->accaio); return (0); } |
