static ngx_int_t ngx_http_eval_add_block(ngx_conf_t *cf, ngx_http_eval_loc_conf_t *conf, ngx_str_t *name) { ngx_http_eval_block_t *block; if(conf->blocks == NULL) { conf->blocks = ngx_array_create(cf->pool, 1, sizeof(ngx_http_eval_block_t)); if(conf->blocks == NULL) { return NGX_ERROR; } } block = ngx_array_push(conf->blocks); if(block == NULL) { return NGX_ERROR; } block->eval_location = *name; if(ngx_http_eval_add_variables(cf, block) != NGX_CONF_OK) { return NGX_ERROR; } return NGX_OK; }
static char * ngx_http_eval_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) { ngx_http_eval_loc_conf_t *ecf, *pecf = conf; char *rv; void *mconf; ngx_str_t name; ngx_uint_t i; ngx_conf_t save; ngx_http_module_t *module; ngx_http_conf_ctx_t *ctx, *pctx; ngx_http_core_loc_conf_t *clcf, *pclcf, *rclcf; ngx_http_core_srv_conf_t *cscf; if(ngx_http_eval_add_variables(cf, cmd, conf) != NGX_CONF_OK) { return NGX_CONF_ERROR; } ctx = ngx_pcalloc(cf->pool, sizeof(ngx_http_conf_ctx_t)); if (ctx == NULL) { return NGX_CONF_ERROR; } pctx = cf->ctx; ctx->main_conf = pctx->main_conf; ctx->srv_conf = pctx->srv_conf; ctx->loc_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_http_max_module); if (ctx->loc_conf == NULL) { return NGX_CONF_ERROR; } for (i = 0; ngx_modules[i]; i++) { if (ngx_modules[i]->type != NGX_HTTP_MODULE) { continue; } module = ngx_modules[i]->ctx; if (module->create_loc_conf) { mconf = module->create_loc_conf(cf); if (mconf == NULL) { return NGX_CONF_ERROR; } ctx->loc_conf[ngx_modules[i]->ctx_index] = mconf; } } ecf = ctx->loc_conf[ngx_http_eval_module.ctx_index]; pclcf = pctx->loc_conf[ngx_http_core_module.ctx_index]; clcf = ctx->loc_conf[ngx_http_core_module.ctx_index]; name.len = sizeof("/eval_") - 1 + NGX_OFF_T_LEN; name.data = ngx_palloc(cf->pool, name.len); if(name.data == NULL) { return NGX_CONF_ERROR; } name.len = ngx_sprintf(name.data, "/eval_%O", (off_t)(uintptr_t)clcf) - name.data; clcf->loc_conf = ctx->loc_conf; clcf->name = name; clcf->exact_match = 0; clcf->noname = 0; clcf->internal = 1; clcf->noregex = 1; cscf = ngx_http_conf_get_module_srv_conf(cf, ngx_http_core_module); rclcf = cscf->ctx->loc_conf[ngx_http_core_module.ctx_index]; if (ngx_http_add_location(cf, &rclcf->locations, clcf) != NGX_OK) { return NGX_CONF_ERROR; } pecf->eval_location = clcf->name; save = *cf; cf->ctx = ctx; cf->cmd_type = NGX_HTTP_LOC_CONF; rv = ngx_conf_parse(cf, NULL); *cf = save; return rv; }