示例#1
0
static ngx_int_t
ngx_http_vod_add_variables(ngx_conf_t *cf)
{
	ngx_http_variable_t  *var;

	// filepath
	var = ngx_http_add_variable(cf, &ngx_http_vod_filepath, NGX_HTTP_VAR_NOCACHEABLE);
	if (var == NULL) 
	{
		return NGX_ERROR;
	}

	var->get_handler = ngx_http_vod_set_filepath_var;

	// suburi
	var = ngx_http_add_variable(cf, &ngx_http_vod_suburi, NGX_HTTP_VAR_NOCACHEABLE);
	if (var == NULL)
	{
		return NGX_ERROR;
	}

	var->get_handler = ngx_http_vod_set_suburi_var;

	return NGX_OK;
}
static char *
ngx_http_advertise_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)
{
    ngx_http_advertise_conf_t  *prev = parent;
    ngx_http_advertise_conf_t  *conf = child;
    ngx_http_variable_t        *var;
    
    ngx_conf_merge_value(conf->inject, prev->inject, 0);    
    ngx_conf_merge_size_value(conf->buffer_size, prev->buffer_size, 1 * 1024 * 1024);
    ngx_conf_merge_ptr_value(conf->advertise_array, prev->advertise_array, NGX_CONF_UNSET_PTR);
    ngx_conf_merge_size_value(conf->min_content_len, prev->min_content_len, 48);
    ngx_conf_merge_uint_value(conf->max_advertise_len, prev->max_advertise_len, 0);
    
#if (NGX_PCRE)
    ngx_conf_merge_ptr_value(conf->black_hosts, prev->black_hosts, NGX_CONF_UNSET_PTR)
#endif

    var = ngx_http_add_variable(cf, &g_advertise_inject_ctx_s, NGX_HTTP_VAR_CHANGEABLE);
    if (var == NULL) {
        return NGX_CONF_ERROR;
    }

    conf->index = ngx_http_get_variable_index(cf, &g_advertise_inject_ctx_s);
    if (conf->index == NGX_ERROR) {
        return NGX_CONF_ERROR;
    }
    
    
    var->get_handler = ngx_http_g_ctx_gethandler;
    var->data = conf->index;

    var = ngx_http_add_variable(cf,  &g_advertise_status_s, NGX_HTTP_VAR_CHANGEABLE);
    var->get_handler = ngx_http_status_gethandler;
    return NGX_CONF_OK;
}
示例#3
0
//adds the dclass variable to the config
static ngx_int_t ngx_http_dclass_add_variables(ngx_conf_t *cf)
{
    int i,len;
    u_char buf[128];
    ngx_str_t str;
    ngx_http_variable_t *var;
    
    ngx_str_set(&str,"dclass_ptr");
    
    var=ngx_http_add_variable(cf,&str,NGX_HTTP_VAR_INDEXED);
    
    if(var==NULL)
        return NGX_ERROR;

    var->get_handler=ngx_http_dclass_pointer;
    var->data=0;
    
    ngx_log_error(NGX_HTTP_DCLASS_LOGLEVEL,cf->log,0,"dClass: variable: '%s'","dclass_ptr");
    
    ngx_str_set(&str,"dclass_id");
    
    var=ngx_http_add_variable(cf,&str,NGX_HTTP_VAR_INDEXED);
    
    if(var==NULL)
        return NGX_ERROR;

    var->get_handler=ngx_http_dclass_variable;
    var->data=0;
    
    ngx_log_error(NGX_HTTP_DCLASS_LOGLEVEL,cf->log,0,"dClass: variable: '%s'","dclass_id");
    
    len=sizeof(ngx_dclass_key_array)/sizeof(*ngx_dclass_key_array);
    
    for(i=0;i<len;i++)
    {
        ngx_cpystrn(buf,(u_char*)"dclass_",8);
        ngx_cpystrn(buf+7,(u_char*)ngx_dclass_key_array[i],ngx_strlen(ngx_dclass_key_array[i])+1);
        
        str.data=buf;
        str.len=ngx_strlen(buf);
        
        var=ngx_http_add_variable(cf,&str,NGX_HTTP_VAR_INDEXED);
    
        if(var==NULL)
            return NGX_ERROR;

        var->get_handler=ngx_http_dclass_variable;
        var->data=i+1;
        
        ngx_log_error(NGX_HTTP_DCLASS_LOGLEVEL,cf->log,0,"dClass: variable: '%s'",buf);
    }

    return NGX_OK;
}
示例#4
0
static char *
ngx_http_js_set(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
{
    ngx_str_t            *value, *fname;
    ngx_http_variable_t  *v;

    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;
    }

    fname = ngx_palloc(cf->pool, sizeof(ngx_str_t));
    if (fname == NULL) {
        return NGX_CONF_ERROR;
    }

    *fname = value[2];

    v->get_handler = ngx_http_js_variable;
    v->data = (uintptr_t) fname;

    return NGX_CONF_OK;
}
static char *
ngx_http_add_form_variable(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
{
    ngx_str_t                 *value, *str;
    ngx_http_variable_t       *var;

    value = cf->args->elts;

    str = ngx_palloc(cf->pool, sizeof(ngx_str_t));
    if (str == NULL) {
        return NGX_CONF_ERROR;
    }

    *str = value[1];

    if (str->data[0] == '$') {
        str->data++;
        str->len--;
    }

    var = ngx_http_add_variable(cf, str, 0);
    if (var == NULL) {
        return NGX_CONF_ERROR;
    }

    var->get_handler = ngx_http_recaptcha_form_variable;
    var->data = (uintptr_t) str;

    return NGX_CONF_OK;
}
static ngx_int_t
ngx_http_reqstat_add_variable(ngx_conf_t *cf)
{
    ngx_str_t                  name = ngx_string("reqstat_enable");
    ngx_http_variable_t       *var;
    ngx_http_reqstat_conf_t   *rmcf;

    rmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_reqstat_module);

    var = ngx_http_add_variable(cf, &name, 0);
    if (var == NULL) {
        return NGX_ERROR;
    }

    var->get_handler = ngx_http_reqstat_variable_enable;
    var->data = 0;

    rmcf->index = ngx_http_get_variable_index(cf, &name);

    if (rmcf->index == NGX_ERROR) {
        return NGX_ERROR;
    }

    return NGX_OK;
}
static char *
ngx_http_perl_set(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
{
    ngx_int_t                   index;
    ngx_str_t                  *value;
    ngx_http_variable_t        *v;
    ngx_http_perl_variable_t   *pv;
    ngx_http_perl_main_conf_t  *pmcf;
    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;
    }
    pv = ngx_palloc(cf->pool, sizeof(ngx_http_perl_variable_t));
    if (pv == NULL)
    {
        return NGX_CONF_ERROR;
    }
    index = ngx_http_get_variable_index(cf, &value[1]);
    if (index == NGX_ERROR)
    {
        return NGX_CONF_ERROR;
    }
    pmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_perl_module);
    if (pmcf->perl == NULL)
    {
        if (ngx_http_perl_init_interpreter(cf, pmcf) != NGX_CONF_OK)
        {
            return NGX_CONF_ERROR;
        }
    }
    pv->handler = value[2];
    {
        dTHXa(pmcf->perl);
        PERL_SET_CONTEXT(pmcf->perl);
        ngx_http_perl_eval_anon_sub(aTHX_ & value[2], &pv->sub);
        if (pv->sub == &PL_sv_undef)
        {
            ngx_conf_log_error(NGX_LOG_ERR, cf, 0,
                               "eval_pv(\"%V\") failed", &value[2]);
            return NGX_CONF_ERROR;
        }
        if (pv->sub == NULL)
        {
            pv->sub = newSVpvn((char *) value[2].data, value[2].len);
        }
    }
    v->get_handler = ngx_http_perl_variable;
    v->data = (uintptr_t) pv;
    return NGX_CONF_OK;
}
static char *
ngx_http_geoip2_add_variable(ngx_conf_t *cf, ngx_command_t *dummy, void *conf)
{
    ngx_str_t               *value, name;
    ngx_http_geoip2_ctx_t   *geoip2;
    ngx_http_variable_t     *var;
    int                     i, nelts, idx;
    char                    *prefix = "default=";
    size_t                  prefix_len = sizeof("default=") - 1;

    geoip2 = ngx_pcalloc(cf->pool, sizeof(ngx_http_geoip2_ctx_t));
    if (geoip2 == NULL) {
        return NGX_CONF_ERROR;
    }

    value = cf->args->elts;
    name = value[0];

    if (name.data[0] != '$') {
        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
                           "invalid variable name \"%V\"", &name);
        return NGX_CONF_ERROR;
    }

    name.len--;
    name.data++;
    nelts = (int) cf->args->nelts;
    idx = 1;
    geoip2->database = (ngx_http_geoip2_db_t *) conf;

    if (nelts > idx && value[idx].len >= prefix_len &&
        ngx_strncmp(value[idx].data, prefix, prefix_len) == 0) {
        geoip2->default_value.len = value[idx].len - prefix_len;
        geoip2->default_value.data = value[idx].data + prefix_len;
        idx++;
    }

    var = ngx_http_add_variable(cf, &name, NGX_HTTP_VAR_CHANGEABLE);
    if (var == NULL) {
        return NGX_CONF_ERROR;
    }

    geoip2->lookup = ngx_pcalloc(cf->pool, sizeof(const char *) *
                                 (cf->args->nelts - (idx - 1)));

    if (geoip2->lookup == NULL) {
        return NGX_CONF_ERROR;
    }

    for (i = idx; i < nelts; i++) {
        geoip2->lookup[i - idx] = (char *) value[i].data;
    }
    geoip2->lookup[i - idx] = NULL;

    var->get_handler = ngx_http_geoip2_variable;
    var->data = (uintptr_t) geoip2;

    return NGX_CONF_OK;
}
/*
1. 调用ngx_regex_compile编译正则表达式,并且得到相关的数据,比如子模式数目,命名子模式数目,列表等。
2.	将正则表达式信息存储到ngx_http_regex_t里面,包括正则句柄,子模式数目
3. 	将命名子模式 加入到cmcf->variables_keys和cmcf->variables中。以备后续通过名字查找变量值。*/
ngx_http_regex_t * ngx_http_regex_compile(ngx_conf_t *cf, ngx_regex_compile_t *rc) {
    u_char                     *p;
    size_t                      size;
    ngx_str_t                   name;
    ngx_uint_t                  i, n;
    ngx_http_variable_t        *v;
    ngx_http_regex_t           *re;
    ngx_http_regex_variable_t  *rv;
    ngx_http_core_main_conf_t  *cmcf;

    rc->pool = cf->pool;
    if (ngx_regex_compile(rc) != NGX_OK) {//调用pcre_compile编译正则表达。返回结果存在rc->regex = re;
        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "%V", &rc->err);
        return NULL;
    }
    re = ngx_pcalloc(cf->pool, sizeof(ngx_http_regex_t));
    if (re == NULL) {
        return NULL;
    }

    re->regex = rc->regex;
    re->ncaptures = rc->captures;//得到$2,$3有多少个。pcre_fullinfo(re, NULL, PCRE_INFO_CAPTURECOUNT, &rc->captures);
    cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);
    cmcf->ncaptures = ngx_max(cmcf->ncaptures, re->ncaptures);
    n = (ngx_uint_t) rc->named_captures;//命名的子模式: pcre_fullinfo(re, NULL, PCRE_INFO_NAMECOUNT, &rc->named_captures);
    if (n == 0) {
        return re;
    }
    rv = ngx_palloc(rc->pool, n * sizeof(ngx_http_regex_variable_t));
    if (rv == NULL) {//为每一个命名变量申请空间单独存储。
        return NULL;
    }
    re->variables = rv;//记录这种命名的子模式
    re->nvariables = n;
    re->name = rc->pattern;//记录正则表达式字符串

    size = rc->name_size;
    p = rc->names;//正则的命名子模式的二维表,里面记录了子模式的名称,以及在所有模式中的下标.
    //names是这么得到的: pcre_fullinfo(re, NULL, PCRE_INFO_NAMETABLE, &rc->names);
    //一个命名子模式的二维表存储在p的位置。每一行是一个命名模式,每行的字节数为name_size
    for (i = 0; i < n; i++) {//遍历每一个named_captures,
        rv[i].capture = 2 * ((p[0] << 8) + p[1]);//第一个自己左移8位+第二个字节等于这个命名子模式在所有模式中的下标。
        name.data = &p[2];//第三个字节开始就是命名的名字。
        name.len = ngx_strlen(name.data);//名字长度
		///将这个命名子模式加入到cmcf->variables_keys中
        v = ngx_http_add_variable(cf, &name, NGX_HTTP_VAR_CHANGEABLE);
        if (v == NULL) {
            return NULL;
        }
		//然后从cmcf->variables中查找这个变量对应的下标是多少,如果没有,当然就增加到里面去。
        rv[i].index = ngx_http_get_variable_index(cf, &name);
        if (rv[i].index == NGX_ERROR) {
            return NULL;
        }
        v->get_handler = ngx_http_variable_not_found;//初始化为空函数
        p += size;
    }
    return re;
}
示例#10
0
    static var_type create(ngx_conf_t *cf, ngx_str_t& name, ngx_uint_t flags = 0)
    {
        auto p = ngx_http_add_variable(cf, &name, flags);

        NgxException::require(p);

        return p;
    }
static char *
ngx_http_txtset(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
{
    ngx_str_t                           *value;
    ngx_http_variable_t                 *v;
    txtvar_info                         *element;

    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;
    }

    v->get_handler = ngx_http_txtset_txtvariable;

    if ((element = ngx_pcalloc(cf->pool, sizeof(txtvar_info))) == NULL) {
        return NGX_CONF_ERROR;
    }

    if ((element->text_file = ngx_pcalloc(cf->pool, value[2].len + 1)) == NULL) {
        return NGX_CONF_ERROR;
    }
    memcpy(element->text_file, value[2].data, value[2].len);
    if ((element->default_value = ngx_pcalloc(cf->pool, value[3].len + 1)) == NULL) {
        return NGX_CONF_ERROR;
    }
    memcpy(element->default_value, value[3].data, value[3].len + 1);

    if (cf->args->nelts > 4) {
        element->cache_life = (ngx_int_t) atoi(value[4].data);
        if (element->cache_life == 0) {
            element->cache_life = TXTSET_CACHE_LIFE;
        }
    } else {
        element->cache_life = TXTSET_CACHE_LIFE;
    }

    if ((element->cached_value = ngx_pcalloc(cf->pool, TXTSET_MAX_SIZE + 1)) == NULL) {
        return NGX_CONF_ERROR;
    }

    element->cached_time == 0;

    v->data = (uintptr_t) element;

    return NGX_CONF_OK;
}
static char *
ngx_http_eval_add_variables(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
{
    ngx_http_eval_loc_conf_t            *ecf = conf;

    ngx_uint_t                           i;
    ngx_int_t                            index;
    ngx_str_t                           *value;
    ngx_http_variable_t                 *v;
    ngx_http_eval_variable_t            *variable;

    value = cf->args->elts;

    ecf->variables = ngx_array_create(cf->pool,
        cf->args->nelts, sizeof(ngx_http_eval_variable_t));

    if(ecf->variables == NULL) {
        return NGX_CONF_ERROR;
    }

    for(i = 1;i<cf->args->nelts;i++) {
        if (value[i].data[0] != '$') {
            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
                               "invalid variable name \"%V\"", &value[1]);
            return NGX_CONF_ERROR;
        }

        variable = ngx_array_push(ecf->variables);
        if(variable == NULL) {
            return NGX_CONF_ERROR;
        }

        value[i].len--;
        value[i].data++;

        v = ngx_http_add_variable(cf, &value[i], NGX_HTTP_VAR_CHANGEABLE);
        if (v == NULL) {
            return NGX_CONF_ERROR;
        }

        index = ngx_http_get_variable_index(cf, &value[i]);
        if (index == NGX_ERROR) {
            return NGX_CONF_ERROR;
        }

        if (v->get_handler == NULL)
        {
            v->get_handler = ngx_http_eval_variable;
            v->data = index;
        }

        variable->variable = v;
        variable->index = index;
    }

    return NGX_CONF_OK;
}
static ngx_int_t ngx_x_rid_header_add_variables(ngx_conf_t *cf)
{
  ngx_http_variable_t* var = ngx_http_add_variable(cf, &ngx_x_rid_header_variable_name, NGX_HTTP_VAR_NOHASH);
  if (var == NULL) {
      return NGX_ERROR;
  }
  var->get_handler = ngx_x_rid_header_get_variable;
  return NGX_OK;
}
static char *
ngx_http_auth_request_set(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
{
    ngx_http_auth_request_conf_t *arcf = conf;
    ngx_str_t                         *value;
    ngx_http_variable_t               *v;
    ngx_http_auth_request_variable_t  *av;
    ngx_http_compile_complex_value_t   ccv;
    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++;
    if (arcf->vars == NGX_CONF_UNSET_PTR)
    {
        arcf->vars = ngx_array_create(cf->pool, 1,
                                      sizeof(ngx_http_auth_request_variable_t));
        if (arcf->vars == NULL)
        {
            return NGX_CONF_ERROR;
        }
    }
    av = ngx_array_push(arcf->vars);
    if (av == NULL)
    {
        return NGX_CONF_ERROR;
    }
    v = ngx_http_add_variable(cf, &value[1], NGX_HTTP_VAR_CHANGEABLE);
    if (v == NULL)
    {
        return NGX_CONF_ERROR;
    }
    av->index = ngx_http_get_variable_index(cf, &value[1]);
    if (av->index == NGX_ERROR)
    {
        return NGX_CONF_ERROR;
    }
    if (v->get_handler == NULL)
    {
        v->get_handler = ngx_http_auth_request_variable;
        v->data = (uintptr_t) av;
    }
    av->set_handler = v->set_handler;
    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));
    ccv.cf = cf;
    ccv.value = &value[2];
    ccv.complex_value = &av->value;
    if (ngx_http_compile_complex_value(&ccv) != NGX_OK)
    {
        return NGX_CONF_ERROR;
    }
    return NGX_CONF_OK;
}
示例#15
0
static char *
ngx_http_user_agent_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
{
    char                      *rv;
    ngx_str_t                 *value, name;
    ngx_conf_t                 save;
    ngx_http_variable_t       *var;
    ngx_http_user_agent_ctx_t *ctx;

    value = cf->args->elts;

    name = value[1];
    name.data++;
    name.len--;

    var = ngx_http_add_variable(cf, &name, NGX_HTTP_VAR_CHANGEABLE);
    if (var == NULL) {
        return NGX_CONF_ERROR;
    }

    ctx = ngx_palloc(cf->pool, sizeof(ngx_http_user_agent_ctx_t));
    if (ctx == NULL) {
        return NGX_CONF_ERROR;
    }

    ctx->pool = cf->pool;
    ctx->trie = ngx_trie_create(ctx->pool);
    if (ctx->trie == NULL) {
        return NGX_CONF_ERROR;
    }

    ctx->default_value = NULL;

    var->get_handler = ngx_http_user_agent_variable;
    var->data = (uintptr_t) ctx;

    save = *cf;
    cf->ctx = ctx;
    cf->handler = ngx_http_user_agent;
    cf->handler_conf = conf;

    rv = ngx_conf_parse(cf, NULL);
    if (NGX_OK != ctx->trie->build_clue(ctx->trie)) {
        return NGX_CONF_ERROR;
    }

    *cf = save;
    if (ctx->default_value == NULL) {
        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "no default value");
        rv = NGX_CONF_ERROR;
    }

    return rv;
}
示例#16
0
  static char *
ngx_http_time_command(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
{
  ngx_http_core_loc_conf_t *clcf;

  ngx_str_t                *argvalues;
  ngx_str_t                 name;
  ngx_str_t                 fmt;

  ngx_http_time_vctx_t *ctx;

  ngx_http_variable_t      *v;
  u_char *buf;
  char*  res;


  clcf  = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);
  argvalues = cf->args->elts;

  if (NULL != 
    (res = ngx_http_get_var_name_str(&argvalues[1], &name))) {
    return res;
  }

  fmt.data = argvalues[2].data;
  fmt.len  = argvalues[2].len;

  buf = ngx_palloc(cf->pool, fmt.len + 1); /* zero tail */
  if (NULL == buf){
    return NGX_CONF_ERROR;
  }

  ngx_memcpy(buf, fmt.data, fmt.len);
  buf[fmt.len] = 0;

  v = ngx_http_add_variable(cf, &name, NGX_HTTP_VAR_CHANGEABLE);

  v->get_handler = ngx_http_time_get_handler;


  ctx = ngx_palloc(cf->pool, sizeof(ngx_http_time_vctx_t));
  if (NULL == ctx){
    return NGX_CONF_ERROR;
  }

  ctx->format.data = buf;
  ctx->format.len = fmt.len;


  v->data = (uintptr_t)ctx;


  return NGX_CONF_OK;
}
static ngx_int_t
ngx_http_gzip_add_variables(ngx_conf_t *cf)
{
    ngx_http_variable_t  *var;
    var = ngx_http_add_variable(cf, &ngx_http_gzip_ratio, NGX_HTTP_VAR_NOHASH);
    if (var == NULL)
    {
        return NGX_ERROR;
    }
    var->get_handler = ngx_http_gzip_ratio_variable;
    return NGX_OK;
}
static ngx_int_t
ngx_http_secure_link_add_variables(ngx_conf_t *cf)
{
    ngx_http_variable_t  *var;

    var = ngx_http_add_variable(cf, &ngx_http_secure_link_name, 0);
    if (var == NULL) {
        return NGX_ERROR;
    }

    var->get_handler = ngx_http_secure_link_variable;

    var = ngx_http_add_variable(cf, &ngx_http_secure_link_expires_name, 0);
    if (var == NULL) {
        return NGX_ERROR;
    }

    var->get_handler = ngx_http_secure_link_expires_variable;

    return NGX_OK;
}
static char * 
ngx_http_verify_header(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
{
	ngx_http_misc_loc_conf_t *mlcf = conf;
	ngx_str_t  *value;	
	ngx_http_variable_t *v;
	ngx_misc_header_t  *p_header;

	if (mlcf->verifyHeader == NULL) {
	
        mlcf->verifyHeader = ngx_array_create(cf->pool, 2, sizeof(ngx_misc_header_t));
        if (mlcf->verifyHeader == NULL) {
            return NGX_CONF_ERROR;
        }
    }
	
	value = cf->args->elts;

	mlcf->number++;
			
	p_header = ngx_array_push(mlcf->verifyHeader);
    if (p_header == NULL) {
        return NGX_CONF_ERROR;
    }
	
	p_header->header = value[2];
	p_header->index = mlcf->number;	
	
	p_header->req_num = ngx_atoi(value[1].data, value[1].len);
    if (p_header->req_num == NGX_ERROR) {
        return "invalid number";
    }

	if (value[3].data[0] != '$') {	
		ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
			"invalid variable name \"%V\"", &value[3]);
		return NGX_CONF_ERROR;
	}

	value[3].len--;
	value[3].data++;

	v = ngx_http_add_variable(cf, &value[3], NGX_HTTP_VAR_NOCACHEABLE);		
	if (v == NULL) {
		return NGX_CONF_ERROR;
	}

	v->get_handler = ngx_http_variable_first_req_initiated;
	
	v->data = (uintptr_t) p_header;

    return NGX_CONF_OK;
}
ngx_int_t
ngx_http_echo_add_variables(ngx_conf_t *cf) {
    ngx_http_variable_t *var, *v;
    for (v = ngx_http_echo_variables; v->name.len; v++) {
        var = ngx_http_add_variable(cf, &v->name, v->flags);
        if (var == NULL) {
            return NGX_ERROR;
        }
        var->get_handler = v->get_handler;
        var->data = v->data;
    }
    return NGX_OK;
}
示例#21
0
static ngx_int_t
ngx_http_slice_add_variables(ngx_conf_t *cf)
{
    ngx_http_variable_t  *var;

    var = ngx_http_add_variable(cf, &ngx_http_slice_range_name, 0);
    if (var == NULL) {
        return NGX_ERROR;
    }

    var->get_handler = ngx_http_slice_range_variable;

    return NGX_OK;
}
示例#22
0
static char *
ndk_set_var_name (ndk_set_var_info_t *info, ngx_str_t *varname)
{
    ngx_int_t                        index;
    ngx_http_variable_t             *v;
    ngx_conf_t                      *cf;
    ndk_http_rewrite_loc_conf_t     *rlcf;
    ngx_str_t                        name;

    name = *varname;

    cf = info->cf;
    rlcf = ngx_http_conf_get_module_loc_conf (cf, ngx_http_rewrite_module);

    if (name.data[0] != '$') {
        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
                           "invalid variable name \"%V\"", &name);
        return NGX_CONF_ERROR;
    }

    name.len--;
    name.data++;

    v = ngx_http_add_variable (cf, &name, NGX_HTTP_VAR_CHANGEABLE);
    if (v == NULL) {
        return NGX_CONF_ERROR;
    }

    index = ngx_http_get_variable_index (cf, &name);
    if (index == NGX_ERROR) {
        return NGX_CONF_ERROR;
    }

    if (v->get_handler == NULL
        && ngx_strncasecmp(name.data, (u_char *) "arg_", 4) != 0
        && ngx_strncasecmp(name.data, (u_char *) "cookie_", 7) != 0
        && ngx_strncasecmp(name.data, (u_char *) "http_", 5) != 0
        && ngx_strncasecmp(name.data, (u_char *) "sent_http_", 10) != 0
        && ngx_strncasecmp(name.data, (u_char *) "upstream_http_", 14) != 0)
    {
        v->get_handler = ndk_http_rewrite_var;
        v->data = index;
    }

    info->v = v;
    info->index = index;
    info->rlcf = rlcf;

    return  NGX_CONF_OK;
}
static char *
ngx_http_limit_access_variable(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
{
    ngx_str_t                     *value, name;
    ngx_uint_t                     i;
    ngx_http_variable_t           *v;
    ngx_http_limit_access_conf_t  *lacf = conf;

    value = cf->args->elts;

    name.len = 0;
    v = NULL;

    for (i = 1; i < cf->args->nelts; i++) {
        if (ngx_strncmp(value[i].data, "zone=", 5) == 0) {
            name.len = value[i].len - 5;
            name.data = value[i].data + 5;
        }

        if (value[i].data[0] == '$') {
            value[i].len--;
            value[i].data++;

            v = ngx_http_add_variable(cf, &value[i], NGX_HTTP_VAR_CHANGEABLE);
            if (v == NULL) {
                return NGX_CONF_ERROR;
            }

            v->get_handler = ngx_http_limit_access_deny_variable;
        }
    }

    if (name.len == 0) {
        return "should set the zone's name.";
    }

    if (v == NULL) {
        return "should set the variable's name.";
    }

    lacf->shm_zone = ngx_shared_memory_add(cf, &name, 0,
            &ngx_http_limit_access_module);
    if (lacf->shm_zone == NULL) {
        return NGX_CONF_ERROR;
    }

    v->data = (uintptr_t) lacf->shm_zone->data;

    return NGX_CONF_OK;
}
static ngx_int_t 
ngx_http_store_plusplus_add_variables(ngx_conf_t *cf)
{
    ngx_http_variable_t             *var;

    var = ngx_http_add_variable(cf, &ngx_http_store_plusplus_file_path_var, NGX_HTTP_VAR_NOHASH);
    if (var == NULL) {
        return NGX_ERROR;
    }

    var->get_handler = ngx_http_store_plusplus_file_path_variable;
   
    return NGX_OK;
}
static ngx_int_t
ngx_lcb_add_variable(ngx_conf_t *cf, ngx_str_t *name)
{
    ngx_http_variable_t *v;

    v = ngx_http_add_variable(cf, name, NGX_HTTP_VAR_CHANGEABLE);
    if (v == NULL) {
        return NGX_ERROR;
    }

    v->get_handler = ngx_lcb_variable_not_found;

    return ngx_http_get_variable_index(cf, name);
}
static ngx_int_t
ngx_http_requestid_add_variables(ngx_conf_t *cf)
{
    ngx_http_variable_t *var;

    var = ngx_http_add_variable(cf, &ngx_http_requestid,
                                NGX_HTTP_VAR_CHANGEABLE);
    if (var == NULL) {
        return NGX_ERROR;
    }

    var->get_handler = ngx_http_requestid_set_variable;

    return NGX_OK;
}
static ngx_int_t preconfig(ngx_conf_t * cf) {
    ngx_http_variable_t * var;

    ngx_conf_log_error(NGX_LOG_DEBUG, cf, 0, "preconfig");

    var = ngx_http_add_variable(cf, (ngx_str_t *)&var_rdns_result_name, NGX_HTTP_VAR_CHANGEABLE);
    if (var == NULL) {
        return NGX_ERROR;
    }
    var->get_handler = var_rdns_result_getter;

    ngx_conf_log_error(NGX_LOG_DEBUG, cf, 0, "(DONE) preconfig");

    return NGX_OK;
}
static ngx_int_t flaxton_logger_init(ngx_conf_t *cf)
{
    ngx_http_variable_t  *var, *v;

    for (v = ngx_http_flaxton_logger_vars; v->name.len; v++) {
        var = ngx_http_add_variable(cf, &v->name, v->flags);
        if (var == NULL) {
            return NGX_ERROR;
        }

        var->get_handler = v->get_handler;
        var->data = v->data;
    }

    return NGX_OK;
}
示例#29
0
//adds the dclass variable to the config
static ngx_int_t ngx_http_dclass_add_class_variable(ngx_conf_t *cf)
{
    ngx_http_variable_t *var;
    ngx_str_t wcv;
    
    ngx_str_set(&wcv, "dclass");
    
    var = ngx_http_add_variable(cf, &wcv, NGX_HTTP_VAR_CHANGEABLE|NGX_HTTP_VAR_NOHASH);
    
    if (var == NULL)
        return NGX_ERROR;

    var->get_handler = ngx_http_dclass_class_variable;

    return NGX_OK;
}
static ngx_int_t
ngx_http_limit_speed_add_ctx_variables(ngx_conf_t *cf)
{
    ngx_http_variable_t  *var;

    var = ngx_http_add_variable(cf, &ngx_http_limit_speed_ctx_var_name,
                                NGX_HTTP_VAR_NOCACHEABLE);
    if (var == NULL) {
        return NGX_ERROR;
    }

    var->get_handler = ngx_http_limit_speed_ctx_variable;
    var->data = 0;

    return NGX_OK;
}