aboutsummaryrefslogtreecommitdiff
path: root/src/supplemental
diff options
context:
space:
mode:
Diffstat (limited to 'src/supplemental')
-rw-r--r--src/supplemental/http/http_api.h4
-rw-r--r--src/supplemental/http/http_conn.c15
-rw-r--r--src/supplemental/http/http_public.c14
-rw-r--r--src/supplemental/tls/tls_stream.c18
-rw-r--r--src/supplemental/websocket/websocket.c18
-rw-r--r--src/supplemental/websocket/websocket_test.c6
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));