diff options
| author | Garrett D'Amore <garrett@damore.org> | 2017-12-26 16:18:38 -0800 |
|---|---|---|
| committer | Garrett D'Amore <garrett@damore.org> | 2017-12-26 16:37:41 -0800 |
| commit | eb1f8db4ed87867f0f08afba79253e3981db9c88 (patch) | |
| tree | aa85c54c5c53ab62cc269e83c04e106637d49473 /src | |
| parent | 93db6fe3aaff421d61a15993ba6827b742ab00d1 (diff) | |
| download | nng-eb1f8db4ed87867f0f08afba79253e3981db9c88.tar.gz nng-eb1f8db4ed87867f0f08afba79253e3981db9c88.tar.bz2 nng-eb1f8db4ed87867f0f08afba79253e3981db9c88.zip | |
fixes #165 Add address properties for websocket pipes
Diffstat (limited to 'src')
| -rw-r--r-- | src/supplemental/http/client.c | 12 | ||||
| -rw-r--r-- | src/supplemental/http/http.c | 36 | ||||
| -rw-r--r-- | src/supplemental/http/http.h | 4 | ||||
| -rw-r--r-- | src/supplemental/http/server.c | 2 | ||||
| -rw-r--r-- | src/supplemental/websocket/websocket.c | 20 | ||||
| -rw-r--r-- | src/supplemental/websocket/websocket.h | 2 | ||||
| -rw-r--r-- | src/transport/ws/websocket.c | 32 |
7 files changed, 95 insertions, 13 deletions
diff --git a/src/supplemental/http/client.c b/src/supplemental/http/client.c index 374ab5bb..8c082a17 100644 --- a/src/supplemental/http/client.c +++ b/src/supplemental/http/client.c @@ -60,11 +60,13 @@ http_conn_done(void *arg) return; } - t.h_data = p; - t.h_write = (void *) nni_plat_tcp_pipe_send; - t.h_read = (void *) nni_plat_tcp_pipe_recv; - t.h_close = (void *) nni_plat_tcp_pipe_close; - t.h_fini = (void *) nni_plat_tcp_pipe_fini; + t.h_data = p; + t.h_write = (void *) nni_plat_tcp_pipe_send; + t.h_read = (void *) nni_plat_tcp_pipe_recv; + t.h_close = (void *) nni_plat_tcp_pipe_close; + t.h_sock_addr = (void *) nni_plat_tcp_pipe_sockname; + t.h_peer_addr = (void *) nni_plat_tcp_pipe_peername; + t.h_fini = (void *) nni_plat_tcp_pipe_fini; if ((rv = nni_http_init(&http, &t)) != 0) { nni_aio_finish_error(aio, rv); diff --git a/src/supplemental/http/http.c b/src/supplemental/http/http.c index 3958a738..08a8eb13 100644 --- a/src/supplemental/http/http.c +++ b/src/supplemental/http/http.c @@ -42,6 +42,8 @@ struct nni_http { void *sock; void (*rd)(void *, nni_aio *); void (*wr)(void *, nni_aio *); + int (*sock_addr)(void *, nni_sockaddr *); + int (*peer_addr)(void *, nni_sockaddr *); void (*close)(void *); void (*fini)(void *); @@ -549,6 +551,26 @@ nni_http_write_full(nni_http *http, nni_aio *aio) nni_mtx_unlock(&http->mtx); } +int +nni_http_sock_addr(nni_http *http, nni_sockaddr *sa) +{ + int rv; + nni_mtx_lock(&http->mtx); + rv = http->closed ? NNG_ECLOSED : http->sock_addr(http->sock, sa); + nni_mtx_unlock(&http->mtx); + return (rv); +} + +int +nni_http_peer_addr(nni_http *http, nni_sockaddr *sa) +{ + int rv; + nni_mtx_lock(&http->mtx); + rv = http->closed ? NNG_ECLOSED : http->peer_addr(http->sock, sa); + nni_mtx_unlock(&http->mtx); + return (rv); +} + void nni_http_fini(nni_http *http) { @@ -591,12 +613,14 @@ nni_http_init(nni_http **httpp, nni_http_tran *tran) nni_http_fini(http); return (rv); } - http->rd_bufsz = HTTP_BUFSIZE; - http->rd = tran->h_read; - http->wr = tran->h_write; - http->close = tran->h_close; - http->fini = tran->h_fini; - http->sock = tran->h_data; + http->rd_bufsz = HTTP_BUFSIZE; + http->rd = tran->h_read; + http->wr = tran->h_write; + http->close = tran->h_close; + http->fini = tran->h_fini; + http->sock = tran->h_data; + http->sock_addr = tran->h_sock_addr; + http->peer_addr = tran->h_peer_addr; *httpp = http; diff --git a/src/supplemental/http/http.h b/src/supplemental/http/http.h index 09c72f8a..b28845ec 100644 --- a/src/supplemental/http/http.h +++ b/src/supplemental/http/http.h @@ -22,6 +22,8 @@ typedef struct nni_http_tran { void *h_data; void (*h_read)(void *, nni_aio *); void (*h_write)(void *, nni_aio *); + int (*h_sock_addr)(void *, nni_sockaddr *); + int (*h_peer_addr)(void *, nni_sockaddr *); void (*h_close)(void *); void (*h_fini)(void *); } nni_http_tran; @@ -160,6 +162,8 @@ extern void nni_http_read(nni_http *, nni_aio *); extern void nni_http_read_full(nni_http *, nni_aio *); extern void nni_http_write(nni_http *, nni_aio *); extern void nni_http_write_full(nni_http *, nni_aio *); +extern int nni_http_sock_addr(nni_http *, nni_sockaddr *); +extern int nni_http_peer_addr(nni_http *, nni_sockaddr *); typedef struct nni_http_server nni_http_server; diff --git a/src/supplemental/http/server.c b/src/supplemental/http/server.c index 15b04f80..0a132975 100644 --- a/src/supplemental/http/server.c +++ b/src/supplemental/http/server.c @@ -506,6 +506,8 @@ http_sconn_init(http_sconn **scp, nni_plat_tcp_pipe *tcp) sc->tran.h_write = (void *) nni_plat_tcp_pipe_send; sc->tran.h_close = (void *) nni_plat_tcp_pipe_close; // close implied sc->tran.h_fini = (void *) nni_plat_tcp_pipe_fini; + sc->tran.h_sock_addr = (void *) nni_plat_tcp_pipe_sockname; + sc->tran.h_peer_addr = (void *) nni_plat_tcp_pipe_peername; if ((rv = nni_http_init(&sc->http, &sc->tran)) != 0) { http_sconn_close(sc); diff --git a/src/supplemental/websocket/websocket.c b/src/supplemental/websocket/websocket.c index fe0a9bd9..dfcac3e7 100644 --- a/src/supplemental/websocket/websocket.c +++ b/src/supplemental/websocket/websocket.c @@ -646,6 +646,26 @@ ws_send_control(nni_ws *ws, uint8_t op, uint8_t *buf, size_t len) nni_mtx_unlock(&ws->mtx); } +int +nni_ws_sock_addr(nni_ws *ws, nni_sockaddr *sa) +{ + int rv; + nni_mtx_lock(&ws->mtx); + rv = ws->closed ? NNG_ECLOSED : nni_http_sock_addr(ws->http, sa); + nni_mtx_unlock(&ws->mtx); + return (rv); +} + +int +nni_ws_peer_addr(nni_ws *ws, nni_sockaddr *sa) +{ + int rv; + nni_mtx_lock(&ws->mtx); + rv = ws->closed ? NNG_ECLOSED : nni_http_peer_addr(ws->http, sa); + nni_mtx_unlock(&ws->mtx); + return (rv); +} + void nni_ws_send_msg(nni_ws *ws, nni_aio *aio) { diff --git a/src/supplemental/websocket/websocket.h b/src/supplemental/websocket/websocket.h index 25add55e..3c3ce085 100644 --- a/src/supplemental/websocket/websocket.h +++ b/src/supplemental/websocket/websocket.h @@ -54,6 +54,8 @@ extern void nni_ws_send_msg(nni_ws *, nni_aio *); extern void nni_ws_recv_msg(nni_ws *, nni_aio *); extern nni_http_res *nni_ws_response(nni_ws *); extern nni_http_req *nni_ws_request(nni_ws *); +extern int nni_ws_sock_addr(nni_ws *, nni_sockaddr *); +extern int nni_ws_peer_addr(nni_ws *, nni_sockaddr *); extern void nni_ws_close(nni_ws *); extern void nni_ws_close_error(nni_ws *, uint16_t); extern void nni_ws_fini(nni_ws *); diff --git a/src/transport/ws/websocket.c b/src/transport/ws/websocket.c index 8a73bcfb..178338f9 100644 --- a/src/transport/ws/websocket.c +++ b/src/transport/ws/websocket.c @@ -319,13 +319,41 @@ ws_ep_getopt_recvmaxsz(void *arg, void *v, size_t *szp) return (nni_getopt_size(ep->rcvmax, v, szp)); } +static int +ws_pipe_getopt_locaddr(void *arg, void *v, size_t *szp) +{ + ws_pipe * p = arg; + int rv; + nng_sockaddr sa; + + memset(&sa, 0, sizeof(sa)); + if ((rv = nni_ws_sock_addr(p->ws, &sa)) == 0) { + rv = nni_getopt_sockaddr(&sa, v, szp); + } + return (rv); +} + +static int +ws_pipe_getopt_remaddr(void *arg, void *v, size_t *szp) +{ + ws_pipe * p = arg; + int rv; + nng_sockaddr sa; + + memset(&sa, 0, sizeof(sa)); + if ((rv = nni_ws_peer_addr(p->ws, &sa)) == 0) { + rv = nni_getopt_sockaddr(&sa, v, szp); + } + return (rv); +} + static nni_tran_pipe_option ws_pipe_options[] = { -#if 0 + // clang-format off { NNG_OPT_LOCADDR, ws_pipe_getopt_locaddr }, { NNG_OPT_REMADDR, ws_pipe_getopt_remaddr }, // clang-format on -#endif + // terminate list { NULL, NULL } }; |
