[core] optional condition in config "else" clause (fixes #1268)

x-ref:
  "condition should be optional in "else" clause in configuration file"
  https://redmine.lighttpd.net/issues/1268
This commit is contained in:
Glenn Strauss 2016-10-09 08:05:26 -04:00
parent 1018ff9922
commit 79fb75709b
4 changed files with 38 additions and 5 deletions

View File

@ -64,7 +64,8 @@ typedef enum {
CONFIG_COND_EQ, /** == */
CONFIG_COND_MATCH, /** =~ */
CONFIG_COND_NE, /** != */
CONFIG_COND_NOMATCH /** !~ */
CONFIG_COND_NOMATCH, /** !~ */
CONFIG_COND_ELSE /** (always true if reached) */
} config_cond_t;
/**

View File

@ -408,6 +408,8 @@ static cond_result_t config_check_cond_nocache(server *srv, connection *con, dat
break;
}
if (CONFIG_COND_ELSE == dc->cond) return COND_RESULT_TRUE;
/* pass the rules */
switch (dc->comp) {

View File

@ -398,6 +398,10 @@ condlines(A) ::= condlines(B) eols ELSE condline(C). {
fprintf(stderr, "unreachable else condition\n");
ctx->ok = 0;
}
if (B->cond == CONFIG_COND_ELSE) {
fprintf(stderr, "unreachable condition following else catch-all\n");
ctx->ok = 0;
}
C->prev = B;
B->next = C;
A = C;
@ -636,6 +640,24 @@ context ::= DOLLAR SRVVARNAME(B) LBRACKET stringop(C) RBRACKET cond(E) expressio
D = NULL;
}
}
context ::= . {
if (ctx->ok) {
data_config *dc = data_config_init();
buffer_copy_buffer(dc->key, ctx->current->key);
buffer_append_string_len(dc->key, CONST_STR_LEN("/"));
buffer_append_string_len(dc->key, CONST_STR_LEN("else"));
dc->cond = CONFIG_COND_ELSE;
if (NULL == array_get_element(ctx->all_configs, dc->key->ptr)) {
configparser_push(ctx, dc, 1);
} else {
fprintf(stderr, "repeated else condition\n");
ctx->ok = 0;
dc->free((data_unset *)dc);
}
}
}
cond(A) ::= EQ. {
A = CONFIG_COND_EQ;
}

View File

@ -63,8 +63,12 @@ static void data_config_print(const data_unset *d, int depth) {
fprintf(stdout, "config {\n");
}
else {
fprintf(stdout, "$%s %s \"%s\" {\n",
ds->comp_key->ptr, ds->op->ptr, ds->string->ptr);
if (ds->cond != CONFIG_COND_ELSE) {
fprintf(stdout, "$%s %s \"%s\" {\n",
ds->comp_key->ptr, ds->op->ptr, ds->string->ptr);
} else {
fprintf(stdout, "{\n");
}
array_print_indent(depth + 1);
fprintf(stdout, "# block %d\n", ds->context_ndx);
}
@ -103,8 +107,12 @@ static void data_config_print(const data_unset *d, int depth) {
array_print_indent(depth);
fprintf(stdout, "}");
if (0 != ds->context_ndx) {
fprintf(stdout, " # end of $%s %s \"%s\"",
ds->comp_key->ptr, ds->op->ptr, ds->string->ptr);
if (ds->cond != CONFIG_COND_ELSE) {
fprintf(stdout, " # end of $%s %s \"%s\"",
ds->comp_key->ptr, ds->op->ptr, ds->string->ptr);
} else {
fprintf(stdout, " # end of else");
}
}
if (ds->next) {