annotate src/core/ngx_regex.c @ 656:9d21dad0b5a1 NGINX_1_1_12

nginx 1.1.12 *) Change: a "proxy_pass" directive without URI part now uses changed URI after redirection with the "error_page" directive; Thanks to Lanshun Zhou. *) Feature: the "proxy/fastcgi/scgi/uwsgi_cache_lock", "proxy/fastcgi/scgi/uwsgi_cache_lock_timeout" directives. *) Feature: the "pcre_jit" directive. *) Feature: the "if" SSI command supports captures in regular expressions. *) Bugfix: the "if" SSI command did not work inside the "block" command. *) Bugfix: the "limit_conn_log_level" and "limit_req_log_level" directives might not work. *) Bugfix: the "limit_rate" directive did not allow to use full throughput, even if limit value was very high. *) Bugfix: the "sendfile_max_chunk" directive did not work, if the "limit_rate" directive was used. *) Bugfix: a "proxy_pass" directive without URI part always used original request URI if variables were used. *) Bugfix: a "proxy_pass" directive without URI part might use original request after redirection with the "try_files" directive; Thanks to Lanshun Zhou. *) Bugfix: in the ngx_http_scgi_module. *) Bugfix: in the ngx_http_mp4_module. *) Bugfix: nginx could not be built on Solaris; the bug had appeared in 1.1.9.
author Igor Sysoev <http://sysoev.ru>
date Mon, 26 Dec 2011 00:00:00 +0400
parents 753f505670e0
children d0f7a625f27c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2 /*
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
3 * Copyright (C) Igor Sysoev
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
4 */
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
5
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
6
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
7 #include <ngx_config.h>
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
8 #include <ngx_core.h>
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
9
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
10
656
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
11 typedef struct {
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
12 ngx_flag_t pcre_jit;
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
13 } ngx_regex_conf_t;
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
14
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
15
52
0d75d65c642f nginx 0.1.26
Igor Sysoev <http://sysoev.ru>
parents: 50
diff changeset
16 static void * ngx_libc_cdecl ngx_regex_malloc(size_t size);
0d75d65c642f nginx 0.1.26
Igor Sysoev <http://sysoev.ru>
parents: 50
diff changeset
17 static void ngx_libc_cdecl ngx_regex_free(void *p);
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
18
656
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
19 static ngx_int_t ngx_regex_module_init(ngx_cycle_t *cycle);
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
20
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
21 static void *ngx_regex_create_conf(ngx_cycle_t *cycle);
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
22 static char *ngx_regex_init_conf(ngx_cycle_t *cycle, void *conf);
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
23
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
24 static char *ngx_regex_pcre_jit(ngx_conf_t *cf, void *post, void *data);
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
25 static ngx_conf_post_t ngx_regex_pcre_jit_post = { ngx_regex_pcre_jit };
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
26
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
27
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
28 static ngx_command_t ngx_regex_commands[] = {
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
29
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
30 { ngx_string("pcre_jit"),
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
31 NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1,
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
32 ngx_conf_set_flag_slot,
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
33 0,
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
34 offsetof(ngx_regex_conf_t, pcre_jit),
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
35 &ngx_regex_pcre_jit_post },
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
36
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
37 ngx_null_command
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
38 };
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
39
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
40
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
41 static ngx_core_module_t ngx_regex_module_ctx = {
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
42 ngx_string("regex"),
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
43 ngx_regex_create_conf,
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
44 ngx_regex_init_conf
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
45 };
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
46
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
47
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
48 ngx_module_t ngx_regex_module = {
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
49 NGX_MODULE_V1,
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
50 &ngx_regex_module_ctx, /* module context */
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
51 ngx_regex_commands, /* module directives */
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
52 NGX_CORE_MODULE, /* module type */
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
53 NULL, /* init master */
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
54 ngx_regex_module_init, /* init module */
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
55 NULL, /* init process */
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
56 NULL, /* init thread */
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
57 NULL, /* exit thread */
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
58 NULL, /* exit process */
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
59 NULL, /* exit master */
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
60 NGX_MODULE_V1_PADDING
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
61 };
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
62
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
63
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
64 static ngx_pool_t *ngx_pcre_pool;
656
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
65 static ngx_list_t *ngx_pcre_studies;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
66
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
67
52
0d75d65c642f nginx 0.1.26
Igor Sysoev <http://sysoev.ru>
parents: 50
diff changeset
68 void
0d75d65c642f nginx 0.1.26
Igor Sysoev <http://sysoev.ru>
parents: 50
diff changeset
69 ngx_regex_init(void)
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
70 {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
71 pcre_malloc = ngx_regex_malloc;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
72 pcre_free = ngx_regex_free;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
73 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
74
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
75
546
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
76 static ngx_inline void
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
77 ngx_regex_malloc_init(ngx_pool_t *pool)
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
78 {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
79 #if (NGX_THREADS)
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
80 ngx_core_tls_t *tls;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
81
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
82 if (ngx_threaded) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
83 tls = ngx_thread_get_tls(ngx_core_tls_key);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
84 tls->pool = pool;
546
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
85 return;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
86 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
87
550
697030d79811 nginx 0.8.27
Igor Sysoev <http://sysoev.ru>
parents: 546
diff changeset
88 #endif
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
89
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
90 ngx_pcre_pool = pool;
546
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
91 }
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
92
546
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
93
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
94 static ngx_inline void
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
95 ngx_regex_malloc_done(void)
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
96 {
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
97 #if (NGX_THREADS)
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
98 ngx_core_tls_t *tls;
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
99
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
100 if (ngx_threaded) {
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
101 tls = ngx_thread_get_tls(ngx_core_tls_key);
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
102 tls->pool = NULL;
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
103 return;
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
104 }
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
105
550
697030d79811 nginx 0.8.27
Igor Sysoev <http://sysoev.ru>
parents: 546
diff changeset
106 #endif
546
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
107
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
108 ngx_pcre_pool = NULL;
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
109 }
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
110
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
111
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
112 ngx_int_t
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
113 ngx_regex_compile(ngx_regex_compile_t *rc)
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
114 {
656
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
115 int n, erroff;
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
116 char *p;
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
117 pcre *re;
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
118 const char *errstr;
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
119 ngx_regex_elt_t *elt;
546
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
120
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
121 ngx_regex_malloc_init(rc->pool);
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
122
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
123 re = pcre_compile((const char *) rc->pattern.data, (int) rc->options,
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
124 &errstr, &erroff, NULL);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
125
546
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
126 /* ensure that there is no current pool */
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
127 ngx_regex_malloc_done();
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
128
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
129 if (re == NULL) {
546
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
130 if ((size_t) erroff == rc->pattern.len) {
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
131 rc->err.len = ngx_snprintf(rc->err.data, rc->err.len,
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
132 "pcre_compile() failed: %s in \"%V\"",
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
133 errstr, &rc->pattern)
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
134 - rc->err.data;
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
135
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
136 } else {
546
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
137 rc->err.len = ngx_snprintf(rc->err.data, rc->err.len,
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
138 "pcre_compile() failed: %s in \"%V\" at \"%s\"",
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
139 errstr, &rc->pattern, rc->pattern.data + erroff)
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
140 - rc->err.data;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
141 }
546
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
142
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
143 return NGX_ERROR;
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
144 }
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
145
656
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
146 rc->regex = ngx_pcalloc(rc->pool, sizeof(ngx_regex_t));
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
147 if (rc->regex == NULL) {
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
148 return NGX_ERROR;
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
149 }
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
150
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
151 rc->regex->pcre = re;
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
152
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
153 /* do not study at runtime */
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
154
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
155 if (ngx_pcre_studies != NULL) {
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
156 elt = ngx_list_push(ngx_pcre_studies);
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
157 if (elt == NULL) {
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
158 return NGX_ERROR;
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
159 }
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
160
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
161 elt->regex = rc->regex;
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
162 elt->name = rc->pattern.data;
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
163 }
546
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
164
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
165 n = pcre_fullinfo(re, NULL, PCRE_INFO_CAPTURECOUNT, &rc->captures);
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
166 if (n < 0) {
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
167 p = "pcre_fullinfo(\"%V\", PCRE_INFO_CAPTURECOUNT) failed: %d";
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
168 goto failed;
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
169 }
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
170
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
171 if (rc->captures == 0) {
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
172 return NGX_OK;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
173 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
174
546
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
175 n = pcre_fullinfo(re, NULL, PCRE_INFO_NAMECOUNT, &rc->named_captures);
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
176 if (n < 0) {
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
177 p = "pcre_fullinfo(\"%V\", PCRE_INFO_NAMECOUNT) failed: %d";
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
178 goto failed;
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
179 }
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
180
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
181 if (rc->named_captures == 0) {
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
182 return NGX_OK;
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
183 }
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
184
546
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
185 n = pcre_fullinfo(re, NULL, PCRE_INFO_NAMEENTRYSIZE, &rc->name_size);
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
186 if (n < 0) {
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
187 p = "pcre_fullinfo(\"%V\", PCRE_INFO_NAMEENTRYSIZE) failed: %d";
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
188 goto failed;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
189 }
546
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
190
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
191 n = pcre_fullinfo(re, NULL, PCRE_INFO_NAMETABLE, &rc->names);
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
192 if (n < 0) {
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
193 p = "pcre_fullinfo(\"%V\", PCRE_INFO_NAMETABLE) failed: %d";
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
194 goto failed;
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
195 }
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
196
546
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
197 return NGX_OK;
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
198
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
199 failed:
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
200
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
201 rc->err.len = ngx_snprintf(rc->err.data, rc->err.len, p, &rc->pattern, n)
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
202 - rc->err.data;
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
203 return NGX_OK;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
204 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
205
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
206
52
0d75d65c642f nginx 0.1.26
Igor Sysoev <http://sysoev.ru>
parents: 50
diff changeset
207 ngx_int_t
358
9121a0a91f47 nginx 0.6.23
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
208 ngx_regex_exec_array(ngx_array_t *a, ngx_str_t *s, ngx_log_t *log)
9121a0a91f47 nginx 0.6.23
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
209 {
9121a0a91f47 nginx 0.6.23
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
210 ngx_int_t n;
9121a0a91f47 nginx 0.6.23
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
211 ngx_uint_t i;
9121a0a91f47 nginx 0.6.23
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
212 ngx_regex_elt_t *re;
9121a0a91f47 nginx 0.6.23
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
213
9121a0a91f47 nginx 0.6.23
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
214 re = a->elts;
9121a0a91f47 nginx 0.6.23
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
215
9121a0a91f47 nginx 0.6.23
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
216 for (i = 0; i < a->nelts; i++) {
9121a0a91f47 nginx 0.6.23
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
217
9121a0a91f47 nginx 0.6.23
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
218 n = ngx_regex_exec(re[i].regex, s, NULL, 0);
9121a0a91f47 nginx 0.6.23
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
219
9121a0a91f47 nginx 0.6.23
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
220 if (n == NGX_REGEX_NO_MATCHED) {
9121a0a91f47 nginx 0.6.23
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
221 continue;
9121a0a91f47 nginx 0.6.23
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
222 }
9121a0a91f47 nginx 0.6.23
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
223
9121a0a91f47 nginx 0.6.23
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
224 if (n < 0) {
9121a0a91f47 nginx 0.6.23
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
225 ngx_log_error(NGX_LOG_ALERT, log, 0,
546
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
226 ngx_regex_exec_n " failed: %i on \"%V\" using \"%s\"",
358
9121a0a91f47 nginx 0.6.23
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
227 n, s, re[i].name);
9121a0a91f47 nginx 0.6.23
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
228 return NGX_ERROR;
9121a0a91f47 nginx 0.6.23
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
229 }
9121a0a91f47 nginx 0.6.23
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
230
9121a0a91f47 nginx 0.6.23
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
231 /* match */
9121a0a91f47 nginx 0.6.23
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
232
9121a0a91f47 nginx 0.6.23
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
233 return NGX_OK;
9121a0a91f47 nginx 0.6.23
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
234 }
9121a0a91f47 nginx 0.6.23
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
235
9121a0a91f47 nginx 0.6.23
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
236 return NGX_DECLINED;
9121a0a91f47 nginx 0.6.23
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
237 }
9121a0a91f47 nginx 0.6.23
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
238
9121a0a91f47 nginx 0.6.23
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
239
52
0d75d65c642f nginx 0.1.26
Igor Sysoev <http://sysoev.ru>
parents: 50
diff changeset
240 static void * ngx_libc_cdecl
0d75d65c642f nginx 0.1.26
Igor Sysoev <http://sysoev.ru>
parents: 50
diff changeset
241 ngx_regex_malloc(size_t size)
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
242 {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
243 ngx_pool_t *pool;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
244 #if (NGX_THREADS)
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
245 ngx_core_tls_t *tls;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
246
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
247 if (ngx_threaded) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
248 tls = ngx_thread_get_tls(ngx_core_tls_key);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
249 pool = tls->pool;
546
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
250
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
251 } else {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
252 pool = ngx_pcre_pool;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
253 }
546
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
254
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
255 #else
546
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
256
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
257 pool = ngx_pcre_pool;
546
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
258
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
259 #endif
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
260
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
261 if (pool) {
382
984bb0b1399b nginx 0.7.3
Igor Sysoev <http://sysoev.ru>
parents: 380
diff changeset
262 return ngx_palloc(pool, size);
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
263 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
264
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
265 return NULL;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
266 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
267
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
268
52
0d75d65c642f nginx 0.1.26
Igor Sysoev <http://sysoev.ru>
parents: 50
diff changeset
269 static void ngx_libc_cdecl
0d75d65c642f nginx 0.1.26
Igor Sysoev <http://sysoev.ru>
parents: 50
diff changeset
270 ngx_regex_free(void *p)
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
271 {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
272 return;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
273 }
656
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
274
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
275
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
276 static ngx_int_t
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
277 ngx_regex_module_init(ngx_cycle_t *cycle)
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
278 {
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
279 int opt;
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
280 const char *errstr;
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
281 ngx_uint_t i;
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
282 ngx_list_part_t *part;
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
283 ngx_regex_elt_t *elts;
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
284
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
285 opt = 0;
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
286
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
287 #if (NGX_HAVE_PCRE_JIT)
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
288 {
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
289 ngx_regex_conf_t *rcf;
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
290
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
291 rcf = (ngx_regex_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_regex_module);
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
292
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
293 if (rcf->pcre_jit) {
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
294 opt = PCRE_STUDY_JIT_COMPILE;
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
295 }
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
296 }
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
297 #endif
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
298
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
299 ngx_regex_malloc_init(cycle->pool);
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
300
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
301 part = &ngx_pcre_studies->part;
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
302 elts = part->elts;
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
303
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
304 for (i = 0 ; /* void */ ; i++) {
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
305
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
306 if (i >= part->nelts) {
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
307 if (part->next == NULL) {
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
308 break;
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
309 }
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
310
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
311 part = part->next;
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
312 elts = part->elts;
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
313 i = 0;
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
314 }
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
315
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
316 elts[i].regex->extra = pcre_study(elts[i].regex->pcre, opt, &errstr);
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
317
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
318 if (errstr != NULL) {
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
319 ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
320 "pcre_study() failed: %s in \"%s\"",
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
321 errstr, elts[i].name);
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
322 }
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
323
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
324 #if (NGX_HAVE_PCRE_JIT)
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
325 if (opt & PCRE_STUDY_JIT_COMPILE) {
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
326 int jit, n;
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
327
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
328 jit = 0;
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
329 n = pcre_fullinfo(elts[i].regex->pcre, elts[i].regex->extra,
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
330 PCRE_INFO_JIT, &jit);
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
331
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
332 if (n != 0 || jit != 1) {
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
333 ngx_log_error(NGX_LOG_INFO, cycle->log, 0,
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
334 "JIT compiler does not support pattern: \"%s\"",
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
335 elts[i].name);
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
336 }
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
337 }
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
338 #endif
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
339 }
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
340
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
341 ngx_regex_malloc_done();
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
342
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
343 ngx_pcre_studies = NULL;
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
344
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
345 return NGX_OK;
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
346 }
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
347
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
348
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
349 static void *
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
350 ngx_regex_create_conf(ngx_cycle_t *cycle)
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
351 {
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
352 ngx_regex_conf_t *rcf;
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
353
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
354 rcf = ngx_pcalloc(cycle->pool, sizeof(ngx_regex_conf_t));
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
355 if (rcf == NULL) {
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
356 return NULL;
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
357 }
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
358
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
359 rcf->pcre_jit = NGX_CONF_UNSET;
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
360
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
361 ngx_pcre_studies = ngx_list_create(cycle->pool, 8, sizeof(ngx_regex_elt_t));
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
362 if (ngx_pcre_studies == NULL) {
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
363 return NULL;
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
364 }
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
365
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
366 return rcf;
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
367 }
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
368
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
369
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
370 static char *
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
371 ngx_regex_init_conf(ngx_cycle_t *cycle, void *conf)
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
372 {
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
373 ngx_regex_conf_t *rcf = conf;
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
374
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
375 ngx_conf_init_value(rcf->pcre_jit, 0);
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
376
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
377 return NGX_CONF_OK;
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
378 }
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
379
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
380
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
381 static char *
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
382 ngx_regex_pcre_jit(ngx_conf_t *cf, void *post, void *data)
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
383 {
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
384 ngx_flag_t *fp = data;
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
385
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
386 if (*fp == 0) {
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
387 return NGX_CONF_OK;
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
388 }
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
389
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
390 #if (NGX_HAVE_PCRE_JIT)
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
391 {
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
392 int jit, r;
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
393
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
394 jit = 0;
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
395 r = pcre_config(PCRE_CONFIG_JIT, &jit);
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
396
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
397 if (r != 0 || jit != 1) {
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
398 ngx_conf_log_error(NGX_LOG_WARN, cf, 0,
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
399 "PCRE library does not support JIT");
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
400 *fp = 0;
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
401 }
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
402 }
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
403 #else
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
404 ngx_conf_log_error(NGX_LOG_WARN, cf, 0,
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
405 "nginx was build without PCRE JIT support");
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
406 *fp = 0;
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
407 #endif
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
408
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
409 return NGX_CONF_OK;
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
410 }