From: Willy Tarreau Date: Wed, 10 Oct 2012 06:57:40 +0000 (+0200) Subject: MEDIUM: server: check for registered keywords when parsing unknown keywords X-Git-Tag: v1.5-dev13~170 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=d0d6059630348be45bdc6ee30df00e185449f4f7;p=thirdparty%2Fhaproxy.git MEDIUM: server: check for registered keywords when parsing unknown keywords At this point, no server keyword is registered yet. The help line does not report supported keywords anymore since it lists the registered ones only. --- diff --git a/src/cfgparse.c b/src/cfgparse.c index 7da0d9756f..4e06f7e714 100644 --- a/src/cfgparse.c +++ b/src/cfgparse.c @@ -4650,12 +4650,64 @@ stats_error_parsing: goto out; } else { - if (!defsrv) - Alert("parsing [%s:%d] : server %s only supports options 'backup', 'cookie', 'redir', 'observer', 'on-error', 'on-marked-down', 'error-limit', 'check', 'disabled', 'track', 'id', 'inter', 'fastinter', 'downinter', 'rise', 'fall', 'addr', 'port', 'source', 'send-proxy', 'minconn', 'maxconn', 'maxqueue', 'slowstart' and 'weight'.\n", - file, linenum, newsrv->id); - else - Alert("parsing [%s:%d]: default-server only supports options 'on-error', 'error-limit', 'inter', 'fastinter', 'downinter', 'rise', 'fall', 'port', 'minconn', 'maxconn', 'maxqueue', 'slowstart' and 'weight'.\n", - file, linenum); + static int srv_dumped; + struct srv_kw *kw; + char *err; + + kw = srv_find_kw(args[cur_arg]); + if (kw) { + char *err = NULL; + int code; + + if (!kw->parse) { + Alert("parsing [%s:%d] : '%s %s' : '%s' option is not implemented in this version (check build options).\n", + file, linenum, args[0], args[1], args[cur_arg]); + cur_arg += 1 + kw->skip ; + err_code |= ERR_ALERT | ERR_FATAL; + goto out; + } + + if (defsrv && !kw->default_ok) { + Alert("parsing [%s:%d] : '%s %s' : '%s' option is not accepted in default-server sections.\n", + file, linenum, args[0], args[1], args[cur_arg]); + cur_arg += 1 + kw->skip ; + err_code |= ERR_ALERT; + continue; + } + + code = kw->parse(args, &cur_arg, curproxy, newsrv, &err); + err_code |= code; + + if (code) { + if (err && *err) { + indent_msg(&err, 2); + Alert("parsing [%s:%d] : '%s %s' : %s\n", file, linenum, args[0], args[1], err); + } + else + Alert("parsing [%s:%d] : '%s %s' : error encountered while processing '%s'.\n", + file, linenum, args[0], args[1], args[cur_arg]); + if (code & ERR_FATAL) { + free(err); + cur_arg += 1 + kw->skip; + goto out; + } + } + free(err); + cur_arg += 1 + kw->skip; + continue; + } + + err = NULL; + if (!srv_dumped) { + srv_dump_kws(&err); + indent_msg(&err, 4); + srv_dumped = 1; + } + + Alert("parsing [%s:%d] : '%s %s' unknown keyword '%s'.%s%s\n", + file, linenum, args[0], args[1], args[cur_arg], + err ? " Registered keywords :" : "", err ? err : ""); + free(err); err_code |= ERR_ALERT | ERR_FATAL; goto out;