X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=nginx%2Fsrc%2Fhttp%2Fngx_http_request.c;h=95a392a82cdf82a1b0e30a9f0b8a920dd4bb0d92;hb=a90f3dd9fbdd4e92ff65a9f0554794d283ef92bc;hp=3a1c5f7003cd4b861a3a992293523cfea2e1e9f3;hpb=850af026c3ce216b181a85b017f7c9d70492ad41;p=nginx.git diff --git a/nginx/src/http/ngx_http_request.c b/nginx/src/http/ngx_http_request.c index 3a1c5f7..95a392a 100644 --- a/nginx/src/http/ngx_http_request.c +++ b/nginx/src/http/ngx_http_request.c @@ -232,13 +232,19 @@ ngx_http_init_request(ngx_event_t *rev) ngx_uint_t i; ngx_connection_t *c; ngx_http_request_t *r; - ngx_http_in_port_t *hip; - ngx_http_in_addr_t *hia; + struct sockaddr_in *sin; + ngx_http_port_t *port; + ngx_http_in_addr_t *addr; ngx_http_log_ctx_t *ctx; + ngx_http_addr_conf_t *addr_conf; ngx_http_connection_t *hc; ngx_http_core_srv_conf_t *cscf; ngx_http_core_loc_conf_t *clcf; ngx_http_core_main_conf_t *cmcf; +#if (NGX_HAVE_INET6) + struct sockaddr_in6 *sin6; + ngx_http_in6_addr_t *addr6; +#endif #if (NGX_STAT_STUB) ngx_atomic_fetch_add(ngx_stat_reading, -1); @@ -292,58 +298,84 @@ ngx_http_init_request(ngx_event_t *rev) /* find the server configuration for the address:port */ - /* AF_INET only */ - - hip = c->listening->servers; - hia = hip->addrs; - - r->port = hip->port; - r->port_text = &hip->port_text; - - i = 0; + port = c->listening->servers; r->connection = c; - if (hip->naddrs > 1) { + if (port->naddrs > 1) { /* - * There are several addresses on this port and one of them - * is the "*:port" wildcard so getsockname() is needed to determine - * the server address. - * - * AcceptEx() already has given this address. + * there are several addresses on this port and one of them + * is an "*:port" wildcard so getsockname() in ngx_http_server_addr() + * is required to determine a server address */ -#if (NGX_WIN32) - if (c->local_sockaddr) { - r->in_addr = - ((struct sockaddr_in *) c->local_sockaddr)->sin_addr.s_addr; + c->local_sockaddr = NULL; - } else -#endif - { - if (ngx_http_server_addr(r, NULL) != NGX_OK) { - ngx_http_close_connection(c); - return; - } + if (ngx_http_server_addr(r, NULL) != NGX_OK) { + ngx_http_close_connection(c); + return; } - /* the last address is "*" */ + switch (c->local_sockaddr->sa_family) { - for ( /* void */ ; i < hip->naddrs - 1; i++) { - if (hia[i].addr == r->in_addr) { - break; +#if (NGX_HAVE_INET6) + case AF_INET6: + sin6 = (struct sockaddr_in6 *) c->local_sockaddr; + + addr6 = (ngx_http_in6_addr_t *) port->addrs; + + /* the last address is "*" */ + + for (i = 0; i < port->naddrs - 1; i++) { + if (ngx_memcmp(&addr6[i].addr6, &sin6->sin6_addr, 16) == 0) { + break; + } } + + addr_conf = &addr6[i].conf; + + break; +#endif + + default: /* AF_INET */ + sin = (struct sockaddr_in *) c->local_sockaddr; + + addr = port->addrs; + + /* the last address is "*" */ + + for (i = 0; i < port->naddrs - 1; i++) { + if (addr[i].addr == sin->sin_addr.s_addr) { + break; + } + } + + addr_conf = &addr[i].conf; + + break; } } else { - r->in_addr = hia[0].addr; - } - r->virtual_names = hia[i].virtual_names; + switch (c->local_sockaddr->sa_family) { + +#if (NGX_HAVE_INET6) + case AF_INET6: + addr6 = (ngx_http_in6_addr_t *) port->addrs; + addr_conf = &addr6[0].conf; + break; +#endif + + default: /* AF_INET */ + addr = port->addrs; + addr_conf = &addr[0].conf; + break; + } + } /* the default server configuration for the address:port */ - cscf = hia[i].core_srv_conf; + cscf = addr_conf->core_srv_conf; r->main_conf = cscf->ctx->main_conf; r->srv_conf = cscf->ctx->srv_conf; @@ -357,13 +389,13 @@ ngx_http_init_request(ngx_event_t *rev) ngx_http_ssl_srv_conf_t *sscf; sscf = ngx_http_get_module_srv_conf(r, ngx_http_ssl_module); - if (sscf->enable || hia[i].ssl) { + if (sscf->enable || addr_conf->ssl) { if (c->ssl == NULL) { c->log->action = "SSL handshaking"; - if (hia[i].ssl && sscf->ssl.ctx == NULL) { + if (addr_conf->ssl && sscf->ssl.ctx == NULL) { ngx_log_error(NGX_LOG_ERR, c->log, 0, "no \"ssl_certificate\" is defined " "in server listening on SSL port"); @@ -372,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; @@ -415,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; @@ -775,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; @@ -784,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; @@ -1579,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; } @@ -1600,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; @@ -1608,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; @@ -1617,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) { + + ncaptures = (NGX_HTTP_MAX_CAPTURES + 1) * 3 * sizeof(int); + + 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; + } - for (i = 0; i < r->virtual_names->nregex; i++) { + ngx_memcpy(server, buf, len); + name.data = server; + } + } - n = ngx_regex_exec(sn[i].regex, &name, NULL, 0); + n = ngx_regex_exec(sn[i].regex, &name, r->captures, ncaptures); if (n == NGX_REGEX_NO_MATCHED) { continue; @@ -1639,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; } }