X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;ds=sidebyside;f=nginx%2Fsrc%2Fhttp%2Fngx_http_request.c;h=95a392a82cdf82a1b0e30a9f0b8a920dd4bb0d92;hb=a90f3dd9fbdd4e92ff65a9f0554794d283ef92bc;hp=f03b574f90bc1515ad5f94f3a3c0c2bca43f7710;hpb=e434499c48d7edbe43d3e2cd2424650751f5d4b9;p=nginx.git diff --git a/nginx/src/http/ngx_http_request.c b/nginx/src/http/ngx_http_request.c index f03b574..95a392a 100644 --- a/nginx/src/http/ngx_http_request.c +++ b/nginx/src/http/ngx_http_request.c @@ -300,9 +300,6 @@ ngx_http_init_request(ngx_event_t *rev) port = c->listening->servers; - r->port = port->port; - r->port_text = &port->port_text; - r->connection = c; if (port->naddrs > 1) { @@ -373,13 +370,10 @@ ngx_http_init_request(ngx_event_t *rev) default: /* AF_INET */ addr = port->addrs; addr_conf = &addr[0].conf; - r->in_addr = addr[0].addr; break; } } - r->virtual_names = addr_conf->virtual_names; - /* the default server configuration for the address:port */ cscf = addr_conf->core_srv_conf; @@ -410,7 +404,7 @@ ngx_http_init_request(ngx_event_t *rev) } if (ngx_ssl_create_connection(&sscf->ssl, c, NGX_SSL_BUFFER) - == NGX_ERROR) + != NGX_OK) { ngx_http_close_connection(c); return; @@ -453,7 +447,7 @@ ngx_http_init_request(ngx_event_t *rev) if (ngx_list_init(&r->headers_out.headers, r->pool, 20, sizeof(ngx_table_elt_t)) - == NGX_ERROR) + != NGX_OK) { ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); return; @@ -813,7 +807,7 @@ ngx_http_process_request_line(ngx_event_t *rev) if (ngx_list_init(&r->headers_in.headers, r->pool, 20, sizeof(ngx_table_elt_t)) - == NGX_ERROR) + != NGX_OK) { ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); return; @@ -822,7 +816,7 @@ ngx_http_process_request_line(ngx_event_t *rev) if (ngx_array_init(&r->headers_in.cookies, r->pool, 2, sizeof(ngx_table_elt_t *)) - == NGX_ERROR) + != NGX_OK) { ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); return; @@ -1617,12 +1611,17 @@ static ngx_int_t ngx_http_find_virtual_server(ngx_http_request_t *r, u_char *host, size_t len) { u_char *server; + size_t ncaptures; ngx_uint_t hash; + ngx_http_virtual_names_t *vn; ngx_http_core_loc_conf_t *clcf; ngx_http_core_srv_conf_t *cscf; u_char buf[32]; - if (r->virtual_names == NULL) { + cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module); + vn = cscf->virtual_names; + + if (vn == NULL) { return NGX_DECLINED; } @@ -1638,7 +1637,7 @@ ngx_http_find_virtual_server(ngx_http_request_t *r, u_char *host, size_t len) hash = ngx_hash_strlow(server, host, len); - cscf = ngx_hash_find_combined(&r->virtual_names->names, hash, server, len); + cscf = ngx_hash_find_combined(&vn->names, hash, server, len); if (cscf) { goto found; @@ -1646,7 +1645,7 @@ ngx_http_find_virtual_server(ngx_http_request_t *r, u_char *host, size_t len) #if (NGX_PCRE) - if (r->virtual_names->nregex) { + if (vn->nregex) { ngx_int_t n; ngx_uint_t i; ngx_str_t name; @@ -1655,11 +1654,33 @@ ngx_http_find_virtual_server(ngx_http_request_t *r, u_char *host, size_t len) name.len = len; name.data = server; - sn = r->virtual_names->regex; + ncaptures = 0; + + sn = vn->regex; + + for (i = 0; i < vn->nregex; i++) { + + if (sn[i].captures && r->captures == NULL) { - for (i = 0; i < r->virtual_names->nregex; i++) { + ncaptures = (NGX_HTTP_MAX_CAPTURES + 1) * 3 * sizeof(int); - n = ngx_regex_exec(sn[i].regex, &name, NULL, 0); + r->captures = ngx_palloc(r->pool, ncaptures); + 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, ncaptures); if (n == NGX_REGEX_NO_MATCHED) { continue; @@ -1677,6 +1698,9 @@ ngx_http_find_virtual_server(ngx_http_request_t *r, u_char *host, size_t len) cscf = sn[i].core_srv_conf; + r->ncaptures = ncaptures; + r->captures_data = server; + goto found; } }