static ret_t configure (cherokee_rule_request_t *rule, cherokee_config_node_t *conf, cherokee_virtual_server_t *vsrv) { ret_t ret; cherokee_regex_table_t *regexs = VSERVER_SRV(vsrv)->regexs; /* Read the configuration entry */ ret = cherokee_config_node_copy (conf, "request", &rule->pattern); if (ret != ret_ok) { LOG_CRITICAL (CHEROKEE_ERROR_RULE_NO_PROPERTY, RULE(rule)->priority, "request"); return ret_error; } /* Add it to the regular extension table */ ret = cherokee_regex_table_add (regexs, rule->pattern.buf); if (ret != ret_ok) return ret; ret = cherokee_regex_table_get (regexs, rule->pattern.buf, &rule->pcre); if (ret != ret_ok) return ret; return ret_ok; }
static ret_t configure (cherokee_rule_header_t *rule, cherokee_config_node_t *conf, cherokee_virtual_server_t *vsrv) { ret_t ret; cherokee_buffer_t *type = NULL; cherokee_buffer_t *header = NULL; cherokee_regex_table_t *regexs = VSERVER_SRV(vsrv)->regexs; /* Read the header */ ret = cherokee_config_node_read (conf, "header", &header); if (ret != ret_ok) { LOG_ERROR (CHEROKEE_ERROR_RULE_NO_PROPERTY, RULE(rule)->priority, "header"); return ret_error; } ret = header_str_to_type (header, &rule->header); if (ret != ret_ok) { return ret; } /* Type */ ret = cherokee_config_node_read (conf, "type", &type); if (ret == ret_ok) { ret = type_str_to_type (type, &rule->type); if (ret != ret_ok) { return ret; } } /* Read the match */ ret = cherokee_config_node_copy (conf, "match", &rule->match); if (ret != ret_ok) { if (equal_buf_str (type, "regex")) { LOG_ERROR (CHEROKEE_ERROR_RULE_NO_PROPERTY, RULE(rule)->priority, "match"); return ret_error; } } /* Compile the regular expression */ if (! cherokee_buffer_is_empty (&rule->match)) { ret = cherokee_regex_table_add (regexs, rule->match.buf); if (ret != ret_ok) return ret; ret = cherokee_regex_table_get (regexs, rule->match.buf, &rule->pcre); if (ret != ret_ok) return ret; } return ret_ok; }
static ret_t configure_rewrite_entry (cherokee_list_t *list, cherokee_config_node_t *conf, cherokee_regex_table_t *regexs) { ret_t ret; cherokee_regex_entry_t *n; cherokee_buffer_t *substring; cherokee_boolean_t hidden = true; pcre *re = NULL; cherokee_buffer_t *regex = NULL; TRACE(ENTRIES, "Converting rewrite rule '%s'\n", conf->key.buf); /* Query conf */ cherokee_config_node_read_bool (conf, "show", &hidden); hidden = !hidden; ret = cherokee_config_node_read (conf, "regex", ®ex); if (ret == ret_ok) { ret = cherokee_regex_table_get (regexs, regex->buf, (void **)&re); if (ret != ret_ok) return ret; } ret = cherokee_config_node_read (conf, "substring", &substring); if (ret != ret_ok) return ret; /* New RegEx */ n = (cherokee_regex_entry_t *) malloc(sizeof(cherokee_regex_entry_t)); if (unlikely (n == NULL)) return ret_nomem; INIT_LIST_HEAD (&n->listed); n->re = re; n->hidden = hidden; cherokee_buffer_init (&n->subs); cherokee_buffer_add_buffer (&n->subs, substring); /* Add the list */ cherokee_list_add_tail (&n->listed, list); return ret_ok; }