aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGarrett D'Amore <garrett@damore.org>2017-12-26 16:18:38 -0800
committerGarrett D'Amore <garrett@damore.org>2017-12-26 16:37:41 -0800
commiteb1f8db4ed87867f0f08afba79253e3981db9c88 (patch)
treeaa85c54c5c53ab62cc269e83c04e106637d49473
parent93db6fe3aaff421d61a15993ba6827b742ab00d1 (diff)
downloadnng-eb1f8db4ed87867f0f08afba79253e3981db9c88.tar.gz
nng-eb1f8db4ed87867f0f08afba79253e3981db9c88.tar.bz2
nng-eb1f8db4ed87867f0f08afba79253e3981db9c88.zip
fixes #165 Add address properties for websocket pipes
-rw-r--r--src/supplemental/http/client.c12
-rw-r--r--src/supplemental/http/http.c36
-rw-r--r--src/supplemental/http/http.h4
-rw-r--r--src/supplemental/http/server.c2
-rw-r--r--src/supplemental/websocket/websocket.c20
-rw-r--r--src/supplemental/websocket/websocket.h2
-rw-r--r--src/transport/ws/websocket.c32
-rw-r--r--tests/ws.c2
8 files changed, 95 insertions, 15 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 }
};
diff --git a/tests/ws.c b/tests/ws.c
index f6eac685..eff95ab3 100644
--- a/tests/ws.c
+++ b/tests/ws.c
@@ -23,7 +23,6 @@
static int
check_props_v4(nng_msg *msg, nng_listener l, nng_dialer d)
{
-#if 0
nng_pipe p;
size_t z;
p = nng_msg_get_pipe(msg);
@@ -49,7 +48,6 @@ check_props_v4(nng_msg *msg, nng_listener l, nng_dialer d)
So(ra.s_un.s_in.sa_port != 0);
So(ra.s_un.s_in.sa_addr == htonl(0x7f000001));
});
-#endif
return (0);
}