ПРОЕКТЫ 


  АРХИВ 


Apache-Talk @lexa.ru 

Inet-Admins @info.east.ru 

Filmscanners @halftone.co.uk 

Security-alerts @yandex-team.ru 

nginx-ru @sysoev.ru 


  СТАТЬИ 


  ПЕРСОНАЛЬНОЕ 


  ПРОГРАММЫ 



ПИШИТЕ
ПИСЬМА












     АРХИВ :: nginx-ru
Nginx-ru mailing list archive (nginx-ru@sysoev.ru)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

The location configuration bug?



Добрый день,
 
Обнаружил следующие "странности" при обработке конфигурации "location" уровня
в модуле-фильтре:
 
worker_processes  1;
daemon off;
master_process off;
* * * *
http {
   * * *
   server {
       * * *
      location / {
        use on;
        debug on;
      }
 
      location /backend {
         proxy_pass ....;
      }
   }
}
 
=============================================================
 
typedef struct {
    ngx_flag_t use;
    ngx_flag_t debug;
} ngx_http_draft_loc_conf_t;
 
static ngx_command_t  ngx_http_draft_filter_commands[] = {
    { ngx_string("use"),
      NGX_HTTP_LOC_CONF | NGX_CONF_FLAG,
      ngx_conf_set_flag_slot,
      NGX_HTTP_LOC_CONF_OFFSET,
      offsetof(ngx_http_draft_loc_conf_t, enable),
      NULL },
    { ngx_string("debug"),
      NGX_HTTP_LOC_CONF | NGX_CONF_FLAG,
      ngx_conf_set_flag_slot,
      NGX_HTTP_LOC_CONF_OFFSET,
      offsetof(ngx_http_draft_loc_conf_t, debug),
      NULL },
    ngx_null_command
};
static ngx_http_module_t  ngx_http_draft_module_ctx = {
    NULL,                                  // preconfiguration
    ngx_http_draft_filter_init,        // postconfiguration
 
    NULL,                                  // create main configuration
    NULL,                                  // init main configuration
 
    NULL,                                  // create server configuration
    NULL,                                  // merge server configuration
 
    ngx_http_draft_create_loc_conf,         // create location configuration
    ngx_http_draft_merge_loc_conf           // merge location configuration
};
static ngx_int_t ngx_http_draft_filter_init ( ngx_conf_t* cf )
{
    ngx_http_next_header_filter = ngx_http_top_header_filter;
    ngx_http_top_header_filter  = ngx_http_draft_header_filter;
 
    ngx_http_next_body_filter = ngx_http_top_body_filter;
    ngx_http_top_body_filter  = ngx_http_draft_body_filter;
 
    return NGX_OK;
}
static void* ngx_http_draft_create_loc_conf ( ngx_conf_t* cf )
{
    unsigned i;
    ngx_http_draft_loc_conf_t* conf;
 
    conf = ngx_pcalloc ( cf->pool, sizeof(ngx_http_draft_loc_conf_t) );
    if ( conf == NULL ) return NGX_CONF_ERROR;
 
    printf("ngx_http_draft_create_loc_conf('%s', %p, %d)\n", cf->name, cf->args,  cf->args->nelts);
    char** arr = cf->args->elts; // какой формат элементов массива?
    for (i = 0; i < cf->args->nelts; i++)
    {
       printf("[%p]\n", arr[i]);
    }
 
    conf->use = NGX_CONF_UNSET;
    conf->debug  = NGX_CONF_UNSET;
 
    return conf;
}
static char* ngx_http_draft_merge_loc_conf ( ngx_conf_t* cf, void* parent, void* child )
{
    unsigned int i;
    ngx_http_draft_loc_conf_t* prev = parent;
    ngx_http_draft_loc_conf_t* conf = child;
 
    ngx_conf_merge_value ( conf->use, prev->use, 0 );
    ngx_conf_merge_value ( conf->debug, prev->debug, 0 );
 
    printf("ngx_http_draft_merge_loc_conf('%s', %p, %d): use: %d, debug: %d\n", 
    cf->name, cf->args,  cf->args->nelts, conf->use, conf->debug);
 
    return NGX_CONF_OK;
}

===========================================================================
$ sbin/nginx -t
 
ngx_http_draft_create_loc_conf('(null)', 0x80b3878, 1)
[0x4]                                                                             - какой формат?
ngx_http_draft_create_loc_conf('(null)', 0x80b3878, 1)
[0x6]
ngx_http_draft_create_loc_conf('(null)', 0x80b3878, 2)
[0x8]
[0x80c1b7c]
ngx_http_draft_create_loc_conf('(null)', 0x80b3878, 2)
[0x8]
[0x80c2130]

ngx_http_draft_merge_loc_conf('(null)', 0x80b3878, 0): use: 0, debug: 0
ngx_http_draft_merge_loc_conf('(null)', 0x80b3878, 0): use: 1, debug: 1
ngx_http_draft_merge_loc_conf('(null)', 0x80b3878, 0): use: 0, debug: 0

2007/10/09 17:41:14 [info] 18647#0: the configuration file conf/nginx.conf syntax is ok
2007/10/09 17:41:14 [info] 18647#0: the configuration file conf/nginx.conf was tested successfully
 
===========================================================================
 
1) Откуда вызовы до "location / {}" ?
2) Число вызовов "ngx_http_draft_create_loc_conf" и "ngx_http_draft_merge_loc_conf" несовпадает?
3) Последний вызов "ngx_http_draft_merge_loc_conf" (видимо "location /backend {}"?) сбрасывает use и debug.
 
В результате, если получить указатель
ngx_http_draft_loc_conf_t* conf = ngx_http_get_module_loc_conf ( r, ngx_http_draft_filter_module );
в ngx_http_draft_body_filter( url = "" ), то получим:
 
conf->use = conf->debug = 0
 
 
 
 
 
 


 




Copyright © Lexa Software, 1996-2009.