summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorClaes Jakobsson <claes.jakobsson@trustly.com>2018-12-27 14:23:13 +0100
committerDaniel Gustafsson <daniel@yesql.se>2018-12-27 14:23:53 +0100
commitd8cae791f47c90f1f1c2b4d052c3e64a3919d92d (patch)
tree2671355efa313d1c2c0cce233280cb20e62ea95a /lib
parentba266b3ed74abecdc02e6b036e8bbf018e01ed9c (diff)
downloadcurl-d8cae791f47c90f1f1c2b4d052c3e64a3919d92d.tar.gz
hostip: support wildcard hosts
This adds support for wildcard hosts in CURLOPT_RESOLVE. These are try-last so any non-wildcard entry is resolved first. If specified, any host not matched by another CURLOPT_RESOLVE config will use this as fallback. Example send a.com to 10.0.0.1 and everything else to 10.0.0.2: curl --resolve *:443:10.0.0.2 --resolve a.com:443:10.0.0.1 \ https://a.com https://b.com This is probably quite similar to using: --connect-to a.com:443:10.0.0.1:443 --connect-to :443:10.0.0.2:443 Closes #3406 Reviewed-by: Daniel Stenberg <daniel@haxx.se>
Diffstat (limited to 'lib')
-rw-r--r--lib/hostip.c30
-rw-r--r--lib/urldata.h1
2 files changed, 31 insertions, 0 deletions
diff --git a/lib/hostip.c b/lib/hostip.c
index f589a0b2c..89b88e932 100644
--- a/lib/hostip.c
+++ b/lib/hostip.c
@@ -312,6 +312,26 @@ fetch_addr(struct connectdata *conn,
/* See if its already in our dns cache */
dns = Curl_hash_pick(data->dns.hostcache, entry_id, entry_len + 1);
+ /* No entry found in cache, check if we might have a wildcard entry */
+ if(!dns && data->change.wildcard_resolve) {
+ /*
+ * Free the previous entry_id before requesting a new one to avoid leaking
+ * memory
+ */
+ free(entry_id);
+
+ entry_id = create_hostcache_id("*", port);
+
+ /* If we can't create the entry id, fail */
+ if(!entry_id)
+ return dns;
+
+ entry_len = strlen(entry_id);
+
+ /* See if it's already in our dns cache */
+ dns = Curl_hash_pick(data->dns.hostcache, entry_id, entry_len + 1);
+ }
+
if(dns && (data->set.dns_cache_timeout != -1)) {
/* See whether the returned entry is stale. Done before we release lock */
struct hostcache_prune_data user;
@@ -872,6 +892,9 @@ CURLcode Curl_loadhostpairs(struct Curl_easy *data)
char hostname[256];
int port = 0;
+ /* Default is no wildcard found */
+ data->change.wildcard_resolve = false;
+
for(hostp = data->change.resolve; hostp; hostp = hostp->next) {
if(!hostp->data)
continue;
@@ -1052,6 +1075,13 @@ CURLcode Curl_loadhostpairs(struct Curl_easy *data)
}
infof(data, "Added %s:%d:%s to DNS cache\n",
hostname, port, addresses);
+
+ /* Wildcard hostname */
+ if(hostname[0] == '*' && hostname[1] == '\0') {
+ infof(data, "RESOLVE %s:%d is wildcard, enabling wildcard checks\n",
+ hostname, port);
+ data->change.wildcard_resolve = true;
+ }
}
}
data->change.resolve = NULL; /* dealt with now */
diff --git a/lib/urldata.h b/lib/urldata.h
index a2655e9e0..11bbbc03e 100644
--- a/lib/urldata.h
+++ b/lib/urldata.h
@@ -1397,6 +1397,7 @@ struct DynamicStatic {
curl_easy_setopt(COOKIEFILE) calls */
struct curl_slist *resolve; /* set to point to the set.resolve list when
this should be dealt with in pretransfer */
+ bool wildcard_resolve; /* Set to true if any resolve change is a wildcard */
};
/*