From f1a04abd6bf620b5167b38297fa20331575c2705 Mon Sep 17 00:00:00 2001 From: henri Date: Mon, 22 Apr 2013 19:30:49 +0000 Subject: [PATCH] Removed the global ProxyOps list. Each proxy node now provides a pointer to its operations struct. --- nsock/src/nsock_connect.c | 10 +++++----- nsock/src/nsock_proxy.c | 35 ++++++++++++++++++++--------------- nsock/src/nsock_proxy.h | 7 +++++++ nsock/src/proxy_http.c | 6 +++++- 4 files changed, 37 insertions(+), 21 deletions(-) diff --git a/nsock/src/nsock_connect.c b/nsock/src/nsock_connect.c index f6614d7a4..a1d3d2699 100644 --- a/nsock/src/nsock_connect.c +++ b/nsock/src/nsock_connect.c @@ -66,10 +66,6 @@ #include -/* Defined in nsock_proxy.c */ -extern struct proxy_op *ProxyOps[]; - - /* Create the actual socket (nse->iod->sd) underlying the iod. This unblocks the * socket, binds to the localaddr address, sets IP options, and sets the * broadcast flag. Trying to change these functions after making this call will @@ -270,7 +266,11 @@ nsock_event_id nsock_connect_tcp(nsock_pool nsp, nsock_iod ms_iod, nsock_ev_hand msiod *nsi = (msiod *)ms_iod; if (nsi->px_ctx) { - return IOD_PX_TCP_CONNECT(nsi)(nsp, ms_iod, handler, timeout_msecs, userdata, saddr, sslen, port); + struct proxy_node *current; + + current = PROXY_CTX_CURRENT(nsi->px_ctx); + assert(current != NULL); + return current->ops->connect_tcp(nsp, ms_iod, handler, timeout_msecs, userdata, saddr, sslen, port); } return nsock_connect_tcp_direct(nsp, ms_iod, handler, timeout_msecs, userdata, saddr, sslen, port); diff --git a/nsock/src/nsock_proxy.c b/nsock/src/nsock_proxy.c index 2e6608bf1..07e16f65c 100644 --- a/nsock/src/nsock_proxy.c +++ b/nsock/src/nsock_proxy.c @@ -89,11 +89,13 @@ void nsock_proxy_ev_dispatch(nsock_pool nspool, nsock_event nsevent, void *udata void forward_event(mspool *nsp, msevent *nse, void *udata); -extern struct proxy_op proxy_http; +/* --- Implemented proxy backends --- */ +extern const struct proxy_op proxy_http_ops; -/* Ensure that the proxy_op for PROXY_XX is at the PROXY_TYPE_XX index. */ -const struct proxy_op *ProxyOps[PROXY_TYPE_COUNT] = { - [PROXY_TYPE_HTTP] = &proxy_http + +const static struct proxy_op *ProxyBackends[] = { + &proxy_http_ops, + NULL }; @@ -216,17 +218,21 @@ void proxy_parser_delete(struct proxy_parser *parser) { * - user:pass@ prefix before host specification */ static struct proxy_node *proxy_node_new(char *proxystr) { - struct proxy_node *proxy; + int i; - proxy = (struct proxy_node *)safe_zalloc(sizeof(struct proxy_node)); + for (i = 0; ProxyBackends[i] != NULL; i++) { + const struct proxy_op *pxop; - if (strncasecmp(proxystr, "http://", 7) == 0) { - ProxyOps[PROXY_TYPE_HTTP]->init(proxy, proxystr); - } else { - fatal("Invalid protocol in proxy specification string: %s", proxystr); + pxop = ProxyBackends[i]; + if (strncasecmp(proxystr, pxop->prefix, strlen(pxop->prefix)) == 0) { + struct proxy_node *proxy; + + proxy = (struct proxy_node *)safe_zalloc(sizeof(struct proxy_node)); + pxop->init(proxy, proxystr); + return proxy; + } } - - return proxy; + fatal("Invalid protocol in proxy specification string: %s", proxystr); } static void proxy_node_delete(struct proxy_node *proxy) { @@ -262,8 +268,7 @@ void nsock_proxy_ev_dispatch(nsock_pool nspool, nsock_event nsevent, void *udata fatal("Error, but this is debug only!"); current = PROXY_CTX_CURRENT(nse->iod->px_ctx); - - assert(current->px_type > 0 && current->px_type < PROXY_TYPE_COUNT); - ProxyOps[current->px_type]->handler(nspool, nsevent, udata); + assert(current); + current->ops->handler(nspool, nsevent, udata); } diff --git a/nsock/src/nsock_proxy.h b/nsock/src/nsock_proxy.h index d70417166..8f6ab8680 100644 --- a/nsock/src/nsock_proxy.h +++ b/nsock/src/nsock_proxy.h @@ -66,9 +66,11 @@ #define PROXY_CTX_NEXT(ctx) ((struct proxy_node *)((GH_LIST_ELEM_NEXT((ctx)->px_current)) ? GH_LIST_ELEM_DATA(GH_LIST_ELEM_NEXT((ctx)->px_current)) : NULL)) #define PROXY_CTX_NODES(ctx) ((ctx)->px_chain->nodes) +#if 0 #define IOD_PX_TCP_CONNECT(iod) (ProxyOps[PROXY_CTX_CURRENT((iod)->px_ctx)->px_type]->connect_tcp) #define IOD_PX_DATA_ENCODE(iod) (ProxyOps[PROXY_CTX_CURRENT((iod)->px_ctx)->px_type]->data_encode) #define IOD_PX_DATA_DECODE(iod) (ProxyOps[PROXY_CTX_CURRENT((iod)->px_ctx)->px_type]->data_decode) +#endif /* ------------------- CONSTANTS ------------------- */ @@ -92,6 +94,8 @@ enum nsock_proxy_state { struct proxy_node { enum nsock_proxy_type px_type; + const struct proxy_op *ops; + struct sockaddr_storage ss; size_t sslen; unsigned short port; @@ -117,6 +121,9 @@ struct proxy_chain_context { }; struct proxy_op { + const char *prefix; + enum nsock_proxy_type type; + void (*init)(struct proxy_node *proxy, char *proxystr); void (*handler)(nsock_pool nspool, nsock_event nsevent, void *udata); nsock_event_id (*connect_tcp)(nsock_pool nsp, nsock_iod ms_iod, nsock_ev_handler handler, int mstimeout, diff --git a/nsock/src/proxy_http.c b/nsock/src/proxy_http.c index 83f87f4c8..02a0d7523 100644 --- a/nsock/src/proxy_http.c +++ b/nsock/src/proxy_http.c @@ -77,7 +77,9 @@ static char *proxy_http_data_decode(const char *src, size_t len, size_t *dlen); /* ---- PROXY DEFINITION ---- */ -struct proxy_op proxy_http = { +const struct proxy_op proxy_http_ops = { + .prefix = "http://", + .type = PROXY_TYPE_HTTP, .init = proxy_http_init, .handler = proxy_http_handler, .connect_tcp = proxy_http_connect_tcp, @@ -90,6 +92,8 @@ void proxy_http_init(struct proxy_node *proxy, char *proxystr) { struct sockaddr_in *sin; char *strhost, *strport, *saveptr; + proxy->ops = &proxy_http_ops; + strhost = strtok_r(proxystr + 7, ":", &saveptr); strport = strtok_r(NULL, ":", &saveptr); if (strport == NULL)