]> git.kaiwu.me - nginx.git/commitdiff
captures support in server_name
authorIgor Sysoev <igor@sysoev.ru>
Fri, 6 Mar 2009 12:50:20 +0000 (12:50 +0000)
committerIgor Sysoev <igor@sysoev.ru>
Fri, 6 Mar 2009 12:50:20 +0000 (12:50 +0000)
src/http/ngx_http_core_module.c
src/http/ngx_http_core_module.h
src/http/ngx_http_request.c

index cd7159e08873f3e3f09f6b4aa27479fb7f1357f0..ad009462e125d4b42730cb66152218a06f23000d 100644 (file)
@@ -2819,6 +2819,7 @@ ngx_http_core_merge_srv_conf(ngx_conf_t *cf, void *parent, void *child)
 
 #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, ngx_command_t *cmd, void *conf)
 
 #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, ngx_command_t *cmd, void *conf)
             return NGX_CONF_ERROR;
         }
 
+        sn->captures = (ngx_regex_capture_count(sn->regex) > 0);
         sn->name = value[i];
         }
 #else
index 0926b10917d81f256078f836f96144804fd0e876..7ad18edd242b62da4de5ebc5f2dcc1b2d202cb2f 100644 (file)
@@ -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;
index faa8d7fa9599bcfc5aca83261ab7a800e4ba4b13..5a2a8f42c13a681e21157f9f6a3f727f5a73355c 100644 (file)
@@ -1653,11 +1653,33 @@ ngx_http_find_virtual_server(ngx_http_request_t *r, u_char *host, size_t len)
         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_request_t *r, u_char *host, size_t len)
 
             cscf = sn[i].core_srv_conf;
 
+            r->ncaptures = len;
+            r->captures_data = server;
+
             goto found;
         }
     }