mirror of
https://github.com/nginx/nginx.git
synced 2025-06-12 21:52:41 +08:00
ngx_http_conf_get_module_srv_conf() and ngx_http_conf_get_module_loc_conf()
may be used at merge phase
This commit is contained in:
parent
6d9d07b16a
commit
0ec5492189
@ -26,6 +26,9 @@ static ngx_int_t ngx_http_add_address(ngx_conf_t *cf,
|
|||||||
static ngx_int_t ngx_http_add_server(ngx_conf_t *cf,
|
static ngx_int_t ngx_http_add_server(ngx_conf_t *cf,
|
||||||
ngx_http_core_srv_conf_t *cscf, ngx_http_conf_addr_t *addr);
|
ngx_http_core_srv_conf_t *cscf, ngx_http_conf_addr_t *addr);
|
||||||
|
|
||||||
|
static char *ngx_http_merge_servers(ngx_conf_t *cf,
|
||||||
|
ngx_http_core_main_conf_t *cmcf, ngx_http_module_t *module,
|
||||||
|
ngx_uint_t ctx_index);
|
||||||
static char *ngx_http_merge_locations(ngx_conf_t *cf,
|
static char *ngx_http_merge_locations(ngx_conf_t *cf,
|
||||||
ngx_queue_t *locations, void **loc_conf, ngx_http_module_t *module,
|
ngx_queue_t *locations, void **loc_conf, ngx_http_module_t *module,
|
||||||
ngx_uint_t ctx_index);
|
ngx_uint_t ctx_index);
|
||||||
@ -263,39 +266,9 @@ ngx_http_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (s = 0; s < cmcf->servers.nelts; s++) {
|
rv = ngx_http_merge_servers(cf, cmcf, module, mi);
|
||||||
|
if (rv != NGX_CONF_OK) {
|
||||||
/* merge the server{}s' srv_conf's */
|
goto failed;
|
||||||
|
|
||||||
if (module->merge_srv_conf) {
|
|
||||||
rv = module->merge_srv_conf(cf, ctx->srv_conf[mi],
|
|
||||||
cscfp[s]->ctx->srv_conf[mi]);
|
|
||||||
if (rv != NGX_CONF_OK) {
|
|
||||||
goto failed;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (module->merge_loc_conf) {
|
|
||||||
|
|
||||||
/* merge the server{}'s loc_conf */
|
|
||||||
|
|
||||||
rv = module->merge_loc_conf(cf, ctx->loc_conf[mi],
|
|
||||||
cscfp[s]->ctx->loc_conf[mi]);
|
|
||||||
if (rv != NGX_CONF_OK) {
|
|
||||||
goto failed;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* merge the locations{}' loc_conf's */
|
|
||||||
|
|
||||||
clcf = cscfp[s]->ctx->loc_conf[ngx_http_core_module.ctx_index];
|
|
||||||
|
|
||||||
rv = ngx_http_merge_locations(cf, clcf->locations,
|
|
||||||
cscfp[s]->ctx->loc_conf,
|
|
||||||
module, mi);
|
|
||||||
if (rv != NGX_CONF_OK) {
|
|
||||||
goto failed;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -585,12 +558,75 @@ ngx_http_init_phase_handlers(ngx_conf_t *cf, ngx_http_core_main_conf_t *cmcf)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static char *
|
||||||
|
ngx_http_merge_servers(ngx_conf_t *cf, ngx_http_core_main_conf_t *cmcf,
|
||||||
|
ngx_http_module_t *module, ngx_uint_t ctx_index)
|
||||||
|
{
|
||||||
|
char *rv;
|
||||||
|
ngx_uint_t s;
|
||||||
|
ngx_http_conf_ctx_t *ctx, saved;
|
||||||
|
ngx_http_core_loc_conf_t *clcf;
|
||||||
|
ngx_http_core_srv_conf_t **cscfp;
|
||||||
|
|
||||||
|
cscfp = cmcf->servers.elts;
|
||||||
|
ctx = (ngx_http_conf_ctx_t *) cf->ctx;
|
||||||
|
saved = *ctx;
|
||||||
|
rv = NGX_CONF_OK;
|
||||||
|
|
||||||
|
for (s = 0; s < cmcf->servers.nelts; s++) {
|
||||||
|
|
||||||
|
/* merge the server{}s' srv_conf's */
|
||||||
|
|
||||||
|
ctx->srv_conf = cscfp[s]->ctx->srv_conf;
|
||||||
|
|
||||||
|
if (module->merge_srv_conf) {
|
||||||
|
rv = module->merge_srv_conf(cf, saved.srv_conf[ctx_index],
|
||||||
|
cscfp[s]->ctx->srv_conf[ctx_index]);
|
||||||
|
if (rv != NGX_CONF_OK) {
|
||||||
|
goto failed;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (module->merge_loc_conf) {
|
||||||
|
|
||||||
|
/* merge the server{}'s loc_conf */
|
||||||
|
|
||||||
|
ctx->loc_conf = cscfp[s]->ctx->loc_conf;
|
||||||
|
|
||||||
|
rv = module->merge_loc_conf(cf, saved.loc_conf[ctx_index],
|
||||||
|
cscfp[s]->ctx->loc_conf[ctx_index]);
|
||||||
|
if (rv != NGX_CONF_OK) {
|
||||||
|
goto failed;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* merge the locations{}' loc_conf's */
|
||||||
|
|
||||||
|
clcf = cscfp[s]->ctx->loc_conf[ngx_http_core_module.ctx_index];
|
||||||
|
|
||||||
|
rv = ngx_http_merge_locations(cf, clcf->locations,
|
||||||
|
cscfp[s]->ctx->loc_conf,
|
||||||
|
module, ctx_index);
|
||||||
|
if (rv != NGX_CONF_OK) {
|
||||||
|
goto failed;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
failed:
|
||||||
|
|
||||||
|
*ctx = saved;
|
||||||
|
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static char *
|
static char *
|
||||||
ngx_http_merge_locations(ngx_conf_t *cf, ngx_queue_t *locations,
|
ngx_http_merge_locations(ngx_conf_t *cf, ngx_queue_t *locations,
|
||||||
void **loc_conf, ngx_http_module_t *module, ngx_uint_t ctx_index)
|
void **loc_conf, ngx_http_module_t *module, ngx_uint_t ctx_index)
|
||||||
{
|
{
|
||||||
char *rv;
|
char *rv;
|
||||||
ngx_queue_t *q;
|
ngx_queue_t *q;
|
||||||
|
ngx_http_conf_ctx_t *ctx, saved;
|
||||||
ngx_http_core_loc_conf_t *clcf;
|
ngx_http_core_loc_conf_t *clcf;
|
||||||
ngx_http_location_queue_t *lq;
|
ngx_http_location_queue_t *lq;
|
||||||
|
|
||||||
@ -598,6 +634,9 @@ ngx_http_merge_locations(ngx_conf_t *cf, ngx_queue_t *locations,
|
|||||||
return NGX_CONF_OK;
|
return NGX_CONF_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ctx = (ngx_http_conf_ctx_t *) cf->ctx;
|
||||||
|
saved = *ctx;
|
||||||
|
|
||||||
for (q = ngx_queue_head(locations);
|
for (q = ngx_queue_head(locations);
|
||||||
q != ngx_queue_sentinel(locations);
|
q != ngx_queue_sentinel(locations);
|
||||||
q = ngx_queue_next(q))
|
q = ngx_queue_next(q))
|
||||||
@ -605,6 +644,7 @@ ngx_http_merge_locations(ngx_conf_t *cf, ngx_queue_t *locations,
|
|||||||
lq = (ngx_http_location_queue_t *) q;
|
lq = (ngx_http_location_queue_t *) q;
|
||||||
|
|
||||||
clcf = lq->exact ? lq->exact : lq->inclusive;
|
clcf = lq->exact ? lq->exact : lq->inclusive;
|
||||||
|
ctx->loc_conf = clcf->loc_conf;
|
||||||
|
|
||||||
rv = module->merge_loc_conf(cf, loc_conf[ctx_index],
|
rv = module->merge_loc_conf(cf, loc_conf[ctx_index],
|
||||||
clcf->loc_conf[ctx_index]);
|
clcf->loc_conf[ctx_index]);
|
||||||
@ -619,6 +659,8 @@ ngx_http_merge_locations(ngx_conf_t *cf, ngx_queue_t *locations,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
*ctx = saved;
|
||||||
|
|
||||||
return NGX_CONF_OK;
|
return NGX_CONF_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -56,10 +56,6 @@ typedef struct {
|
|||||||
#define ngx_http_get_module_srv_conf(r, module) (r)->srv_conf[module.ctx_index]
|
#define ngx_http_get_module_srv_conf(r, module) (r)->srv_conf[module.ctx_index]
|
||||||
#define ngx_http_get_module_loc_conf(r, module) (r)->loc_conf[module.ctx_index]
|
#define ngx_http_get_module_loc_conf(r, module) (r)->loc_conf[module.ctx_index]
|
||||||
|
|
||||||
/*
|
|
||||||
* ngx_http_conf_get_module_srv_conf() and ngx_http_conf_get_module_loc_conf()
|
|
||||||
* must not be used at the merge phase because cf->ctx points to http{}'s ctx
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define ngx_http_conf_get_module_main_conf(cf, module) \
|
#define ngx_http_conf_get_module_main_conf(cf, module) \
|
||||||
((ngx_http_conf_ctx_t *) cf->ctx)->main_conf[module.ctx_index]
|
((ngx_http_conf_ctx_t *) cf->ctx)->main_conf[module.ctx_index]
|
||||||
|
Loading…
Reference in New Issue
Block a user