# HG changeset patch # User Igor Sysoev # Date 1256142468 0 # Node ID 81b8416054b0bdea814baf4e4631300df5b1392d # Parent 022a7662b4edb40c649e80d1d70e61af69f42ab9 fix r3218: Initially building lists of ports, addresses, and server names had been placed at final configuration stage, because complete set of the "listen"s and the "server_names" were required for this operation. r3218 broke it, because the "listen"s go usually first in configuration, and cscf->server_names is empty at this stage, therefore no virtual names were configured. Now server configurations are stored in array for each address:port to configure virtual names. Also regex captures flag is moved from server names to core server configuration. diff --git a/src/http/ngx_http.c b/src/http/ngx_http.c --- a/src/http/ngx_http.c +++ b/src/http/ngx_http.c @@ -23,7 +23,7 @@ static ngx_int_t ngx_http_add_addresses( static ngx_int_t ngx_http_add_address(ngx_conf_t *cf, ngx_http_core_srv_conf_t *cscf, ngx_http_conf_port_t *port, ngx_http_listen_t *listen); -static ngx_int_t ngx_http_add_names(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); static char *ngx_http_merge_locations(ngx_conf_t *cf, @@ -1205,7 +1205,7 @@ ngx_http_add_addresses(ngx_conf_t *cf, n /* the address is already in the address list */ - if (ngx_http_add_names(cf, cscf, &addr[i]) != NGX_OK) { + if (ngx_http_add_server(cf, cscf, &addr[i]) != NGX_OK) { return NGX_ERROR; } @@ -1263,56 +1263,41 @@ ngx_http_add_address(ngx_conf_t *cf, ngx addr->hash.size = 0; addr->wc_head = NULL; addr->wc_tail = NULL; - addr->names.elts = NULL; #if (NGX_PCRE) addr->nregex = 0; addr->regex = NULL; #endif addr->core_srv_conf = cscf; + addr->servers.elts = NULL; addr->opt = listen->opt; - return ngx_http_add_names(cf, cscf, addr); + return ngx_http_add_server(cf, cscf, addr); } -/* - * add the server names and the server core module - * configurations to the address:port - */ +/* add the server core module configuration to the address:port */ static ngx_int_t -ngx_http_add_names(ngx_conf_t *cf, ngx_http_core_srv_conf_t *cscf, +ngx_http_add_server(ngx_conf_t *cf, ngx_http_core_srv_conf_t *cscf, ngx_http_conf_addr_t *addr) { - ngx_uint_t i; - ngx_http_server_name_t *server_names, *name; + ngx_http_core_srv_conf_t **server; - if (addr->names.elts == NULL) { - if (ngx_array_init(&addr->names, cf->temp_pool, 4, - sizeof(ngx_http_server_name_t)) + if (addr->servers.elts == NULL) { + if (ngx_array_init(&addr->servers, cf->temp_pool, 4, + sizeof(ngx_http_core_srv_conf_t *)) != NGX_OK) { return NGX_ERROR; } } - server_names = cscf->server_names.elts; - - for (i = 0; i < cscf->server_names.nelts; i++) { - - ngx_strlow(server_names[i].name.data, server_names[i].name.data, - server_names[i].name.len); + server = ngx_array_push(&addr->servers); + if (server == NULL) { + return NGX_ERROR; + } - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, cf->log, 0, - "name: %V", &server_names[i].name); - - name = ngx_array_push(&addr->names); - if (name == NULL) { - return NGX_ERROR; - } - - *name = server_names[i]; - } + *server = cscf; return NGX_OK; } @@ -1322,10 +1307,9 @@ static ngx_int_t ngx_http_optimize_servers(ngx_conf_t *cf, ngx_http_core_main_conf_t *cmcf, ngx_array_t *ports) { - ngx_uint_t s, p, a; - ngx_http_conf_port_t *port; - ngx_http_conf_addr_t *addr; - ngx_http_server_name_t *name; + ngx_uint_t p, a; + ngx_http_conf_port_t *port; + ngx_http_conf_addr_t *addr; port = ports->elts; for (p = 0; p < ports->nelts; p++) { @@ -1341,23 +1325,15 @@ ngx_http_optimize_servers(ngx_conf_t *cf addr = port[p].addrs.elts; for (a = 0; a < port[p].addrs.nelts; a++) { - name = addr[a].names.elts; - for (s = 0; s < addr[a].names.nelts; s++) { - - if (addr[a].core_srv_conf == name[s].core_srv_conf + if (addr[a].servers.nelts > 1 #if (NGX_PCRE) - && name[s].captures == 0 + || addr[a].core_srv_conf->captures #endif - ) - { - continue; - } - + ) + { if (ngx_http_server_names(cf, cmcf, &addr[a]) != NGX_OK) { return NGX_ERROR; } - - break; } } @@ -1374,13 +1350,14 @@ static ngx_int_t ngx_http_server_names(ngx_conf_t *cf, ngx_http_core_main_conf_t *cmcf, ngx_http_conf_addr_t *addr) { - ngx_int_t rc; - ngx_uint_t s; - ngx_hash_init_t hash; - ngx_hash_keys_arrays_t ha; - ngx_http_server_name_t *name; + ngx_int_t rc; + ngx_uint_t n, s; + ngx_hash_init_t hash; + ngx_hash_keys_arrays_t ha; + ngx_http_server_name_t *name; + ngx_http_core_srv_conf_t **cscfp; #if (NGX_PCRE) - ngx_uint_t regex, i; + ngx_uint_t regex, i; regex = 0; #endif @@ -1398,35 +1375,40 @@ ngx_http_server_names(ngx_conf_t *cf, ng goto failed; } - name = addr->names.elts; + cscfp = addr->servers.elts; + + for (s = 0; s < addr->servers.nelts; s++) { - for (s = 0; s < addr->names.nelts; s++) { + name = cscfp[s]->server_names.elts; + + for (n = 0; n < cscfp[s]->server_names.nelts; n++) { #if (NGX_PCRE) - if (name[s].regex) { - regex++; - continue; - } + if (name[n].regex) { + regex++; + continue; + } #endif - rc = ngx_hash_add_key(&ha, &name[s].name, name[s].core_srv_conf, - NGX_HASH_WILDCARD_KEY); + rc = ngx_hash_add_key(&ha, &name[n].name, name[n].core_srv_conf, + NGX_HASH_WILDCARD_KEY); - if (rc == NGX_ERROR) { - return NGX_ERROR; - } + if (rc == NGX_ERROR) { + return NGX_ERROR; + } - if (rc == NGX_DECLINED) { - ngx_log_error(NGX_LOG_EMERG, cf->log, 0, - "invalid server name or wildcard \"%V\" on %s", - &name[s].name, addr->opt.addr); - return NGX_ERROR; - } + if (rc == NGX_DECLINED) { + ngx_log_error(NGX_LOG_EMERG, cf->log, 0, + "invalid server name or wildcard \"%V\" on %s", + &name[n].name, addr->opt.addr); + return NGX_ERROR; + } - if (rc == NGX_BUSY) { + if (rc == NGX_BUSY) { ngx_log_error(NGX_LOG_WARN, cf->log, 0, - "conflicting server name \"%V\" on %s, ignored", - &name[s].name, addr->opt.addr); + "conflicting server name \"%V\" on %s, ignored", + &name[n].name, addr->opt.addr); + } } } @@ -1495,9 +1477,16 @@ ngx_http_server_names(ngx_conf_t *cf, ng return NGX_ERROR; } - for (i = 0, s = 0; s < addr->names.nelts; s++) { - if (name[s].regex) { - addr->regex[i++] = name[s]; + i = 0; + + for (s = 0; s < addr->servers.nelts; s++) { + + name = cscfp[s]->server_names.elts; + + for (n = 0; n < cscfp[s]->server_names.nelts; n++) { + if (name[n].regex) { + addr->regex[i++] = name[n]; + } } } diff --git a/src/http/ngx_http_core_module.c b/src/http/ngx_http_core_module.c --- a/src/http/ngx_http_core_module.c +++ b/src/http/ngx_http_core_module.c @@ -2876,7 +2876,6 @@ ngx_http_core_merge_srv_conf(ngx_conf_t #if (NGX_PCRE) sn->regex = NULL; - sn->captures = 0; #endif sn->core_srv_conf = conf; sn->name.len = conf->server_name.len; @@ -3529,11 +3528,12 @@ ngx_http_core_server_name(ngx_conf_t *cf #if (NGX_PCRE) sn->regex = NULL; - sn->captures = 0; #endif sn->core_srv_conf = cscf; sn->name = value[i]; + ngx_strlow(sn->name.data, sn->name.data, sn->name.len); + if (value[i].data[0] != '~') { continue; } @@ -3562,8 +3562,8 @@ ngx_http_core_server_name(ngx_conf_t *cf return NGX_CONF_ERROR; } - sn->captures = (ngx_regex_capture_count(sn->regex) > 0); sn->name = value[i]; + cscf->captures = (ngx_regex_capture_count(sn->regex) > 0); } #else ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, diff --git a/src/http/ngx_http_core_module.h b/src/http/ngx_http_core_module.h --- a/src/http/ngx_http_core_module.h +++ b/src/http/ngx_http_core_module.h @@ -168,7 +168,10 @@ typedef struct { ngx_flag_t merge_slashes; ngx_flag_t underscores_in_headers; - ngx_uint_t listen; /* unsigned listen:1; */ + unsigned listen:1; +#if (NGX_PCRE) + unsigned captures:1; +#endif ngx_http_core_loc_conf_t **named_locations; } ngx_http_core_srv_conf_t; @@ -227,8 +230,6 @@ typedef struct { ngx_hash_wildcard_t *wc_head; ngx_hash_wildcard_t *wc_tail; - ngx_array_t names; /* array of ngx_http_server_name_t */ - #if (NGX_PCRE) ngx_uint_t nregex; ngx_http_server_name_t *regex; @@ -236,6 +237,7 @@ typedef struct { /* the default server configuration for this address:port */ ngx_http_core_srv_conf_t *core_srv_conf; + ngx_array_t servers; /* array of ngx_http_core_srv_conf_t */ ngx_http_listen_opt_t opt; } ngx_http_conf_addr_t; @@ -244,7 +246,6 @@ typedef struct { struct ngx_http_server_name_s { #if (NGX_PCRE) ngx_regex_t *regex; - ngx_uint_t captures; /* unsigned captures:1; */ #endif ngx_http_core_srv_conf_t *core_srv_conf; /* virtual name server conf */ ngx_str_t name; diff --git a/src/http/ngx_http_request.c b/src/http/ngx_http_request.c --- a/src/http/ngx_http_request.c +++ b/src/http/ngx_http_request.c @@ -1704,7 +1704,7 @@ ngx_http_find_virtual_server(ngx_http_re for (i = 0; i < r->virtual_names->nregex; i++) { - if (sn[i].captures && r->captures == NULL) { + if (sn[i].core_srv_conf->captures && r->captures == NULL) { ncaptures = (NGX_HTTP_MAX_CAPTURES + 1) * 3;