MEDIUM: config: clarify the conflicting modes detection for backend rules
We don't use findproxy_mode() anymore so we can check the conflicting
modes and report the anomalies accordingly with line numbers and more
explicit details.
diff --git a/src/cfgparse.c b/src/cfgparse.c
index 26d2f91..778edf7 100644
--- a/src/cfgparse.c
+++ b/src/cfgparse.c
@@ -6942,7 +6942,7 @@
if (curproxy->defbe.name) {
struct proxy *target;
- target = findproxy_mode(curproxy->defbe.name, curproxy->mode, PR_CAP_BE);
+ target = proxy_be_by_name(curproxy->defbe.name);
if (!target) {
Alert("Proxy '%s': unable to find required default_backend: '%s'.\n",
curproxy->id, curproxy->defbe.name);
@@ -6951,6 +6951,15 @@
Alert("Proxy '%s': loop detected for default_backend: '%s'.\n",
curproxy->id, curproxy->defbe.name);
cfgerr++;
+ } else if (target->mode != curproxy->mode &&
+ !(curproxy->mode == PR_MODE_TCP && target->mode == PR_MODE_HTTP)) {
+
+ Alert("%s %s '%s' (%s:%d) tries to use incompatible %s %s '%s' (%s:%d) as its default backend (see 'mode').\n",
+ proxy_mode_str(curproxy->mode), proxy_type_str(curproxy), curproxy->id,
+ curproxy->conf.file, curproxy->conf.line,
+ proxy_mode_str(target->mode), proxy_type_str(target), target->id,
+ target->conf.file, target->conf.line);
+ cfgerr++;
} else {
free(curproxy->defbe.name);
curproxy->defbe.be = target;
@@ -6974,7 +6983,7 @@
if (exp->action != ACT_SETBE)
continue;
- target = findproxy_mode(exp->replace, PR_MODE_HTTP, PR_CAP_BE);
+ target = proxy_be_by_name(exp->replace);
if (!target) {
Alert("Proxy '%s': unable to find required setbe: '%s'.\n",
curproxy->id, exp->replace);
@@ -6983,6 +6992,13 @@
Alert("Proxy '%s': loop detected for setbe: '%s'.\n",
curproxy->id, exp->replace);
cfgerr++;
+ } else if (target->mode != PR_MODE_HTTP) {
+ Alert("%s %s '%s' (%s:%d) tries to use incompatible %s %s '%s' (%s:%d) in a 'reqsetbe' rule (see 'mode').\n",
+ proxy_mode_str(curproxy->mode), proxy_type_str(curproxy), curproxy->id,
+ curproxy->conf.file, curproxy->conf.line,
+ proxy_mode_str(target->mode), proxy_type_str(target), target->id,
+ target->conf.file, target->conf.line);
+ cfgerr++;
} else {
free((void *)exp->replace);
exp->replace = (const char *)target;
@@ -7021,8 +7037,7 @@
rule->dynamic = 0;
rule->be.name = pxname;
- target = findproxy_mode(rule->be.name, curproxy->mode, PR_CAP_BE);
-
+ target = proxy_be_by_name(rule->be.name);
if (!target) {
Alert("Proxy '%s': unable to find required use_backend: '%s'.\n",
curproxy->id, rule->be.name);
@@ -7031,6 +7046,15 @@
Alert("Proxy '%s': loop detected for use_backend: '%s'.\n",
curproxy->id, rule->be.name);
cfgerr++;
+ } else if (target->mode != curproxy->mode &&
+ !(curproxy->mode == PR_MODE_TCP && target->mode == PR_MODE_HTTP)) {
+
+ Alert("%s %s '%s' (%s:%d) tries to use incompatible %s %s '%s' (%s:%d) in a 'use_backend' rule (see 'mode').\n",
+ proxy_mode_str(curproxy->mode), proxy_type_str(curproxy), curproxy->id,
+ curproxy->conf.file, curproxy->conf.line,
+ proxy_mode_str(target->mode), proxy_type_str(target), target->id,
+ target->conf.file, target->conf.line);
+ cfgerr++;
} else {
free((void *)rule->be.name);
rule->be.backend = target;