static char * ngx_http_aclog_bypass_condition_value(ngx_conf_t *cf, ngx_http_aclog_bypass_condition_t *abc, ngx_str_t *value) { ngx_int_t n; ngx_http_script_compile_t sc; ngx_http_script_value_code_t *val; ngx_http_script_complex_value_code_t *complex; n = ngx_http_script_variables_count(value); if (n == 0) { val = ngx_http_script_start_code(cf->pool, &abc->codes, sizeof(ngx_http_script_value_code_t)); if (val == NULL) { return NGX_CONF_ERROR; } n = ngx_atoi(value->data, value->len); if (n == NGX_ERROR) { n = 0; } val->code = ngx_http_script_value_code; val->value = (uintptr_t) n; val->text_len = (uintptr_t) value->len; val->text_data = (uintptr_t) value->data; return NGX_CONF_OK; } complex = ngx_http_script_start_code(cf->pool, &abc->codes, sizeof(ngx_http_script_complex_value_code_t)); if (complex == NULL) { return NGX_CONF_ERROR; } complex->code = ngx_http_script_complex_value_code; complex->lengths = NULL; ngx_memzero(&sc, sizeof(ngx_http_script_compile_t)); sc.cf = cf; sc.source = value; sc.lengths = &complex->lengths; sc.values = &abc->codes; sc.variables = n; sc.complete_lengths = 1; sc.complete_values = 1; if (ngx_http_script_compile(&sc) != NGX_OK) { return NGX_CONF_ERROR; } return NGX_CONF_OK; }
static char * ngx_http_rewrite_variable(ngx_conf_t *cf, ngx_http_rewrite_loc_conf_t *lcf, ngx_str_t *value) { ngx_int_t index; ngx_http_script_var_code_t *var_code; value->len--; value->data++; index = ngx_http_get_variable_index(cf, value); if (index == NGX_ERROR) { return NGX_CONF_ERROR; } var_code = ngx_http_script_start_code(cf->pool, &lcf->codes, sizeof(ngx_http_script_var_code_t)); if (var_code == NULL) { return NGX_CONF_ERROR; } var_code->code = ngx_http_script_var_code; var_code->index = index; return NGX_CONF_OK; }
static char * ngx_http_rewrite_return(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) { ngx_http_rewrite_loc_conf_t *lcf = conf; ngx_str_t *value; ngx_http_script_return_code_t *ret; ret = ngx_http_script_start_code(cf->pool, &lcf->codes, sizeof(ngx_http_script_return_code_t)); if (ret == NULL) { return NGX_CONF_ERROR; } value = cf->args->elts; ret->code = ngx_http_script_return_code; ret->null = (uintptr_t) NULL; ret->status = ngx_atoi(value[1].data, value[1].len); if (ret->status == (uintptr_t) NGX_ERROR) { return NGX_CONF_ERROR; } return NGX_CONF_OK; }
static char * ndk_set_var_filter_value (ndk_set_var_info_t *info, ndk_set_var_t *filter) { ngx_conf_t *cf; ngx_http_variable_t *v; ndk_http_rewrite_loc_conf_t *rlcf; ngx_http_script_var_code_t *vcode; ngx_http_script_var_handler_code_t *vhcode; v = info->v; cf = info->cf; rlcf = info->rlcf; if (ndk_set_var_filter (cf, rlcf, filter) != NGX_CONF_OK) { return NGX_CONF_ERROR; } if (v->set_handler) { vhcode = ngx_http_script_start_code (cf->pool, &rlcf->codes, sizeof(ngx_http_script_var_handler_code_t)); if (vhcode == NULL) { return NGX_CONF_ERROR; } vhcode->code = ngx_http_script_var_set_handler_code; vhcode->handler = v->set_handler; vhcode->data = v->data; return NGX_CONF_OK; } vcode = ngx_http_script_start_code (cf->pool, &rlcf->codes, sizeof(ngx_http_script_var_code_t)); if (vcode == NULL) { return NGX_CONF_ERROR; } vcode->code = ngx_http_script_set_var_code; vcode->index = (uintptr_t) info->index; return NGX_CONF_OK; }
static char * ngx_http_rewrite_break(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) { ngx_http_rewrite_loc_conf_t *lcf = conf; ngx_http_script_code_pt *code; code = ngx_http_script_start_code(cf->pool, &lcf->codes, sizeof(uintptr_t)); if (code == NULL) { return NGX_CONF_ERROR; } *code = ngx_http_script_break_code; return NGX_CONF_OK; }
/* * Based on: ngx_http_rewrite_module.c/ngx_http_rewrite_set * Copyright (C) Igor Sysoev */ char * ngx_postgres_conf_escape(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) { ngx_str_t *value = cf->args->elts; ngx_str_t src = value[cf->args->nelts - 1]; ngx_int_t index; ngx_http_variable_t *v; ngx_http_script_var_code_t *vcode; ngx_http_script_var_handler_code_t *vhcode; ngx_postgres_rewrite_loc_conf_t *rlcf; ngx_postgres_escape_t *pge; ngx_str_t dst; ngx_uint_t empty; dd("entering"); if ((src.len != 0) && (src.data[0] == '=')) { empty = 1; src.len--; src.data++; } else { empty = 0; } if (src.len == 0) { ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "postgres: empty value in \"%V\" directive", &cmd->name); dd("returning NGX_CONF_ERROR"); return NGX_CONF_ERROR; } if (cf->args->nelts == 2) { dst = src; } else { dst = value[1]; } if (dst.len < 2) { ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "postgres: empty variable name in \"%V\" directive", &cmd->name); dd("returning NGX_CONF_ERROR"); return NGX_CONF_ERROR; } if (dst.data[0] != '$') { ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "postgres: invalid variable name \"%V\"" " in \"%V\" directive", &dst, &cmd->name); dd("returning NGX_CONF_ERROR"); return NGX_CONF_ERROR; } dst.len--; dst.data++; v = ngx_http_add_variable(cf, &dst, NGX_HTTP_VAR_CHANGEABLE); if (v == NULL) { dd("returning NGX_CONF_ERROR"); return NGX_CONF_ERROR; } index = ngx_http_get_variable_index(cf, &dst); if (index == NGX_ERROR) { dd("returning NGX_CONF_ERROR"); return NGX_CONF_ERROR; } if (v->get_handler == NULL && ngx_strncasecmp(dst.data, (u_char *) "http_", 5) != 0 && ngx_strncasecmp(dst.data, (u_char *) "sent_http_", 10) != 0 && ngx_strncasecmp(dst.data, (u_char *) "upstream_http_", 14) != 0) { v->get_handler = ngx_postgres_rewrite_var; v->data = index; } rlcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_rewrite_module); if (ngx_postgres_rewrite_value(cf, rlcf, &src) != NGX_CONF_OK) { dd("returning NGX_CONF_ERROR"); return NGX_CONF_ERROR; } pge = ngx_http_script_start_code(cf->pool, &rlcf->codes, sizeof(ngx_postgres_escape_t)); if (pge == NULL) { dd("returning NGX_CONF_ERROR"); return NGX_CONF_ERROR; } pge->code = ngx_postgres_escape_string; pge->empty = empty; if (v->set_handler) { vhcode = ngx_http_script_start_code(cf->pool, &rlcf->codes, sizeof(ngx_http_script_var_handler_code_t)); if (vhcode == NULL) { dd("returning NGX_CONF_ERROR"); return NGX_CONF_ERROR; } vhcode->code = ngx_http_script_var_set_handler_code; vhcode->handler = v->set_handler; vhcode->data = v->data; dd("returning NGX_CONF_OK"); return NGX_CONF_OK; } vcode = ngx_http_script_start_code(cf->pool, &rlcf->codes, sizeof(ngx_http_script_var_code_t)); if (vcode == NULL) { dd("returning NGX_CONF_ERROR"); return NGX_CONF_ERROR; } vcode->code = ngx_http_script_set_var_code; vcode->index = (uintptr_t) index; dd("returning NGX_CONF_OK"); return NGX_CONF_OK; }
/* * Module enable directive. Directive may be in any context. * In main, server and location contexts it statically enables module. * In 'server if' and 'location if' contexts module works through rewrite module codes * by adding own code ngx_http_rdns_enable_code_t. */ static char * rdns_directive(ngx_conf_t * cf, ngx_command_t * cmd, void * conf) { ngx_http_rdns_loc_conf_t * loc_conf = conf; ngx_str_t * value; ngx_http_rdns_common_conf_t cconf; ngx_conf_log_error(NGX_LOG_DEBUG, cf, 0, "rdns directive"); if (loc_conf == NULL) { ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "internal error"); ngx_conf_log_error(NGX_LOG_DEBUG, cf, 0, "location config NULL pointer"); return NGX_CONF_ERROR; } cconf.enabled = 0; cconf.double_mode = 0; value = cf->args->elts; if (ngx_strcasecmp(value[1].data, (u_char *)"on") == 0) { cconf.enabled = 1; cconf.double_mode = 0; } else if (ngx_strcasecmp(value[1].data, (u_char *)"off") == 0) { cconf.enabled = 0; cconf.double_mode = 0; } else if (ngx_strcasecmp(value[1].data, (u_char *)"double") == 0) { cconf.enabled = 1; cconf.double_mode = 1; } else { ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "invalid value \"%s\" in \"%s\" directive, " "it must be \"on\" or \"off\" or \"double\"", value[1].data, cmd->name.data); return NGX_CONF_ERROR; } #ifndef NGX_RDNS_NO_IF if (cf->cmd_type & (NGX_HTTP_LIF_CONF | NGX_HTTP_SIF_CONF)) { ngx_http_rdns_enable_code_t * code; void * rewrite_lcf; /* * Enable code used to determine enabled state in runtime (when processing request). * Enable code should run only in case directive is used inside 'if'. */ ngx_conf_log_error(NGX_LOG_DEBUG, cf, 0, "setup enable code"); rewrite_lcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_rewrite_module); if (rewrite_lcf == NULL) { ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "internal error"); ngx_conf_log_error(NGX_LOG_DEBUG, cf, 0, "unable to get rewrite location config"); return NGX_CONF_ERROR; } code = ngx_http_script_start_code(cf->pool, (ngx_array_t **)rewrite_lcf, sizeof(ngx_http_rdns_enable_code_t)); if (code == NULL) { ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "internal error"); ngx_conf_log_error(NGX_LOG_DEBUG, cf, 0, "unable to add enable code to rewrite module"); return NGX_CONF_ERROR; } code->code = enable_code; code->conf = cconf; loc_conf->conf = cconf; } else { /* statically enable module otherwise */ #endif loc_conf->conf = cconf; #ifndef NGX_RDNS_NO_IF } #endif ngx_conf_log_error(NGX_LOG_DEBUG, cf, 0, "(DONE) rdns directive: enabled = %lu, double_mode = %lu", cconf.enabled, cconf.double_mode); return NGX_CONF_OK; }
static char * ngx_http_rewrite_set(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) { ngx_http_rewrite_loc_conf_t *lcf = conf; ngx_int_t index; ngx_str_t *value; ngx_http_variable_t *v; ngx_http_script_var_code_t *vcode; ngx_http_script_var_handler_code_t *vhcode; value = cf->args->elts; if (value[1].data[0] != '$') { ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "invalid variable name \"%V\"", &value[1]); return NGX_CONF_ERROR; } value[1].len--; value[1].data++; v = ngx_http_add_variable(cf, &value[1], NGX_HTTP_VAR_CHANGEABLE); if (v == NULL) { return NGX_CONF_ERROR; } index = ngx_http_get_variable_index(cf, &value[1]); if (index == NGX_ERROR) { return NGX_CONF_ERROR; } if (v->get_handler == NULL && ngx_strncasecmp(value[1].data, (u_char *) "http_", 5) != 0 && ngx_strncasecmp(value[1].data, (u_char *) "sent_http_", 10) != 0 && ngx_strncasecmp(value[1].data, (u_char *) "upstream_http_", 14) != 0) { v->get_handler = ngx_http_rewrite_var; v->data = index; } if (ngx_http_rewrite_value(cf, lcf, &value[2]) != NGX_CONF_OK) { return NGX_CONF_ERROR; } if (v->set_handler) { vhcode = ngx_http_script_start_code(cf->pool, &lcf->codes, sizeof(ngx_http_script_var_handler_code_t)); if (vhcode == NULL) { return NGX_CONF_ERROR; } vhcode->code = ngx_http_script_var_set_handler_code; vhcode->handler = v->set_handler; vhcode->data = v->data; return NGX_CONF_OK; } vcode = ngx_http_script_start_code(cf->pool, &lcf->codes, sizeof(ngx_http_script_var_code_t)); if (vcode == NULL) { return NGX_CONF_ERROR; } vcode->code = ngx_http_script_set_var_code; vcode->index = (uintptr_t) index; return NGX_CONF_OK; }
static char * ngx_http_rewrite_if_condition(ngx_conf_t *cf, ngx_http_rewrite_loc_conf_t *lcf) { u_char *p; size_t len; ngx_str_t *value; ngx_uint_t cur, last; ngx_regex_compile_t rc; ngx_http_script_code_pt *code; ngx_http_script_file_code_t *fop; ngx_http_script_regex_code_t *regex; u_char errstr[NGX_MAX_CONF_ERRSTR]; value = cf->args->elts; last = cf->args->nelts - 1; if (value[1].len < 1 || value[1].data[0] != '(') { ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "invalid condition \"%V\"", &value[1]); return NGX_CONF_ERROR; } if (value[1].len == 1) { cur = 2; } else { cur = 1; value[1].len--; value[1].data++; } if (value[last].len < 1 || value[last].data[value[last].len - 1] != ')') { ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "invalid condition \"%V\"", &value[last]); return NGX_CONF_ERROR; } if (value[last].len == 1) { last--; } else { value[last].len--; value[last].data[value[last].len] = '\0'; } len = value[cur].len; p = value[cur].data; if (len > 1 && p[0] == '$') { if (cur != last && cur + 2 != last) { ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "invalid condition \"%V\"", &value[cur]); return NGX_CONF_ERROR; } if (ngx_http_rewrite_variable(cf, lcf, &value[cur]) != NGX_CONF_OK) { return NGX_CONF_ERROR; } if (cur == last) { return NGX_CONF_OK; } cur++; len = value[cur].len; p = value[cur].data; if (len == 1 && p[0] == '=') { if (ngx_http_rewrite_value(cf, lcf, &value[last]) != NGX_CONF_OK) { return NGX_CONF_ERROR; } code = ngx_http_script_start_code(cf->pool, &lcf->codes, sizeof(uintptr_t)); if (code == NULL) { return NGX_CONF_ERROR; } *code = ngx_http_script_equal_code; return NGX_CONF_OK; } if (len == 2 && p[0] == '!' && p[1] == '=') { if (ngx_http_rewrite_value(cf, lcf, &value[last]) != NGX_CONF_OK) { return NGX_CONF_ERROR; } code = ngx_http_script_start_code(cf->pool, &lcf->codes, sizeof(uintptr_t)); if (code == NULL) { return NGX_CONF_ERROR; } *code = ngx_http_script_not_equal_code; return NGX_CONF_OK; } if ((len == 1 && p[0] == '~') || (len == 2 && p[0] == '~' && p[1] == '*') || (len == 2 && p[0] == '!' && p[1] == '~') || (len == 3 && p[0] == '!' && p[1] == '~' && p[2] == '*')) { regex = ngx_http_script_start_code(cf->pool, &lcf->codes, sizeof(ngx_http_script_regex_code_t)); if (regex == NULL) { return NGX_CONF_ERROR; } ngx_memzero(regex, sizeof(ngx_http_script_regex_code_t)); ngx_memzero(&rc, sizeof(ngx_regex_compile_t)); rc.pattern = value[last]; rc.options = (p[len - 1] == '*') ? NGX_REGEX_CASELESS : 0; rc.err.len = NGX_MAX_CONF_ERRSTR; rc.err.data = errstr; regex->regex = ngx_http_regex_compile(cf, &rc); if (regex->regex == NULL) { return NGX_CONF_ERROR; } regex->code = ngx_http_script_regex_start_code; regex->next = sizeof(ngx_http_script_regex_code_t); regex->test = 1; if (p[0] == '!') { regex->negative_test = 1; } regex->name = value[last]; return NGX_CONF_OK; } ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "unexpected \"%V\" in condition", &value[cur]); return NGX_CONF_ERROR; } else if ((len == 2 && p[0] == '-') || (len == 3 && p[0] == '!' && p[1] == '-')) { if (cur + 1 != last) { ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "invalid condition \"%V\"", &value[cur]); return NGX_CONF_ERROR; } value[last].data[value[last].len] = '\0'; value[last].len++; if (ngx_http_rewrite_value(cf, lcf, &value[last]) != NGX_CONF_OK) { return NGX_CONF_ERROR; } fop = ngx_http_script_start_code(cf->pool, &lcf->codes, sizeof(ngx_http_script_file_code_t)); if (fop == NULL) { return NGX_CONF_ERROR; } fop->code = ngx_http_script_file_code; if (p[1] == 'f') { fop->op = ngx_http_script_file_plain; return NGX_CONF_OK; } if (p[1] == 'd') { fop->op = ngx_http_script_file_dir; return NGX_CONF_OK; } if (p[1] == 'e') { fop->op = ngx_http_script_file_exists; return NGX_CONF_OK; } if (p[1] == 'x') { fop->op = ngx_http_script_file_exec; return NGX_CONF_OK; } if (p[0] == '!') { if (p[2] == 'f') { fop->op = ngx_http_script_file_not_plain; return NGX_CONF_OK; } if (p[2] == 'd') { fop->op = ngx_http_script_file_not_dir; return NGX_CONF_OK; } if (p[2] == 'e') { fop->op = ngx_http_script_file_not_exists; return NGX_CONF_OK; } if (p[2] == 'x') { fop->op = ngx_http_script_file_not_exec; return NGX_CONF_OK; } } ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "invalid condition \"%V\"", &value[cur]); return NGX_CONF_ERROR; } ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "invalid condition \"%V\"", &value[cur]); return NGX_CONF_ERROR; }
static char * ngx_http_rewrite(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) { ngx_http_rewrite_loc_conf_t *lcf = conf; ngx_str_t *value; ngx_uint_t last; ngx_regex_compile_t rc; ngx_http_script_code_pt *code; ngx_http_script_compile_t sc; ngx_http_script_regex_code_t *regex; ngx_http_script_regex_end_code_t *regex_end; u_char errstr[NGX_MAX_CONF_ERRSTR]; regex = ngx_http_script_start_code(cf->pool, &lcf->codes, sizeof(ngx_http_script_regex_code_t)); if (regex == NULL) { return NGX_CONF_ERROR; } ngx_memzero(regex, sizeof(ngx_http_script_regex_code_t)); value = cf->args->elts; ngx_memzero(&rc, sizeof(ngx_regex_compile_t)); rc.pattern = value[1]; rc.err.len = NGX_MAX_CONF_ERRSTR; rc.err.data = errstr; /* TODO: NGX_REGEX_CASELESS */ regex->regex = ngx_http_regex_compile(cf, &rc); if (regex->regex == NULL) { return NGX_CONF_ERROR; } regex->code = ngx_http_script_regex_start_code; regex->uri = 1; regex->name = value[1]; if (value[2].data[value[2].len - 1] == '?') { /* the last "?" drops the original arguments */ value[2].len--; } else { regex->add_args = 1; } last = 0; if (ngx_strncmp(value[2].data, "http://", sizeof("http://") - 1) == 0 || ngx_strncmp(value[2].data, "https://", sizeof("https://") - 1) == 0 || ngx_strncmp(value[2].data, "$scheme", sizeof("$scheme") - 1) == 0) { regex->status = NGX_HTTP_MOVED_TEMPORARILY; regex->redirect = 1; last = 1; } if (cf->args->nelts == 4) { if (ngx_strcmp(value[3].data, "last") == 0) { last = 1; } else if (ngx_strcmp(value[3].data, "break") == 0) { regex->break_cycle = 1; last = 1; } else if (ngx_strcmp(value[3].data, "redirect") == 0) { regex->status = NGX_HTTP_MOVED_TEMPORARILY; regex->redirect = 1; last = 1; } else if (ngx_strcmp(value[3].data, "permanent") == 0) { regex->status = NGX_HTTP_MOVED_PERMANENTLY; regex->redirect = 1; last = 1; } else { ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "invalid parameter \"%V\"", &value[3]); return NGX_CONF_ERROR; } } ngx_memzero(&sc, sizeof(ngx_http_script_compile_t)); sc.cf = cf; sc.source = &value[2]; sc.lengths = ®ex->lengths; sc.values = &lcf->codes; sc.variables = ngx_http_script_variables_count(&value[2]); sc.main = regex; sc.complete_lengths = 1; sc.compile_args = !regex->redirect; if (ngx_http_script_compile(&sc) != NGX_OK) { return NGX_CONF_ERROR; } regex = sc.main; regex->size = sc.size; regex->args = sc.args; if (sc.variables == 0 && !sc.dup_capture) { regex->lengths = NULL; } regex_end = ngx_http_script_add_code(lcf->codes, sizeof(ngx_http_script_regex_end_code_t), ®ex); if (regex_end == NULL) { return NGX_CONF_ERROR; } regex_end->code = ngx_http_script_regex_end_code; regex_end->uri = regex->uri; regex_end->args = regex->args; regex_end->add_args = regex->add_args; regex_end->redirect = regex->redirect; if (last) { code = ngx_http_script_add_code(lcf->codes, sizeof(uintptr_t), ®ex); if (code == NULL) { return NGX_CONF_ERROR; } *code = NULL; } regex->next = (u_char *) lcf->codes->elts + lcf->codes->nelts - (u_char *) regex; return NGX_CONF_OK; }
static char * ngx_http_rewrite_return(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) { ngx_http_rewrite_loc_conf_t *lcf = conf; u_char *p; ngx_str_t *value, *v; ngx_http_script_return_code_t *ret; ngx_http_compile_complex_value_t ccv; ret = ngx_http_script_start_code(cf->pool, &lcf->codes, sizeof(ngx_http_script_return_code_t)); if (ret == NULL) { return NGX_CONF_ERROR; } value = cf->args->elts; ngx_memzero(ret, sizeof(ngx_http_script_return_code_t)); ret->code = ngx_http_script_return_code; p = value[1].data; ret->status = ngx_atoi(p, value[1].len); if (ret->status == (uintptr_t) NGX_ERROR) { if (cf->args->nelts == 2 && (ngx_strncmp(p, "http://", sizeof("http://") - 1) == 0 || ngx_strncmp(p, "https://", sizeof("https://") - 1) == 0 || ngx_strncmp(p, "$scheme", sizeof("$scheme") - 1) == 0)) { ret->status = NGX_HTTP_MOVED_TEMPORARILY; v = &value[1]; } else { ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "invalid return code \"%V\"", &value[1]); return NGX_CONF_ERROR; } } else { if (cf->args->nelts == 2) { return NGX_CONF_OK; } v = &value[2]; } ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t)); ccv.cf = cf; ccv.value = v; ccv.complex_value = &ret->text; if (ngx_http_compile_complex_value(&ccv) != NGX_OK) { return NGX_CONF_ERROR; } return NGX_CONF_OK; }
static char * ndk_set_var_filter (ngx_conf_t *cf, ndk_http_rewrite_loc_conf_t *rlcf, ndk_set_var_t *filter) { ndk_set_var_code_t *sv; ndk_set_var_size_code_t *svs; ndk_set_var_data_code_t *svd; ndk_set_var_size_data_code_t *svsd; if (filter == NULL) { return "no filter set"; } switch (filter->type) { case NDK_SET_VAR_BASIC : sv = ngx_http_script_start_code (cf->pool, &rlcf->codes, sizeof(ndk_set_var_code_t)); if (sv == NULL) { return NGX_CONF_ERROR; } sv->code = ndk_set_var_code; sv->func = filter->func; break; case NDK_SET_VAR_DATA : svd = ngx_http_script_start_code (cf->pool, &rlcf->codes, sizeof(ndk_set_var_data_code_t)); if (svd == NULL) { return NGX_CONF_ERROR; } svd->code = ndk_set_var_data_code; svd->func = filter->func; svd->data = filter->data; break; case NDK_SET_VAR_VALUE : sv = ngx_http_script_start_code (cf->pool, &rlcf->codes, sizeof(ndk_set_var_code_t)); if (sv == NULL) { return NGX_CONF_ERROR; } sv->code = ndk_set_var_value_code; sv->func = filter->func; break; case NDK_SET_VAR_VALUE_DATA : svd = ngx_http_script_start_code (cf->pool, &rlcf->codes, sizeof(ndk_set_var_data_code_t)); if (svd == NULL) { return NGX_CONF_ERROR; } svd->code = ndk_set_var_value_data_code; svd->func = filter->func; svd->data = filter->data; break; case NDK_SET_VAR_MULTI_VALUE : svs = ngx_http_script_start_code (cf->pool, &rlcf->codes, sizeof(ndk_set_var_size_code_t)); if (svs == NULL) { return NGX_CONF_ERROR; } svs->code = ndk_set_var_multi_value_code; svs->func = filter->func; svs->size = filter->size; ndk_set_variable_value_space (rlcf, svs->size); break; case NDK_SET_VAR_MULTI_VALUE_DATA : svsd = ngx_http_script_start_code (cf->pool, &rlcf->codes, sizeof(ndk_set_var_size_data_code_t)); if (svsd == NULL) { return NGX_CONF_ERROR; } svsd->code = ndk_set_var_multi_value_data_code; svsd->func = filter->func; svsd->size = filter->size; svsd->data = filter->data; ndk_set_variable_value_space (rlcf, svsd->size); break; case NDK_SET_VAR_HASH : svs = ngx_http_script_start_code (cf->pool, &rlcf->codes, sizeof(ndk_set_var_size_code_t)); if (svs == NULL) { return NGX_CONF_ERROR; } svs->code = ndk_set_var_hash_code; svs->func = filter->func; svs->size = filter->size; break; default : ngx_conf_log_error (NGX_LOG_EMERG, cf, 0, "invalid filter type \"%ul\"", filter->type); return NGX_CONF_ERROR; } return NGX_CONF_OK; }
static char* ngx_http_fsutil_common_cmd( ngx_conf_t *cf, ngx_command_t *cmd, void *conf ) { ngx_uint_t i; ngx_uint_t nval; ngx_str_t *value; ngx_str_t optval; ngx_str_t *src; ngx_str_t *dst; ngx_int_t isrc; ngx_int_t idst; ngx_http_rewrite_loc_conf_t *rlcf; fsutil_code_t *code_cmn; rlcf = ( ngx_http_rewrite_loc_conf_t* )ngx_http_conf_get_module_loc_conf( cf, ngx_http_rewrite_module ); # define I_VAR_RC 3 nval = cf->args->nelts; value = cf->args->elts; for ( i = 1; i < 3; i++ ) { if ( value[ i ].len < 2 || value[ i ].data[ 0 ] != '$' ) { ngx_conf_log_error( NGX_LOG_EMERG, cf, 0, "invalid variable name \"%V\"", &value[ i ] ); return NGX_CONF_ERROR; } ++ value[ i ].data; -- value[ i ].len; } src = &value[ 1 ]; dst = &value[ 2 ]; isrc = ngx_http_get_variable_index( cf, src ); if ( NGX_ERROR == isrc ) { return NGX_CONF_ERROR; } idst = ngx_http_get_variable_index( cf, dst ); if ( NGX_ERROR == idst ) { return NGX_CONF_ERROR; } code_cmn = ngx_http_script_start_code( cf->pool, &rlcf->codes, sizeof( fsutil_code_t ) ); if ( NULL == code_cmn ) { return NGX_CONF_ERROR; } code_cmn->code = ngx_http_fsutil_code_common; code_cmn->op = cmd->offset; code_cmn->opt = fsutil_opt_onexist_ignore; code_cmn->vi_src = isrc; code_cmn->vi_dst = idst; code_cmn->vi_rc = -1; code_cmn->null = ( uintptr_t )NULL; for ( i = 3; i < nval; i++ ) { if ( xstr_pref( value[ i ], K_ONEXIST ) ) { optval.data = &value[ i ].data[ KLEN_ONEXIST ]; optval.len = value[ i ].len - KLEN_ONEXIST; if ( 0 == ngx_strncmp( optval.data, V_IGNORE, VLEN_IGNORE ) ) { code_cmn->opt = fsutil_opt_onexist_ignore; } if ( 0 == ngx_strncmp( optval.data, V_OVERRIDE, VLEN_OVERRIDE ) ) { code_cmn->opt = fsutil_opt_onexist_override; } if ( 0 == ngx_strncmp( optval.data, V_TOUCH, VLEN_TOUCH ) ) { code_cmn->opt = fsutil_opt_onexist_ignore|fsutil_opt_onexist_touch; } } /* TODO add variable rc */ /* TODO add rc to code */ } return NGX_CONF_OK; # undef I_VAR_RC }