# HG changeset patch # User Igor Sysoev # Date 1236343820 0 # Node ID 2d34fba7cf06c4605ce40049eea7ca84c8dbd4f5 # Parent 163114282d2cae85b4df85e71e2cfa930541d470 captures support in server_name 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 @@ -2819,6 +2819,7 @@ 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; @@ -3420,6 +3421,7 @@ 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]; @@ -3446,6 +3448,7 @@ 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]; } #else 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 @@ -245,6 +245,7 @@ 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 @@ -1653,11 +1653,33 @@ ngx_http_find_virtual_server(ngx_http_re name.len = len; name.data = server; + len = 0; + sn = vn->regex; for (i = 0; i < vn->nregex; i++) { - n = ngx_regex_exec(sn[i].regex, &name, NULL, 0); + if (sn[i].captures && r->captures == NULL) { + + len = (NGX_HTTP_MAX_CAPTURES + 1) * 3 * sizeof(int); + + r->captures = ngx_palloc(r->pool, len); + if (r->captures == NULL) { + return NGX_ERROR; + } + + if (server == buf) { + server = ngx_pnalloc(r->pool, len); + if (server == NULL) { + return NGX_ERROR; + } + + ngx_memcpy(server, buf, len); + name.data = server; + } + } + + n = ngx_regex_exec(sn[i].regex, &name, r->captures, len); if (n == NGX_REGEX_NO_MATCHED) { continue; @@ -1675,6 +1697,9 @@ ngx_http_find_virtual_server(ngx_http_re cscf = sn[i].core_srv_conf; + r->ncaptures = len; + r->captures_data = server; + goto found; } }