diff options
Diffstat (limited to 'src/supplemental')
| -rw-r--r-- | src/supplemental/http/http_api.h | 4 | ||||
| -rw-r--r-- | src/supplemental/http/http_conn.c | 15 | ||||
| -rw-r--r-- | src/supplemental/http/http_public.c | 14 | ||||
| -rw-r--r-- | src/supplemental/tls/tls_stream.c | 18 | ||||
| -rw-r--r-- | src/supplemental/websocket/websocket.c | 18 | ||||
| -rw-r--r-- | src/supplemental/websocket/websocket_test.c | 6 |
6 files changed, 65 insertions, 10 deletions
diff --git a/src/supplemental/http/http_api.h b/src/supplemental/http/http_api.h index 74472f50..ca13bd09 100644 --- a/src/supplemental/http/http_api.h +++ b/src/supplemental/http/http_api.h @@ -72,8 +72,8 @@ extern void nni_http_read_chunks( extern nni_http_req *nni_http_conn_req(nni_http_conn *); extern nni_http_res *nni_http_conn_res(nni_http_conn *); -extern nng_err nni_http_get_addr( - nni_http_conn *, const char *, nng_sockaddr *); +extern nng_err nni_http_peer_addr(nni_http_conn *, const nng_sockaddr **); +extern nng_err nni_http_self_addr(nni_http_conn *, const nng_sockaddr **); // Private to the server. (Used to support session hijacking.) extern void nni_http_conn_set_ctx(nni_http_conn *, void *); diff --git a/src/supplemental/http/http_conn.c b/src/supplemental/http/http_conn.c index ac549649..bb3a0882 100644 --- a/src/supplemental/http/http_conn.c +++ b/src/supplemental/http/http_conn.c @@ -22,6 +22,7 @@ #include "http_api.h" #include "http_msg.h" +#include "nng/nng.h" // We insist that individual headers fit in 8K. // If you need more than that, you need something we can't do. @@ -160,13 +161,15 @@ nni_http_conn_close(nni_http_conn *conn) } nng_err -nni_http_get_addr(nni_http_conn *conn, const char *opt, nng_sockaddr *addrp) +nni_http_peer_addr(nni_http_conn *conn, const nng_sockaddr **sap) { - nng_err rv; - nni_mtx_lock(&conn->mtx); - rv = nng_stream_get_addr(conn->sock, opt, addrp); - nni_mtx_unlock(&conn->mtx); - return (rv); + return nng_stream_peer_addr(conn->sock, sap); +} + +nng_err +nni_http_self_addr(nni_http_conn *conn, const nng_sockaddr **sap) +{ + return nng_stream_self_addr(conn->sock, sap); } // http_buf_pull_up pulls the content of the read buffer back to the diff --git a/src/supplemental/http/http_public.c b/src/supplemental/http/http_public.c index 8c225e5e..edf5e609 100644 --- a/src/supplemental/http/http_public.c +++ b/src/supplemental/http/http_public.c @@ -309,13 +309,23 @@ nng_http_read_response(nng_http *conn, nng_aio *aio) nng_err nng_http_remote_address(nng_http *conn, nng_sockaddr *addrp) { - return (nni_http_get_addr(conn, NNG_OPT_REMADDR, addrp)); + const nng_sockaddr *sap; + nng_err rv; + if ((rv = nni_http_peer_addr(conn, &sap)) == NNG_OK) { + *addrp = *sap; + } + return (rv); } nng_err nng_http_local_address(nng_http *conn, nng_sockaddr *addrp) { - return (nni_http_get_addr(conn, NNG_OPT_LOCADDR, addrp)); + const nng_sockaddr *sap; + nng_err rv; + if ((rv = nni_http_self_addr(conn, &sap)) == NNG_OK) { + *addrp = *sap; + } + return (rv); } nng_err diff --git a/src/supplemental/tls/tls_stream.c b/src/supplemental/tls/tls_stream.c index d3dd9497..169e8fb0 100644 --- a/src/supplemental/tls/tls_stream.c +++ b/src/supplemental/tls/tls_stream.c @@ -143,6 +143,8 @@ tls_stream_conn_cb(void *arg) static nng_err tls_stream_get( void *arg, const char *name, void *buf, size_t *szp, nni_type t); +static nng_err tls_stream_self_addr(void *arg, const nng_sockaddr **); +static nng_err tls_stream_peer_addr(void *arg, const nng_sockaddr **); static nng_err tls_stream_peer_cert(void *arg, nng_tls_cert **); int @@ -168,6 +170,8 @@ nni_tls_stream_alloc(tls_stream **tsp, nng_tls_config *cfg, nng_aio *user_aio) ts->stream.s_send = tls_stream_send; ts->stream.s_recv = tls_stream_recv; ts->stream.s_get = tls_stream_get; + ts->stream.s_self_addr = tls_stream_self_addr; + ts->stream.s_peer_addr = tls_stream_peer_addr; ts->stream.s_peer_cert = tls_stream_peer_cert; nni_aio_init(&ts->conn_aio, tls_stream_conn_cb, ts); @@ -236,3 +240,17 @@ tls_stream_get(void *arg, const char *name, void *buf, size_t *szp, nni_type t) } return (nni_getopt(tls_stream_options, name, ts, buf, szp, t)); } + +static nng_err +tls_stream_self_addr(void *arg, const nng_sockaddr **sap) +{ + tls_stream *ts = arg; + return (nng_stream_self_addr(ts->conn.bio, sap)); +} + +static nng_err +tls_stream_peer_addr(void *arg, const nng_sockaddr **sap) +{ + tls_stream *ts = arg; + return (nng_stream_peer_addr(ts->conn.bio, sap)); +} diff --git a/src/supplemental/websocket/websocket.c b/src/supplemental/websocket/websocket.c index d78c032b..2ff126e3 100644 --- a/src/supplemental/websocket/websocket.c +++ b/src/supplemental/websocket/websocket.c @@ -193,6 +193,8 @@ static void ws_str_send(void *, nng_aio *); static void ws_str_recv(void *, nng_aio *); static nng_err ws_str_get(void *, const char *, void *, size_t *, nni_type); static nng_err ws_str_peer_cert(void *, nng_tls_cert **); +static nng_err ws_str_self_addr(void *, const nng_sockaddr **); +static nng_err ws_str_peer_addr(void *, const nng_sockaddr **); static void ws_listener_close(void *); static void ws_listener_free(void *); @@ -1402,6 +1404,8 @@ ws_init(nni_ws **wsp) ws->ops.s_recv = ws_str_recv; ws->ops.s_get = ws_str_get; ws->ops.s_peer_cert = ws_str_peer_cert; + ws->ops.s_peer_addr = ws_str_peer_addr; + ws->ops.s_self_addr = ws_str_self_addr; ws->fragsize = 1 << 20; // we won't send a frame larger than this *wsp = ws; @@ -2841,3 +2845,17 @@ ws_str_peer_cert(void *arg, nng_tls_cert **certp) nni_mtx_unlock(&ws->mtx); return (nni_http_conn_peer_cert(ws->http, certp)); } + +static nng_err +ws_str_peer_addr(void *arg, const nng_sockaddr **sap) +{ + nni_ws *ws = arg; + return (nni_http_peer_addr(ws->http, sap)); +} + +static nng_err +ws_str_self_addr(void *arg, const nng_sockaddr **sap) +{ + nni_ws *ws = arg; + return (nni_http_self_addr(ws->http, sap)); +} diff --git a/src/supplemental/websocket/websocket_test.c b/src/supplemental/websocket/websocket_test.c index cb502ef4..66c9617e 100644 --- a/src/supplemental/websocket/websocket_test.c +++ b/src/supplemental/websocket/websocket_test.c @@ -131,6 +131,8 @@ test_websocket_conn_props(void) nng_stream_listener *l = NULL; nng_sockaddr sa1; nng_sockaddr sa2; + const nng_sockaddr *sap1; + const nng_sockaddr *sap2; size_t sz; nng_aio *daio = NULL; nng_aio *laio = NULL; @@ -182,11 +184,15 @@ test_websocket_conn_props(void) NUTS_TRUE(c2 != NULL); // Let's compare the peer addresses + NUTS_PASS(nng_stream_self_addr(c1, &sap1)); + NUTS_PASS(nng_stream_peer_addr(c2, &sap2)); NUTS_PASS(nng_stream_get_addr(c1, NNG_OPT_LOCADDR, &sa1)); NUTS_PASS(nng_stream_get_addr(c2, NNG_OPT_REMADDR, &sa2)); NUTS_TRUE(sa1.s_family == sa2.s_family); NUTS_TRUE(sa1.s_in.sa_addr == sa2.s_in.sa_addr); NUTS_TRUE(sa1.s_in.sa_port == sa2.s_in.sa_port); + NUTS_TRUE(memcmp(sap1, &sa1, sizeof(sa1)) == 0); + NUTS_TRUE(memcmp(sap2, &sa2, sizeof(sa2)) == 0); NUTS_PASS(nng_stream_get_addr(c1, NNG_OPT_REMADDR, &sa1)); NUTS_PASS(nng_stream_get_addr(c2, NNG_OPT_LOCADDR, &sa2)); |
