diff --git a/src/cfgparse.c b/src/cfgparse.c index 26d2f9145..778edf74c 100644 --- a/src/cfgparse.c +++ b/src/cfgparse.c @@ -6942,7 +6942,7 @@ int check_config_validity() 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 @@ int check_config_validity() 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 @@ int check_config_validity() 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 @@ int check_config_validity() 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 @@ int check_config_validity() 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 @@ int check_config_validity() 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;