MINOR: httpclient: configure the resolvers section to use

By default the httpclient uses the resolvers section whose ID is
"default", the httpclient.resolvers.id global option allows to configure
another section to use.
diff --git a/src/http_client.c b/src/http_client.c
index f2b97cf..02957ce 100644
--- a/src/http_client.c
+++ b/src/http_client.c
@@ -52,6 +52,8 @@
 #endif
 static struct applet httpclient_applet;
 
+static int hard_error_resolvers = 0;
+static char *resolvers_id = NULL;
 
 /* --- This part of the file implement an HTTP client over the CLI ---
  * The functions will be  starting by "hc_cli" for "httpclient cli"
@@ -1054,29 +1056,40 @@
 {
 	struct act_rule *rule;
 	int i;
-	const char *http_rules[][11] = {
+	char *do_resolve = NULL;
+	char *http_rules[][11] = {
 	       { "set-var(txn.hc_ip)", "dst", "" },
-	       { "do-resolve(txn.hc_ip,default)", "hdr(Host),lower", "if", "{", "var(txn.hc_ip)", "-m", "ip", "0.0.0.0", "}", "" },
+	       { do_resolve, "hdr(Host),lower", "if", "{", "var(txn.hc_ip)", "-m", "ip", "0.0.0.0", "}", "" },
 	       { "return", "status", "503", "if", "{", "var(txn.hc_ip)", "-m", "ip", "0.0.0.0", "}", "" },
 	       { "capture", "var(txn.hc_ip)", "len", "40", "" },
 	       { "set-dst", "var(txn.hc_ip)", "" },
 	       { "" }
 	};
 
-	/* if the "default" resolver does not exist, simply ignore resolving */
-	if (!find_resolvers_by_id("default"))
+	if (!resolvers_id)
+		resolvers_id = strdup("default");
+
+	memprintf(&do_resolve, "do-resolve(txn.hc_ip,%s)", resolvers_id);
+	http_rules[1][0] = do_resolve;
+
+	/* if the resolver does not exist and no hard_error was set, simply ignore resolving */
+	if (!find_resolvers_by_id(resolvers_id) && !hard_error_resolvers) {
+		free(do_resolve);
 		return 0;
+	}
 
 
 	for (i = 0; *http_rules[i][0] != '\0'; i++) {
 		rule = parse_http_req_cond((const char **)http_rules[i], "httpclient", 0, httpclient_proxy);
 		if (!rule) {
+			free(do_resolve);
 			ha_alert("Couldn't setup the httpclient resolver.\n");
 			return 1;
 		}
 		LIST_APPEND(&httpclient_proxy->http_req_rules, &rule->list);
 	}
 
+	free(do_resolve);
 	return 0;
 }
 
@@ -1281,6 +1294,24 @@
 REGISTER_PRE_CHECK(httpclient_precheck);
 REGISTER_POST_CHECK(httpclient_postcheck);
 
+static int httpclient_parse_global_resolvers(char **args, int section_type, struct proxy *curpx,
+                                        const struct proxy *defpx, const char *file, int line,
+                                        char **err)
+{
+	if (too_many_args(1, args, err, NULL))
+		return -1;
+
+	/* any configuration should set the hard_error flag */
+	hard_error_resolvers = 1;
+
+	free(resolvers_id);
+	resolvers_id = strdup(args[1]);
+
+	return 0;
+}
+
+
+
 #ifdef USE_OPENSSL
 static int httpclient_parse_global_ca_file(char **args, int section_type, struct proxy *curpx,
                                         const struct proxy *defpx, const char *file, int line,
@@ -1319,12 +1350,15 @@
 
 	return 0;
 }
+#endif /* ! USE_OPENSSL */
 
 static struct cfg_kw_list cfg_kws = {ILH, {
+	{ CFG_GLOBAL, "httpclient.resolvers.id", httpclient_parse_global_resolvers },
+#ifdef USE_OPENSSL
 	{ CFG_GLOBAL, "httpclient.ssl.verify", httpclient_parse_global_verify },
 	{ CFG_GLOBAL, "httpclient.ssl.ca-file", httpclient_parse_global_ca_file },
+#endif
 	{ 0, NULL, NULL },
 }};
 
 INITCALL1(STG_REGISTER, cfg_register_keywords, &cfg_kws);
-#endif