aboutsummaryrefslogtreecommitdiff
path: root/src/supplemental
diff options
context:
space:
mode:
authorGarrett D'Amore <garrett@damore.org>2025-10-25 11:43:59 -0700
committerGarrett D'Amore <garrett@damore.org>2025-10-25 20:11:51 -0700
commitcc419cf01d9c060a3bd3fc318f9b9bc9e736dae9 (patch)
tree2f26cd782a54bed35e03b451003deee5df701983 /src/supplemental
parentebc479a61b8f2d2f3a6d846d18debfb9022e6010 (diff)
downloadnng-cc419cf01d9c060a3bd3fc318f9b9bc9e736dae9.tar.gz
nng-cc419cf01d9c060a3bd3fc318f9b9bc9e736dae9.tar.bz2
nng-cc419cf01d9c060a3bd3fc318f9b9bc9e736dae9.zip
Add stream direct address functions for socket addresses.
This is going to be used to facilitate debugging, and eliminate some inconveniences around these things. We plan to move the pipe functions to use these directly, hopefully moving away from the pipe_getopt hack. (The transport API will need to grow these. For now this is just the streams.)
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));