Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nginx/nginx.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/http/ngx_http.c')
-rw-r--r--src/http/ngx_http.c57
1 files changed, 51 insertions, 6 deletions
diff --git a/src/http/ngx_http.c b/src/http/ngx_http.c
index 7a2fb85b3..59b43d054 100644
--- a/src/http/ngx_http.c
+++ b/src/http/ngx_http.c
@@ -98,6 +98,9 @@ ngx_http_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
ngx_http_core_loc_conf_t *clcf;
ngx_http_phase_handler_pt checker;
ngx_http_core_main_conf_t *cmcf;
+#if (NGX_PCRE)
+ ngx_uint_t regex;
+#endif
#if (NGX_WIN32)
ngx_iocp_conf_t *iocpcf;
#endif
@@ -655,10 +658,21 @@ ngx_http_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
return NGX_CONF_ERROR;
}
+#if (NGX_PCRE)
+ regex = 0;
+#endif
+
name = in_addr[a].names.elts;
for (s = 0; s < in_addr[a].names.nelts; s++) {
+#if (NGX_PCRE)
+ if (name[s].regex) {
+ regex++;
+ continue;
+ }
+#endif
+
rc = ngx_hash_add_key(&ha, &name[s].name, name[s].core_srv_conf,
NGX_HASH_WILDCARD_KEY);
@@ -740,6 +754,27 @@ ngx_http_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
}
ngx_destroy_pool(ha.temp_pool);
+
+#if (NGX_PCRE)
+
+ if (regex == 0) {
+ continue;
+ }
+
+ in_addr[a].nregex = regex;
+ in_addr[a].regex = ngx_palloc(cf->pool,
+ regex * sizeof(ngx_http_server_name_t));
+
+ if (in_addr[a].regex == NULL) {
+ return NGX_CONF_ERROR;
+ }
+
+ for (i = 0, s = 0; s < in_addr[a].names.nelts; s++) {
+ if (name[s].regex) {
+ in_addr[a].regex[i++] = name[s];
+ }
+ }
+#endif
}
in_addr = in_port[p].addrs.elts;
@@ -871,9 +906,13 @@ ngx_http_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
}
hip->addrs[i].virtual_names = vn;
- vn->hash = in_addr[i].hash;
- vn->wc_head = in_addr[i].wc_head;
- vn->wc_tail = in_addr[i].wc_tail;
+ vn->names.hash = in_addr[i].hash;
+ vn->names.wc_head = in_addr[i].wc_head;
+ vn->names.wc_tail = in_addr[i].wc_tail;
+#if (NGX_PCRE)
+ vn->nregex = in_addr[i].nregex;
+ vn->regex = in_addr[i].regex;
+#endif
}
if (done) {
@@ -932,7 +971,8 @@ ngx_http_add_address(ngx_conf_t *cf, ngx_http_conf_in_port_t *in_port,
if (in_port->addrs.elts == NULL) {
if (ngx_array_init(&in_port->addrs, cf->temp_pool, 4,
- sizeof(ngx_http_conf_in_addr_t)) != NGX_OK)
+ sizeof(ngx_http_conf_in_addr_t))
+ != NGX_OK)
{
return NGX_ERROR;
}
@@ -949,6 +989,10 @@ ngx_http_add_address(ngx_conf_t *cf, ngx_http_conf_in_port_t *in_port,
in_addr->wc_head = NULL;
in_addr->wc_tail = NULL;
in_addr->names.elts = NULL;
+#if (NGX_PCRE)
+ in_addr->nregex = 0;
+ in_addr->regex = NULL;
+#endif
in_addr->core_srv_conf = cscf;
in_addr->default_server = lscf->conf.default_server;
in_addr->bind = lscf->conf.bind;
@@ -981,13 +1025,15 @@ ngx_http_add_names(ngx_conf_t *cf, ngx_http_conf_in_addr_t *in_addr,
if (in_addr->names.elts == NULL) {
if (ngx_array_init(&in_addr->names, cf->temp_pool, 4,
- sizeof(ngx_http_server_name_t)) != NGX_OK)
+ sizeof(ngx_http_server_name_t))
+ != NGX_OK)
{
return NGX_ERROR;
}
}
server_names = cscf->server_names.elts;
+
for (i = 0; i < cscf->server_names.nelts; i++) {
for (n = 0; n < server_names[i].name.len; n++) {
@@ -998,7 +1044,6 @@ ngx_http_add_names(ngx_conf_t *cf, ngx_http_conf_in_addr_t *in_addr,
ngx_log_debug1(NGX_LOG_DEBUG_HTTP, cf->log, 0,
"name: %V", &server_names[i].name);
-
name = ngx_array_push(&in_addr->names);
if (name == NULL) {
return NGX_ERROR;