From 6e8b30d7210f2f25bd3f64fceebadefd1d2c6874 Mon Sep 17 00:00:00 2001 From: henri Date: Mon, 22 Apr 2013 19:32:52 +0000 Subject: [PATCH] Added support to resolve proxy hostnames. --- nsock/src/nsock_proxy.c | 14 ++++++++++++++ nsock/src/nsock_proxy.h | 2 ++ nsock/src/proxy_http.c | 10 ++++------ 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/nsock/src/nsock_proxy.c b/nsock/src/nsock_proxy.c index fd2837eb3..3431922a4 100644 --- a/nsock/src/nsock_proxy.c +++ b/nsock/src/nsock_proxy.c @@ -461,3 +461,17 @@ void nsock_proxy_ev_dispatch(nsock_pool nspool, nsock_event nsevent, void *udata } } +int proxy_resolve(const char *host, struct sockaddr *addr, size_t *addrlen) { + struct addrinfo *res; + int rc; + + rc = getaddrinfo(host, NULL, NULL, &res); + if (rc) + return -rc; + + *addr = *res->ai_addr; + *addrlen = res->ai_addrlen; + freeaddrinfo(res); + return 1; +} + diff --git a/nsock/src/nsock_proxy.h b/nsock/src/nsock_proxy.h index 791ac0d38..343252fb5 100644 --- a/nsock/src/nsock_proxy.h +++ b/nsock/src/nsock_proxy.h @@ -136,6 +136,8 @@ struct proxy_op { /* ------------------- UTIL FUNCTIONS ------------------- */ +int proxy_resolve(const char *host, struct sockaddr *addr, size_t *addrlen); + static inline struct proxy_node *proxy_ctx_node_current(struct proxy_chain_context *ctx) { return GH_LIST_ELEM_DATA(ctx->px_current); } diff --git a/nsock/src/proxy_http.c b/nsock/src/proxy_http.c index be8600650..419396c81 100644 --- a/nsock/src/proxy_http.c +++ b/nsock/src/proxy_http.c @@ -79,17 +79,15 @@ const struct proxy_op proxy_http_ops = { int proxy_http_node_new(struct proxy_node **node, const struct uri *uri) { - struct sockaddr_in *sin; struct proxy_node *proxy; proxy = (struct proxy_node *)safe_zalloc(sizeof(struct proxy_node)); proxy->ops = &proxy_http_ops; - sin = (struct sockaddr_in *)&proxy->ss; - sin->sin_family = AF_INET; - inet_pton(AF_INET, uri->host, &sin->sin_addr); /* TODO Resolve hostnames!! */ - - proxy->sslen = sizeof(struct sockaddr_in); + if (proxy_resolve(uri->host, (struct sockaddr *)&proxy->ss, &proxy->sslen) < 0) { + free(proxy); + return -1; + } if (uri->port == -1) proxy->port = DEFAULT_PROXY_PORT_HTTP;