Mercurial > hg > nginx
annotate src/http/ngx_http_script.c @ 2577:2dcbcfc1a8d1
split ngx_http_script_compile()
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Wed, 18 Mar 2009 14:42:06 +0000 |
parents | 912ce4113f21 |
children | 8afc4df77ee8 |
rev | line source |
---|---|
441
da8c5707af39
nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents:
99
diff
changeset
|
1 |
da8c5707af39
nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents:
99
diff
changeset
|
2 /* |
444
42d11f017717
nginx-0.1.0-2004-09-29-20:00:49 import; remove years from copyright
Igor Sysoev <igor@sysoev.ru>
parents:
441
diff
changeset
|
3 * Copyright (C) Igor Sysoev |
441
da8c5707af39
nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents:
99
diff
changeset
|
4 */ |
da8c5707af39
nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents:
99
diff
changeset
|
5 |
99
a059e1aa65d4
nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
6 |
a059e1aa65d4
nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
7 #include <ngx_config.h> |
a059e1aa65d4
nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
8 #include <ngx_core.h> |
a059e1aa65d4
nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
9 #include <ngx_http.h> |
a059e1aa65d4
nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
10 |
a059e1aa65d4
nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
11 |
2577
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
12 static ngx_int_t ngx_http_script_init_arrays(ngx_http_script_compile_t *sc); |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
13 static ngx_int_t ngx_http_script_done(ngx_http_script_compile_t *sc); |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
14 static ngx_int_t ngx_http_script_add_copy_code(ngx_http_script_compile_t *sc, |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
15 ngx_str_t *value); |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
16 static ngx_int_t ngx_http_script_add_var_code(ngx_http_script_compile_t *sc, |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
17 ngx_str_t *name); |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
18 static ngx_int_t ngx_http_script_add_args_code(ngx_http_script_compile_t *sc); |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
19 #if (NGX_PCRE) |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
20 static ngx_int_t ngx_http_script_add_capture_code(ngx_http_script_compile_t *sc, |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
21 ngx_uint_t n); |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
22 #endif |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
23 |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
24 |
509 | 25 #define ngx_http_script_exit (u_char *) &ngx_http_script_exit_code |
26 | |
27 static uintptr_t ngx_http_script_exit_code = (uintptr_t) NULL; | |
28 | |
29 | |
30 ngx_uint_t | |
31 ngx_http_script_variables_count(ngx_str_t *value) | |
99
a059e1aa65d4
nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
32 { |
509 | 33 ngx_uint_t i, n; |
507 | 34 |
509 | 35 for (n = 0, i = 0; i < value->len; i++) { |
36 if (value->data[i] == '$') { | |
37 n++; | |
38 } | |
507 | 39 } |
40 | |
509 | 41 return n; |
42 } | |
43 | |
44 | |
45 ngx_int_t | |
46 ngx_http_script_compile(ngx_http_script_compile_t *sc) | |
47 { | |
2577
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
48 u_char ch; |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
49 ngx_str_t name; |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
50 ngx_uint_t i, bracket; |
573 | 51 |
2577
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
52 if (ngx_http_script_init_arrays(sc) != NGX_OK) { |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
53 return NGX_ERROR; |
509 | 54 } |
55 | |
56 for (i = 0; i < sc->source->len; /* void */ ) { | |
57 | |
58 name.len = 0; | |
59 | |
60 if (sc->source->data[i] == '$') { | |
61 | |
62 if (++i == sc->source->len) { | |
63 goto invalid_variable; | |
64 } | |
65 | |
2547
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
66 #if (NGX_PCRE) |
2577
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
67 { |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
68 ngx_uint_t n; |
2547
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
69 |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
70 /* NGX_HTTP_MAX_CAPTURES is 9 */ |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
71 |
509 | 72 if (sc->source->data[i] >= '1' && sc->source->data[i] <= '9') { |
73 | |
641 | 74 n = sc->source->data[i] - '0'; |
75 | |
76 if (sc->captures_mask & (1 << n)) { | |
77 sc->dup_capture = 1; | |
78 } | |
79 | |
80 sc->captures_mask |= 1 << n; | |
81 | |
2577
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
82 if (ngx_http_script_add_capture_code(sc, n) != NGX_OK) { |
509 | 83 return NGX_ERROR; |
84 } | |
85 | |
86 i++; | |
87 | |
88 continue; | |
89 } | |
2577
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
90 } |
2547
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
91 #endif |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
92 |
509 | 93 if (sc->source->data[i] == '{') { |
94 bracket = 1; | |
95 | |
96 if (++i == sc->source->len) { | |
97 goto invalid_variable; | |
98 } | |
99 | |
100 name.data = &sc->source->data[i]; | |
101 | |
102 } else { | |
103 bracket = 0; | |
104 name.data = &sc->source->data[i]; | |
105 } | |
106 | |
107 for ( /* void */ ; i < sc->source->len; i++, name.len++) { | |
108 ch = sc->source->data[i]; | |
507 | 109 |
509 | 110 if (ch == '}' && bracket) { |
111 i++; | |
112 bracket = 0; | |
113 break; | |
114 } | |
115 | |
116 if ((ch >= 'A' && ch <= 'Z') | |
117 || (ch >= 'a' && ch <= 'z') | |
118 || (ch >= '0' && ch <= '9') | |
119 || ch == '_') | |
120 { | |
121 continue; | |
122 } | |
123 | |
124 break; | |
125 } | |
126 | |
127 if (bracket) { | |
128 ngx_conf_log_error(NGX_LOG_EMERG, sc->cf, 0, | |
129 "the closing bracket in \"%V\" " | |
130 "variable is missing", &name); | |
507 | 131 return NGX_ERROR; |
132 } | |
133 | |
509 | 134 if (name.len == 0) { |
135 goto invalid_variable; | |
136 } | |
507 | 137 |
509 | 138 sc->variables++; |
507 | 139 |
2577
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
140 if (ngx_http_script_add_var_code(sc, &name) != NGX_OK) { |
507 | 141 return NGX_ERROR; |
142 } | |
99
a059e1aa65d4
nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
143 |
509 | 144 continue; |
145 } | |
507 | 146 |
509 | 147 if (sc->source->data[i] == '?' && sc->compile_args) { |
148 sc->args = 1; | |
149 sc->compile_args = 0; | |
99
a059e1aa65d4
nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
150 |
2577
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
151 if (ngx_http_script_add_args_code(sc) != NGX_OK) { |
1891
782af1038115
length calculation did not take into account escaped symbols in arguments
Igor Sysoev <igor@sysoev.ru>
parents:
1799
diff
changeset
|
152 return NGX_ERROR; |
782af1038115
length calculation did not take into account escaped symbols in arguments
Igor Sysoev <igor@sysoev.ru>
parents:
1799
diff
changeset
|
153 } |
782af1038115
length calculation did not take into account escaped symbols in arguments
Igor Sysoev <igor@sysoev.ru>
parents:
1799
diff
changeset
|
154 |
509 | 155 i++; |
156 | |
507 | 157 continue; |
158 } | |
159 | |
509 | 160 name.data = &sc->source->data[i]; |
161 | |
2498
d3357bf23a5e
fix /?new=arg?old=arg redirect case
Igor Sysoev <igor@sysoev.ru>
parents:
2397
diff
changeset
|
162 while (i < sc->source->len) { |
d3357bf23a5e
fix /?new=arg?old=arg redirect case
Igor Sysoev <igor@sysoev.ru>
parents:
2397
diff
changeset
|
163 |
d3357bf23a5e
fix /?new=arg?old=arg redirect case
Igor Sysoev <igor@sysoev.ru>
parents:
2397
diff
changeset
|
164 if (sc->source->data[i] == '$') { |
d3357bf23a5e
fix /?new=arg?old=arg redirect case
Igor Sysoev <igor@sysoev.ru>
parents:
2397
diff
changeset
|
165 break; |
d3357bf23a5e
fix /?new=arg?old=arg redirect case
Igor Sysoev <igor@sysoev.ru>
parents:
2397
diff
changeset
|
166 } |
d3357bf23a5e
fix /?new=arg?old=arg redirect case
Igor Sysoev <igor@sysoev.ru>
parents:
2397
diff
changeset
|
167 |
d3357bf23a5e
fix /?new=arg?old=arg redirect case
Igor Sysoev <igor@sysoev.ru>
parents:
2397
diff
changeset
|
168 if (sc->source->data[i] == '?') { |
d3357bf23a5e
fix /?new=arg?old=arg redirect case
Igor Sysoev <igor@sysoev.ru>
parents:
2397
diff
changeset
|
169 |
d3357bf23a5e
fix /?new=arg?old=arg redirect case
Igor Sysoev <igor@sysoev.ru>
parents:
2397
diff
changeset
|
170 sc->args = 1; |
d3357bf23a5e
fix /?new=arg?old=arg redirect case
Igor Sysoev <igor@sysoev.ru>
parents:
2397
diff
changeset
|
171 |
d3357bf23a5e
fix /?new=arg?old=arg redirect case
Igor Sysoev <igor@sysoev.ru>
parents:
2397
diff
changeset
|
172 if (sc->compile_args) { |
d3357bf23a5e
fix /?new=arg?old=arg redirect case
Igor Sysoev <igor@sysoev.ru>
parents:
2397
diff
changeset
|
173 break; |
d3357bf23a5e
fix /?new=arg?old=arg redirect case
Igor Sysoev <igor@sysoev.ru>
parents:
2397
diff
changeset
|
174 } |
d3357bf23a5e
fix /?new=arg?old=arg redirect case
Igor Sysoev <igor@sysoev.ru>
parents:
2397
diff
changeset
|
175 } |
d3357bf23a5e
fix /?new=arg?old=arg redirect case
Igor Sysoev <igor@sysoev.ru>
parents:
2397
diff
changeset
|
176 |
509 | 177 i++; |
178 name.len++; | |
179 } | |
180 | |
181 sc->size += name.len; | |
182 | |
2577
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
183 if (ngx_http_script_add_copy_code(sc, &name) != NGX_OK) { |
509 | 184 return NGX_ERROR; |
185 } | |
507 | 186 } |
187 | |
2577
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
188 return ngx_http_script_done(sc); |
509 | 189 |
190 invalid_variable: | |
191 | |
192 ngx_conf_log_error(NGX_LOG_EMERG, sc->cf, 0, "invalid variable name"); | |
193 | |
194 return NGX_ERROR; | |
99
a059e1aa65d4
nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
195 } |
a059e1aa65d4
nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
196 |
a059e1aa65d4
nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
197 |
623 | 198 u_char * |
199 ngx_http_script_run(ngx_http_request_t *r, ngx_str_t *value, | |
200 void *code_lengths, size_t len, void *code_values) | |
201 { | |
1152
a9715f8f17a5
flush nocachable variables before ngx_http_script_run()
Igor Sysoev <igor@sysoev.ru>
parents:
845
diff
changeset
|
202 ngx_uint_t i; |
a9715f8f17a5
flush nocachable variables before ngx_http_script_run()
Igor Sysoev <igor@sysoev.ru>
parents:
845
diff
changeset
|
203 ngx_http_script_code_pt code; |
a9715f8f17a5
flush nocachable variables before ngx_http_script_run()
Igor Sysoev <igor@sysoev.ru>
parents:
845
diff
changeset
|
204 ngx_http_script_len_code_pt lcode; |
a9715f8f17a5
flush nocachable variables before ngx_http_script_run()
Igor Sysoev <igor@sysoev.ru>
parents:
845
diff
changeset
|
205 ngx_http_script_engine_t e; |
a9715f8f17a5
flush nocachable variables before ngx_http_script_run()
Igor Sysoev <igor@sysoev.ru>
parents:
845
diff
changeset
|
206 ngx_http_core_main_conf_t *cmcf; |
a9715f8f17a5
flush nocachable variables before ngx_http_script_run()
Igor Sysoev <igor@sysoev.ru>
parents:
845
diff
changeset
|
207 |
a9715f8f17a5
flush nocachable variables before ngx_http_script_run()
Igor Sysoev <igor@sysoev.ru>
parents:
845
diff
changeset
|
208 cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module); |
a9715f8f17a5
flush nocachable variables before ngx_http_script_run()
Igor Sysoev <igor@sysoev.ru>
parents:
845
diff
changeset
|
209 |
a9715f8f17a5
flush nocachable variables before ngx_http_script_run()
Igor Sysoev <igor@sysoev.ru>
parents:
845
diff
changeset
|
210 for (i = 0; i < cmcf->variables.nelts; i++) { |
1565 | 211 if (r->variables[i].no_cacheable) { |
1152
a9715f8f17a5
flush nocachable variables before ngx_http_script_run()
Igor Sysoev <igor@sysoev.ru>
parents:
845
diff
changeset
|
212 r->variables[i].valid = 0; |
a9715f8f17a5
flush nocachable variables before ngx_http_script_run()
Igor Sysoev <igor@sysoev.ru>
parents:
845
diff
changeset
|
213 r->variables[i].not_found = 0; |
a9715f8f17a5
flush nocachable variables before ngx_http_script_run()
Igor Sysoev <igor@sysoev.ru>
parents:
845
diff
changeset
|
214 } |
a9715f8f17a5
flush nocachable variables before ngx_http_script_run()
Igor Sysoev <igor@sysoev.ru>
parents:
845
diff
changeset
|
215 } |
623 | 216 |
217 ngx_memzero(&e, sizeof(ngx_http_script_engine_t)); | |
218 | |
219 e.ip = code_lengths; | |
220 e.request = r; | |
221 e.flushed = 1; | |
222 | |
223 while (*(uintptr_t *) e.ip) { | |
224 lcode = *(ngx_http_script_len_code_pt *) e.ip; | |
225 len += lcode(&e); | |
226 } | |
227 | |
228 | |
229 value->len = len; | |
2049 | 230 value->data = ngx_pnalloc(r->pool, len); |
623 | 231 if (value->data == NULL) { |
232 return NULL; | |
233 } | |
234 | |
235 e.ip = code_values; | |
236 e.pos = value->data; | |
237 | |
238 while (*(uintptr_t *) e.ip) { | |
239 code = *(ngx_http_script_code_pt *) e.ip; | |
240 code((ngx_http_script_engine_t *) &e); | |
241 } | |
242 | |
243 return e.pos; | |
244 } | |
245 | |
246 | |
573 | 247 void |
1565 | 248 ngx_http_script_flush_no_cacheable_variables(ngx_http_request_t *r, |
573 | 249 ngx_array_t *indices) |
250 { | |
251 ngx_uint_t n, *index; | |
252 | |
253 if (indices) { | |
254 index = indices->elts; | |
255 for (n = 0; n < indices->nelts; n++) { | |
1565 | 256 if (r->variables[index[n]].no_cacheable) { |
573 | 257 r->variables[index[n]].valid = 0; |
258 r->variables[index[n]].not_found = 0; | |
259 } | |
260 } | |
261 } | |
262 } | |
263 | |
264 | |
2577
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
265 static ngx_int_t |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
266 ngx_http_script_init_arrays(ngx_http_script_compile_t *sc) |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
267 { |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
268 ngx_uint_t n; |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
269 |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
270 if (sc->flushes && *sc->flushes == NULL) { |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
271 n = sc->variables ? sc->variables : 1; |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
272 *sc->flushes = ngx_array_create(sc->cf->pool, n, sizeof(ngx_uint_t)); |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
273 if (*sc->flushes == NULL) { |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
274 return NGX_ERROR; |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
275 } |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
276 } |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
277 |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
278 if (*sc->lengths == NULL) { |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
279 n = sc->variables * (2 * sizeof(ngx_http_script_copy_code_t) |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
280 + sizeof(ngx_http_script_var_code_t)) |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
281 + sizeof(uintptr_t); |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
282 |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
283 *sc->lengths = ngx_array_create(sc->cf->pool, n, 1); |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
284 if (*sc->lengths == NULL) { |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
285 return NGX_ERROR; |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
286 } |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
287 } |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
288 |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
289 if (*sc->values == NULL) { |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
290 n = (sc->variables * (2 * sizeof(ngx_http_script_copy_code_t) |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
291 + sizeof(ngx_http_script_var_code_t)) |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
292 + sizeof(uintptr_t) |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
293 + sc->source->len |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
294 + sizeof(uintptr_t) - 1) |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
295 & ~(sizeof(uintptr_t) - 1); |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
296 |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
297 *sc->values = ngx_array_create(sc->cf->pool, n, 1); |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
298 if (*sc->values == NULL) { |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
299 return NGX_ERROR; |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
300 } |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
301 } |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
302 |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
303 sc->variables = 0; |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
304 |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
305 return NGX_OK; |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
306 } |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
307 |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
308 |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
309 static ngx_int_t |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
310 ngx_http_script_done(ngx_http_script_compile_t *sc) |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
311 { |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
312 uintptr_t *code; |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
313 |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
314 if (sc->complete_lengths) { |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
315 code = ngx_http_script_add_code(*sc->lengths, sizeof(uintptr_t), NULL); |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
316 if (code == NULL) { |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
317 return NGX_ERROR; |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
318 } |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
319 |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
320 *code = (uintptr_t) NULL; |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
321 } |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
322 |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
323 if (sc->complete_values) { |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
324 code = ngx_http_script_add_code(*sc->values, sizeof(uintptr_t), |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
325 &sc->main); |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
326 if (code == NULL) { |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
327 return NGX_ERROR; |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
328 } |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
329 |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
330 *code = (uintptr_t) NULL; |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
331 } |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
332 |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
333 return NGX_OK; |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
334 } |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
335 |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
336 |
509 | 337 void * |
507 | 338 ngx_http_script_start_code(ngx_pool_t *pool, ngx_array_t **codes, size_t size) |
479 | 339 { |
507 | 340 if (*codes == NULL) { |
341 *codes = ngx_array_create(pool, 256, 1); | |
342 if (*codes == NULL) { | |
343 return NULL; | |
344 } | |
345 } | |
99
a059e1aa65d4
nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
346 |
507 | 347 return ngx_array_push_n(*codes, size); |
348 } | |
349 | |
509 | 350 |
351 void * | |
352 ngx_http_script_add_code(ngx_array_t *codes, size_t size, void *code) | |
353 { | |
354 u_char *elts, **p; | |
355 void *new; | |
356 | |
357 elts = codes->elts; | |
358 | |
359 new = ngx_array_push_n(codes, size); | |
360 if (new == NULL) { | |
361 return NGX_CONF_ERROR; | |
362 } | |
363 | |
364 if (code) { | |
365 if (elts != codes->elts) { | |
366 p = code; | |
367 *p += (u_char *) codes->elts - elts; | |
368 } | |
369 } | |
370 | |
371 return new; | |
372 } | |
507 | 373 |
479 | 374 |
2577
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
375 static ngx_int_t |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
376 ngx_http_script_add_copy_code(ngx_http_script_compile_t *sc, ngx_str_t *value) |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
377 { |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
378 size_t size; |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
379 ngx_http_script_copy_code_t *code; |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
380 |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
381 code = ngx_http_script_add_code(*sc->lengths, |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
382 sizeof(ngx_http_script_copy_code_t), NULL); |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
383 if (code == NULL) { |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
384 return NGX_ERROR; |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
385 } |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
386 |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
387 code->code = (ngx_http_script_code_pt) ngx_http_script_copy_len_code; |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
388 code->len = value->len; |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
389 |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
390 size = (sizeof(ngx_http_script_copy_code_t) + value->len |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
391 + sizeof(uintptr_t) - 1) |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
392 & ~(sizeof(uintptr_t) - 1); |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
393 |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
394 code = ngx_http_script_add_code(*sc->values, size, &sc->main); |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
395 if (code == NULL) { |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
396 return NGX_ERROR; |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
397 } |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
398 |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
399 code->code = ngx_http_script_copy_code; |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
400 code->len = value->len; |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
401 |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
402 ngx_memcpy((u_char *) code + sizeof(ngx_http_script_copy_code_t), |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
403 value->data, value->len); |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
404 |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
405 return NGX_OK; |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
406 } |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
407 |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
408 |
507 | 409 size_t |
509 | 410 ngx_http_script_copy_len_code(ngx_http_script_engine_t *e) |
507 | 411 { |
412 ngx_http_script_copy_code_t *code; | |
479 | 413 |
509 | 414 code = (ngx_http_script_copy_code_t *) e->ip; |
507 | 415 |
509 | 416 e->ip += sizeof(ngx_http_script_copy_code_t); |
507 | 417 |
418 return code->len; | |
99
a059e1aa65d4
nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
419 } |
a059e1aa65d4
nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
420 |
a059e1aa65d4
nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
421 |
507 | 422 void |
509 | 423 ngx_http_script_copy_code(ngx_http_script_engine_t *e) |
99
a059e1aa65d4
nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
424 { |
2393 | 425 u_char *p; |
507 | 426 ngx_http_script_copy_code_t *code; |
427 | |
509 | 428 code = (ngx_http_script_copy_code_t *) e->ip; |
429 | |
2393 | 430 p = e->pos; |
431 | |
509 | 432 if (!e->skip) { |
2393 | 433 e->pos = ngx_copy(p, e->ip + sizeof(ngx_http_script_copy_code_t), |
573 | 434 code->len); |
509 | 435 } |
507 | 436 |
509 | 437 e->ip += sizeof(ngx_http_script_copy_code_t) |
438 + ((code->len + sizeof(uintptr_t) - 1) & ~(sizeof(uintptr_t) - 1)); | |
507 | 439 |
2393 | 440 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0, |
441 "http script copy: \"%*s\"", e->pos - p, p); | |
99
a059e1aa65d4
nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
442 } |
a059e1aa65d4
nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
443 |
a059e1aa65d4
nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
444 |
2577
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
445 static ngx_int_t |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
446 ngx_http_script_add_var_code(ngx_http_script_compile_t *sc, ngx_str_t *name) |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
447 { |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
448 ngx_int_t index, *p; |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
449 ngx_http_script_var_code_t *code; |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
450 |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
451 index = ngx_http_get_variable_index(sc->cf, name); |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
452 |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
453 if (index == NGX_ERROR) { |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
454 return NGX_ERROR; |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
455 } |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
456 |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
457 if (sc->flushes) { |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
458 p = ngx_array_push(*sc->flushes); |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
459 if (p == NULL) { |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
460 return NGX_ERROR; |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
461 } |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
462 |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
463 *p = index; |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
464 } |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
465 |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
466 code = ngx_http_script_add_code(*sc->lengths, |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
467 sizeof(ngx_http_script_var_code_t), NULL); |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
468 if (code == NULL) { |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
469 return NGX_ERROR; |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
470 } |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
471 |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
472 code->code = (ngx_http_script_code_pt) ngx_http_script_copy_var_len_code; |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
473 code->index = (uintptr_t) index; |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
474 |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
475 code = ngx_http_script_add_code(*sc->values, |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
476 sizeof(ngx_http_script_var_code_t), |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
477 &sc->main); |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
478 if (code == NULL) { |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
479 return NGX_ERROR; |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
480 } |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
481 |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
482 code->code = ngx_http_script_copy_var_code; |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
483 code->index = (uintptr_t) index; |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
484 |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
485 return NGX_OK; |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
486 } |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
487 |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
488 |
507 | 489 size_t |
509 | 490 ngx_http_script_copy_var_len_code(ngx_http_script_engine_t *e) |
99
a059e1aa65d4
nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
491 { |
507 | 492 ngx_http_variable_value_t *value; |
493 ngx_http_script_var_code_t *code; | |
494 | |
509 | 495 code = (ngx_http_script_var_code_t *) e->ip; |
507 | 496 |
509 | 497 e->ip += sizeof(ngx_http_script_var_code_t); |
507 | 498 |
573 | 499 if (e->flushed) { |
500 value = ngx_http_get_indexed_variable(e->request, code->index); | |
507 | 501 |
573 | 502 } else { |
503 value = ngx_http_get_flushed_variable(e->request, code->index); | |
504 } | |
505 | |
506 if (value && !value->not_found) { | |
507 return value->len; | |
507 | 508 } |
509 | |
553 | 510 return 0; |
99
a059e1aa65d4
nginx-0.0.1-2003-06-02-19:24:30 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
511 } |
479 | 512 |
513 | |
507 | 514 void |
509 | 515 ngx_http_script_copy_var_code(ngx_http_script_engine_t *e) |
479 | 516 { |
2393 | 517 u_char *p; |
507 | 518 ngx_http_variable_value_t *value; |
519 ngx_http_script_var_code_t *code; | |
520 | |
509 | 521 code = (ngx_http_script_var_code_t *) e->ip; |
522 | |
523 e->ip += sizeof(ngx_http_script_var_code_t); | |
524 | |
525 if (!e->skip) { | |
573 | 526 |
527 if (e->flushed) { | |
528 value = ngx_http_get_indexed_variable(e->request, code->index); | |
509 | 529 |
573 | 530 } else { |
531 value = ngx_http_get_flushed_variable(e->request, code->index); | |
532 } | |
533 | |
534 if (value && !value->not_found) { | |
2393 | 535 p = e->pos; |
536 e->pos = ngx_copy(p, value->data, value->len); | |
509 | 537 |
2393 | 538 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, |
845
eb5cf273e5d2
debug log should not be under rewrite_log control
Igor Sysoev <igor@sysoev.ru>
parents:
730
diff
changeset
|
539 e->request->connection->log, 0, |
2393 | 540 "http script var: \"%*s\"", e->pos - p, p); |
509 | 541 } |
542 } | |
543 } | |
544 | |
545 | |
2577
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
546 static ngx_int_t |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
547 ngx_http_script_add_args_code(ngx_http_script_compile_t *sc) |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
548 { |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
549 uintptr_t *code; |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
550 |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
551 code = ngx_http_script_add_code(*sc->lengths, sizeof(uintptr_t), NULL); |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
552 if (code == NULL) { |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
553 return NGX_ERROR; |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
554 } |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
555 |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
556 *code = (uintptr_t) ngx_http_script_mark_args_code; |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
557 |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
558 code = ngx_http_script_add_code(*sc->values, sizeof(uintptr_t), &sc->main); |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
559 if (code == NULL) { |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
560 return NGX_ERROR; |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
561 } |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
562 |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
563 *code = (uintptr_t) ngx_http_script_start_args_code; |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
564 |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
565 return NGX_OK; |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
566 } |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
567 |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
568 |
509 | 569 size_t |
1891
782af1038115
length calculation did not take into account escaped symbols in arguments
Igor Sysoev <igor@sysoev.ru>
parents:
1799
diff
changeset
|
570 ngx_http_script_mark_args_code(ngx_http_script_engine_t *e) |
782af1038115
length calculation did not take into account escaped symbols in arguments
Igor Sysoev <igor@sysoev.ru>
parents:
1799
diff
changeset
|
571 { |
782af1038115
length calculation did not take into account escaped symbols in arguments
Igor Sysoev <igor@sysoev.ru>
parents:
1799
diff
changeset
|
572 e->is_args = 1; |
782af1038115
length calculation did not take into account escaped symbols in arguments
Igor Sysoev <igor@sysoev.ru>
parents:
1799
diff
changeset
|
573 e->ip += sizeof(uintptr_t); |
782af1038115
length calculation did not take into account escaped symbols in arguments
Igor Sysoev <igor@sysoev.ru>
parents:
1799
diff
changeset
|
574 |
782af1038115
length calculation did not take into account escaped symbols in arguments
Igor Sysoev <igor@sysoev.ru>
parents:
1799
diff
changeset
|
575 return 1; |
782af1038115
length calculation did not take into account escaped symbols in arguments
Igor Sysoev <igor@sysoev.ru>
parents:
1799
diff
changeset
|
576 } |
782af1038115
length calculation did not take into account escaped symbols in arguments
Igor Sysoev <igor@sysoev.ru>
parents:
1799
diff
changeset
|
577 |
782af1038115
length calculation did not take into account escaped symbols in arguments
Igor Sysoev <igor@sysoev.ru>
parents:
1799
diff
changeset
|
578 |
509 | 579 void |
580 ngx_http_script_start_args_code(ngx_http_script_engine_t *e) | |
581 { | |
582 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0, | |
583 "http script args"); | |
577 | 584 |
2225
207827f7bf71
escape a query string characters taken from URI while rewrite
Igor Sysoev <igor@sysoev.ru>
parents:
2133
diff
changeset
|
585 e->is_args = 1; |
509 | 586 e->args = e->pos; |
587 e->ip += sizeof(uintptr_t); | |
588 } | |
589 | |
590 | |
517 | 591 #if (NGX_PCRE) |
592 | |
509 | 593 void |
594 ngx_http_script_regex_start_code(ngx_http_script_engine_t *e) | |
595 { | |
596 size_t len; | |
597 ngx_int_t rc; | |
598 ngx_uint_t n; | |
599 ngx_http_request_t *r; | |
600 ngx_http_script_engine_t le; | |
601 ngx_http_script_len_code_pt lcode; | |
602 ngx_http_script_regex_code_t *code; | |
603 | |
604 code = (ngx_http_script_regex_code_t *) e->ip; | |
605 | |
606 r = e->request; | |
607 | |
608 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, | |
609 "http script regex: \"%V\"", &code->name); | |
610 | |
611 if (code->uri) { | |
515 | 612 e->line = r->uri; |
509 | 613 } else { |
614 e->sp--; | |
573 | 615 e->line.len = e->sp->len; |
616 e->line.data = e->sp->data; | |
509 | 617 } |
507 | 618 |
2547
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
619 if (code->ncaptures && r->captures == NULL) { |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
620 |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
621 r->captures = ngx_palloc(r->pool, |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
622 (NGX_HTTP_MAX_CAPTURES + 1) * 3 * sizeof(int)); |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
623 if (r->captures == NULL) { |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
624 e->ip = ngx_http_script_exit; |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
625 e->status = NGX_HTTP_INTERNAL_SERVER_ERROR; |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
626 return; |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
627 } |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
628 } |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
629 |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
630 rc = ngx_regex_exec(code->regex, &e->line, r->captures, code->ncaptures); |
509 | 631 |
632 if (rc == NGX_REGEX_NO_MATCHED) { | |
2397 | 633 if (e->log || (r->connection->log->log_level & NGX_LOG_DEBUG_HTTP)) { |
509 | 634 ngx_log_error(NGX_LOG_NOTICE, r->connection->log, 0, |
515 | 635 "\"%V\" does not match \"%V\"", |
636 &code->name, &e->line); | |
509 | 637 } |
638 | |
2547
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
639 r->ncaptures = 0; |
515 | 640 |
509 | 641 if (code->test) { |
631 | 642 if (code->negative_test) { |
643 e->sp->len = 1; | |
644 e->sp->data = (u_char *) "1"; | |
645 | |
646 } else { | |
647 e->sp->len = 0; | |
648 e->sp->data = (u_char *) ""; | |
649 } | |
650 | |
509 | 651 e->sp++; |
652 | |
653 e->ip += sizeof(ngx_http_script_regex_code_t); | |
654 return; | |
655 } | |
656 | |
657 e->ip += code->next; | |
658 return; | |
659 } | |
660 | |
661 if (rc < 0) { | |
662 ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0, | |
663 ngx_regex_exec_n " failed: %d on \"%V\" using \"%V\"", | |
515 | 664 rc, &e->line, &code->name); |
509 | 665 |
666 e->ip = ngx_http_script_exit; | |
667 e->status = NGX_HTTP_INTERNAL_SERVER_ERROR; | |
668 return; | |
669 } | |
670 | |
2397 | 671 if (e->log || (r->connection->log->log_level & NGX_LOG_DEBUG_HTTP)) { |
509 | 672 ngx_log_error(NGX_LOG_NOTICE, r->connection->log, 0, |
515 | 673 "\"%V\" matches \"%V\"", &code->name, &e->line); |
509 | 674 } |
675 | |
2547
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
676 r->ncaptures = code->ncaptures; |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
677 r->captures_data = e->line.data; |
515 | 678 |
509 | 679 if (code->test) { |
631 | 680 if (code->negative_test) { |
681 e->sp->len = 0; | |
682 e->sp->data = (u_char *) ""; | |
683 | |
684 } else { | |
685 e->sp->len = 1; | |
686 e->sp->data = (u_char *) "1"; | |
687 } | |
688 | |
509 | 689 e->sp++; |
690 | |
691 e->ip += sizeof(ngx_http_script_regex_code_t); | |
692 return; | |
693 } | |
694 | |
695 if (code->status) { | |
696 e->status = code->status; | |
507 | 697 |
509 | 698 if (!code->redirect) { |
699 e->ip = ngx_http_script_exit; | |
700 return; | |
701 } | |
702 } | |
703 | |
704 if (code->uri) { | |
705 r->internal = 1; | |
706 r->valid_unparsed_uri = 0; | |
707 | |
708 if (code->break_cycle) { | |
709 r->valid_location = 0; | |
527 | 710 r->uri_changed = 0; |
509 | 711 |
712 } else { | |
713 r->uri_changed = 1; | |
714 } | |
715 } | |
716 | |
717 if (code->lengths == NULL) { | |
718 e->buf.len = code->size; | |
719 | |
720 if (code->uri) { | |
721 if (rc && (r->quoted_uri || r->plus_in_uri)) { | |
722 e->buf.len += 2 * ngx_escape_uri(NULL, r->uri.data, r->uri.len, | |
723 NGX_ESCAPE_ARGS); | |
724 } | |
725 } | |
726 | |
727 for (n = 1; n < (ngx_uint_t) rc; n++) { | |
2547
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
728 e->buf.len += r->captures[2 * n + 1] - r->captures[2 * n]; |
509 | 729 } |
730 | |
731 } else { | |
732 ngx_memzero(&le, sizeof(ngx_http_script_engine_t)); | |
733 | |
734 le.ip = code->lengths->elts; | |
679 | 735 le.line = e->line; |
509 | 736 le.request = r; |
679 | 737 le.quote = code->redirect; |
509 | 738 |
1891
782af1038115
length calculation did not take into account escaped symbols in arguments
Igor Sysoev <igor@sysoev.ru>
parents:
1799
diff
changeset
|
739 len = 0; |
509 | 740 |
741 while (*(uintptr_t *) le.ip) { | |
742 lcode = *(ngx_http_script_len_code_pt *) le.ip; | |
743 len += lcode(&le); | |
744 } | |
745 | |
746 e->buf.len = len; | |
1891
782af1038115
length calculation did not take into account escaped symbols in arguments
Igor Sysoev <igor@sysoev.ru>
parents:
1799
diff
changeset
|
747 e->is_args = le.is_args; |
509 | 748 } |
749 | |
515 | 750 if (code->add_args && r->args.len) { |
509 | 751 e->buf.len += r->args.len + 1; |
752 } | |
753 | |
2049 | 754 e->buf.data = ngx_pnalloc(r->pool, e->buf.len); |
509 | 755 if (e->buf.data == NULL) { |
756 e->ip = ngx_http_script_exit; | |
757 e->status = NGX_HTTP_INTERNAL_SERVER_ERROR; | |
507 | 758 return; |
759 } | |
760 | |
509 | 761 e->quote = code->redirect; |
762 | |
763 e->pos = e->buf.data; | |
764 | |
765 e->ip += sizeof(ngx_http_script_regex_code_t); | |
766 } | |
767 | |
768 | |
769 void | |
770 ngx_http_script_regex_end_code(ngx_http_script_engine_t *e) | |
771 { | |
577 | 772 u_char *dst, *src; |
509 | 773 ngx_http_request_t *r; |
774 ngx_http_script_regex_end_code_t *code; | |
775 | |
776 code = (ngx_http_script_regex_end_code_t *) e->ip; | |
777 | |
778 r = e->request; | |
779 | |
780 e->quote = 0; | |
781 | |
782 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, | |
783 "http script regex end"); | |
784 | |
785 if (code->redirect) { | |
786 | |
577 | 787 dst = e->buf.data; |
788 src = e->buf.data; | |
789 | |
1593 | 790 ngx_unescape_uri(&dst, &src, e->pos - e->buf.data, |
791 NGX_UNESCAPE_REDIRECT); | |
577 | 792 |
793 if (src < e->pos) { | |
794 dst = ngx_copy(dst, src, e->pos - src); | |
795 } | |
796 | |
797 e->pos = dst; | |
798 | |
799 if (code->add_args && r->args.len) { | |
509 | 800 *e->pos++ = (u_char) (code->args ? '&' : '?'); |
573 | 801 e->pos = ngx_copy(e->pos, r->args.data, r->args.len); |
509 | 802 } |
803 | |
804 e->buf.len = e->pos - e->buf.data; | |
805 | |
2397 | 806 if (e->log || (r->connection->log->log_level & NGX_LOG_DEBUG_HTTP)) { |
509 | 807 ngx_log_error(NGX_LOG_NOTICE, r->connection->log, 0, |
808 "rewritten redirect: \"%V\"", &e->buf); | |
809 } | |
810 | |
811 r->headers_out.location = ngx_list_push(&r->headers_out.headers); | |
812 if (r->headers_out.location == NULL) { | |
813 e->ip = ngx_http_script_exit; | |
814 e->status = NGX_HTTP_INTERNAL_SERVER_ERROR; | |
815 return; | |
816 } | |
817 | |
577 | 818 r->headers_out.location->hash = 1; |
509 | 819 r->headers_out.location->key.len = sizeof("Location") - 1; |
820 r->headers_out.location->key.data = (u_char *) "Location"; | |
821 r->headers_out.location->value = e->buf; | |
822 | |
823 e->ip += sizeof(ngx_http_script_regex_end_code_t); | |
824 return; | |
825 } | |
826 | |
577 | 827 if (e->args) { |
509 | 828 e->buf.len = e->args - e->buf.data; |
829 | |
830 if (code->add_args && r->args.len) { | |
831 *e->pos++ = '&'; | |
573 | 832 e->pos = ngx_copy(e->pos, r->args.data, r->args.len); |
509 | 833 } |
834 | |
835 r->args.len = e->pos - e->args; | |
836 r->args.data = e->args; | |
837 | |
838 e->args = NULL; | |
839 | |
840 } else { | |
841 e->buf.len = e->pos - e->buf.data; | |
673 | 842 |
843 if (!code->add_args) { | |
844 r->args.len = 0; | |
845 } | |
509 | 846 } |
847 | |
2397 | 848 if (e->log || (r->connection->log->log_level & NGX_LOG_DEBUG_HTTP)) { |
509 | 849 ngx_log_error(NGX_LOG_NOTICE, r->connection->log, 0, |
850 "rewritten data: \"%V\", args: \"%V\"", | |
851 &e->buf, &r->args); | |
852 } | |
853 | |
854 if (code->uri) { | |
855 r->uri = e->buf; | |
856 | |
535 | 857 if (r->uri.len == 0) { |
858 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, | |
859 "the rewritten URI has a zero length"); | |
860 e->ip = ngx_http_script_exit; | |
861 e->status = NGX_HTTP_INTERNAL_SERVER_ERROR; | |
862 return; | |
863 } | |
864 | |
509 | 865 if (ngx_http_set_exten(r) != NGX_OK) { |
866 e->ip = ngx_http_script_exit; | |
867 e->status = NGX_HTTP_INTERNAL_SERVER_ERROR; | |
868 return; | |
869 } | |
870 } | |
871 | |
872 e->ip += sizeof(ngx_http_script_regex_end_code_t); | |
873 } | |
874 | |
2547
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
875 |
2577
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
876 static ngx_int_t |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
877 ngx_http_script_add_capture_code(ngx_http_script_compile_t *sc, ngx_uint_t n) |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
878 { |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
879 ngx_http_script_copy_capture_code_t *code; |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
880 |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
881 code = ngx_http_script_add_code(*sc->lengths, |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
882 sizeof(ngx_http_script_copy_capture_code_t), |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
883 NULL); |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
884 if (code == NULL) { |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
885 return NGX_ERROR; |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
886 } |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
887 |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
888 code->code = (ngx_http_script_code_pt) |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
889 ngx_http_script_copy_capture_len_code; |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
890 code->n = 2 * n; |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
891 |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
892 |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
893 code = ngx_http_script_add_code(*sc->values, |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
894 sizeof(ngx_http_script_copy_capture_code_t), |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
895 &sc->main); |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
896 if (code == NULL) { |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
897 return NGX_ERROR; |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
898 } |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
899 |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
900 code->code = ngx_http_script_copy_capture_code; |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
901 code->n = 2 * n; |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
902 |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
903 if (sc->ncaptures < n) { |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
904 sc->ncaptures = n; |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
905 } |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
906 |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
907 return NGX_OK; |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
908 } |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
909 |
2dcbcfc1a8d1
split ngx_http_script_compile()
Igor Sysoev <igor@sysoev.ru>
parents:
2547
diff
changeset
|
910 |
2547
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
911 size_t |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
912 ngx_http_script_copy_capture_len_code(ngx_http_script_engine_t *e) |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
913 { |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
914 int *cap; |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
915 u_char *p; |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
916 ngx_uint_t n; |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
917 ngx_http_request_t *r; |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
918 ngx_http_script_copy_capture_code_t *code; |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
919 |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
920 r = e->request; |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
921 |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
922 code = (ngx_http_script_copy_capture_code_t *) e->ip; |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
923 |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
924 e->ip += sizeof(ngx_http_script_copy_capture_code_t); |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
925 |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
926 n = code->n; |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
927 |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
928 if (n < r->ncaptures) { |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
929 |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
930 cap = r->captures; |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
931 |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
932 if ((e->is_args || e->quote) |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
933 && (e->request->quoted_uri || e->request->plus_in_uri)) |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
934 { |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
935 p = r->captures_data; |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
936 |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
937 return cap[n + 1] - cap[n] |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
938 + 2 * ngx_escape_uri(NULL, &p[cap[n]], cap[n + 1] - cap[n], |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
939 NGX_ESCAPE_ARGS); |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
940 } else { |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
941 return cap[n + 1] - cap[n]; |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
942 } |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
943 } |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
944 |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
945 return 0; |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
946 } |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
947 |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
948 |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
949 void |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
950 ngx_http_script_copy_capture_code(ngx_http_script_engine_t *e) |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
951 { |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
952 int *cap; |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
953 u_char *p, *pos; |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
954 ngx_uint_t n; |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
955 ngx_http_request_t *r; |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
956 ngx_http_script_copy_capture_code_t *code; |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
957 |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
958 r = e->request; |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
959 |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
960 code = (ngx_http_script_copy_capture_code_t *) e->ip; |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
961 |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
962 e->ip += sizeof(ngx_http_script_copy_capture_code_t); |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
963 |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
964 n = code->n; |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
965 |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
966 pos = e->pos; |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
967 |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
968 if (n < r->ncaptures) { |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
969 |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
970 cap = r->captures; |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
971 p = r->captures_data; |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
972 |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
973 if ((e->is_args || e->quote) |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
974 && (e->request->quoted_uri || e->request->plus_in_uri)) |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
975 { |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
976 e->pos = (u_char *) ngx_escape_uri(pos, &p[cap[n]], |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
977 cap[n + 1] - cap[n], |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
978 NGX_ESCAPE_ARGS); |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
979 } else { |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
980 e->pos = ngx_copy(pos, &p[cap[n]], cap[n + 1] - cap[n]); |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
981 } |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
982 } |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
983 |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
984 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0, |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
985 "http script capture: \"%*s\"", e->pos - pos, pos); |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
986 } |
912ce4113f21
now regex captures are per-request entities
Igor Sysoev <igor@sysoev.ru>
parents:
2498
diff
changeset
|
987 |
517 | 988 #endif |
989 | |
509 | 990 |
991 void | |
992 ngx_http_script_return_code(ngx_http_script_engine_t *e) | |
577 | 993 { |
509 | 994 ngx_http_script_return_code_t *code; |
577 | 995 |
509 | 996 code = (ngx_http_script_return_code_t *) e->ip; |
997 | |
998 e->status = code->status; | |
999 | |
653 | 1000 if (code->status == NGX_HTTP_NO_CONTENT) { |
1001 e->request->header_only = 1; | |
730
1be87cdd010f
set "Content-Length: 0" for errors handled by "return 204"
Igor Sysoev <igor@sysoev.ru>
parents:
679
diff
changeset
|
1002 e->request->zero_body = 1; |
653 | 1003 } |
1004 | |
509 | 1005 e->ip += sizeof(ngx_http_script_return_code_t) - sizeof(uintptr_t); |
479 | 1006 } |
509 | 1007 |
1008 | |
1009 void | |
527 | 1010 ngx_http_script_break_code(ngx_http_script_engine_t *e) |
1011 { | |
1012 e->request->uri_changed = 0; | |
1013 | |
1014 e->ip = ngx_http_script_exit; | |
1015 } | |
1016 | |
1017 | |
1018 void | |
509 | 1019 ngx_http_script_if_code(ngx_http_script_engine_t *e) |
1020 { | |
1021 ngx_http_script_if_code_t *code; | |
1022 | |
1023 code = (ngx_http_script_if_code_t *) e->ip; | |
1024 | |
1025 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0, | |
1026 "http script if"); | |
1027 | |
1028 e->sp--; | |
1029 | |
573 | 1030 if (e->sp->len && e->sp->data[0] != '0') { |
509 | 1031 if (code->loc_conf) { |
1032 e->request->loc_conf = code->loc_conf; | |
535 | 1033 ngx_http_update_location_config(e->request); |
509 | 1034 } |
1035 | |
1036 e->ip += sizeof(ngx_http_script_if_code_t); | |
1037 return; | |
1038 } | |
1039 | |
1040 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0, | |
577 | 1041 "http script if: false"); |
509 | 1042 |
1043 e->ip += code->next; | |
1044 } | |
1045 | |
1046 | |
1047 void | |
577 | 1048 ngx_http_script_equal_code(ngx_http_script_engine_t *e) |
1049 { | |
1050 ngx_http_variable_value_t *val, *res; | |
1051 | |
1052 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0, | |
1053 "http script equal"); | |
1054 | |
1055 e->sp--; | |
1056 val = e->sp; | |
1057 res = e->sp - 1; | |
1058 | |
1059 e->ip += sizeof(uintptr_t); | |
1060 | |
2393 | 1061 if (val->len == res->len |
1062 && ngx_strncmp(val->data, res->data, res->len) == 0) | |
577 | 1063 { |
1064 *res = ngx_http_variable_true_value; | |
1065 return; | |
1066 } | |
1067 | |
1068 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0, | |
1069 "http script equal: no"); | |
1070 | |
1071 *res = ngx_http_variable_null_value; | |
1072 } | |
1073 | |
1074 | |
1075 void | |
1076 ngx_http_script_not_equal_code(ngx_http_script_engine_t *e) | |
1077 { | |
1078 ngx_http_variable_value_t *val, *res; | |
1079 | |
1080 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0, | |
1081 "http script not equal"); | |
1082 | |
1083 e->sp--; | |
1084 val = e->sp; | |
1085 res = e->sp - 1; | |
1086 | |
1087 e->ip += sizeof(uintptr_t); | |
1088 | |
2393 | 1089 if (val->len == res->len |
1090 && ngx_strncmp(val->data, res->data, res->len) == 0) | |
577 | 1091 { |
1092 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0, | |
1093 "http script not equal: no"); | |
1094 | |
1095 *res = ngx_http_variable_null_value; | |
1096 return; | |
1097 } | |
1098 | |
1099 *res = ngx_http_variable_true_value; | |
1100 } | |
1101 | |
1102 | |
1103 void | |
631 | 1104 ngx_http_script_file_code(ngx_http_script_engine_t *e) |
1105 { | |
1454 | 1106 ngx_str_t path; |
1107 ngx_http_request_t *r; | |
1108 ngx_open_file_info_t of; | |
1109 ngx_http_core_loc_conf_t *clcf; | |
631 | 1110 ngx_http_variable_value_t *value; |
1111 ngx_http_script_file_code_t *code; | |
1112 | |
1113 value = e->sp - 1; | |
1114 | |
1115 code = (ngx_http_script_file_code_t *) e->ip; | |
1116 e->ip += sizeof(ngx_http_script_file_code_t); | |
1117 | |
1454 | 1118 path.len = value->len - 1; |
1119 path.data = value->data; | |
1120 | |
1121 r = e->request; | |
1122 | |
1123 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, | |
1124 "http script file op %p \"%V\"", code->op, &path); | |
1125 | |
1126 clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); | |
631 | 1127 |
2068
75a8d34459c5
ngx_memzero() ngx_open_file_info_t
Igor Sysoev <igor@sysoev.ru>
parents:
2063
diff
changeset
|
1128 ngx_memzero(&of, sizeof(ngx_open_file_info_t)); |
75a8d34459c5
ngx_memzero() ngx_open_file_info_t
Igor Sysoev <igor@sysoev.ru>
parents:
2063
diff
changeset
|
1129 |
2129 | 1130 of.directio = clcf->directio; |
1767
c42431762903
open_file_cache_retest > open_file_cache_valid
Igor Sysoev <igor@sysoev.ru>
parents:
1593
diff
changeset
|
1131 of.valid = clcf->open_file_cache_valid; |
1772 | 1132 of.min_uses = clcf->open_file_cache_min_uses; |
1454 | 1133 of.errors = clcf->open_file_cache_errors; |
1457 | 1134 of.events = clcf->open_file_cache_events; |
631 | 1135 |
1454 | 1136 if (ngx_open_cached_file(clcf->open_file_cache, &path, &of, r->pool) |
1799 | 1137 != NGX_OK) |
1454 | 1138 { |
1139 if (of.err != NGX_ENOENT && of.err != NGX_ENOTDIR) { | |
1140 ngx_log_error(NGX_LOG_CRIT, r->connection->log, of.err, | |
631 | 1141 ngx_file_info_n " \"%s\" failed", value->data); |
1142 } | |
1143 | |
1144 switch (code->op) { | |
671 | 1145 |
631 | 1146 case ngx_http_script_file_plain: |
669 | 1147 case ngx_http_script_file_dir: |
1148 case ngx_http_script_file_exists: | |
1149 case ngx_http_script_file_exec: | |
2133
c505e2712e13
fix conflicting names "true" and "false"
Igor Sysoev <igor@sysoev.ru>
parents:
2129
diff
changeset
|
1150 goto false_value; |
671 | 1151 |
631 | 1152 case ngx_http_script_file_not_plain: |
669 | 1153 case ngx_http_script_file_not_dir: |
671 | 1154 case ngx_http_script_file_not_exists: |
669 | 1155 case ngx_http_script_file_not_exec: |
2133
c505e2712e13
fix conflicting names "true" and "false"
Igor Sysoev <igor@sysoev.ru>
parents:
2129
diff
changeset
|
1156 goto true_value; |
631 | 1157 } |
1158 | |
2133
c505e2712e13
fix conflicting names "true" and "false"
Igor Sysoev <igor@sysoev.ru>
parents:
2129
diff
changeset
|
1159 goto false_value; |
631 | 1160 } |
1161 | |
1162 switch (code->op) { | |
1163 case ngx_http_script_file_plain: | |
1454 | 1164 if (of.is_file) { |
2133
c505e2712e13
fix conflicting names "true" and "false"
Igor Sysoev <igor@sysoev.ru>
parents:
2129
diff
changeset
|
1165 goto true_value; |
631 | 1166 } |
2133
c505e2712e13
fix conflicting names "true" and "false"
Igor Sysoev <igor@sysoev.ru>
parents:
2129
diff
changeset
|
1167 goto false_value; |
631 | 1168 |
1169 case ngx_http_script_file_not_plain: | |
1454 | 1170 if (of.is_file) { |
2133
c505e2712e13
fix conflicting names "true" and "false"
Igor Sysoev <igor@sysoev.ru>
parents:
2129
diff
changeset
|
1171 goto false_value; |
631 | 1172 } |
2133
c505e2712e13
fix conflicting names "true" and "false"
Igor Sysoev <igor@sysoev.ru>
parents:
2129
diff
changeset
|
1173 goto true_value; |
669 | 1174 |
1175 case ngx_http_script_file_dir: | |
1454 | 1176 if (of.is_dir) { |
2133
c505e2712e13
fix conflicting names "true" and "false"
Igor Sysoev <igor@sysoev.ru>
parents:
2129
diff
changeset
|
1177 goto true_value; |
669 | 1178 } |
2133
c505e2712e13
fix conflicting names "true" and "false"
Igor Sysoev <igor@sysoev.ru>
parents:
2129
diff
changeset
|
1179 goto false_value; |
669 | 1180 |
1181 case ngx_http_script_file_not_dir: | |
1454 | 1182 if (of.is_dir) { |
2133
c505e2712e13
fix conflicting names "true" and "false"
Igor Sysoev <igor@sysoev.ru>
parents:
2129
diff
changeset
|
1183 goto false_value; |
669 | 1184 } |
2133
c505e2712e13
fix conflicting names "true" and "false"
Igor Sysoev <igor@sysoev.ru>
parents:
2129
diff
changeset
|
1185 goto true_value; |
669 | 1186 |
1187 case ngx_http_script_file_exists: | |
1454 | 1188 if (of.is_file || of.is_dir || of.is_link) { |
2133
c505e2712e13
fix conflicting names "true" and "false"
Igor Sysoev <igor@sysoev.ru>
parents:
2129
diff
changeset
|
1189 goto true_value; |
669 | 1190 } |
2133
c505e2712e13
fix conflicting names "true" and "false"
Igor Sysoev <igor@sysoev.ru>
parents:
2129
diff
changeset
|
1191 goto false_value; |
669 | 1192 |
1193 case ngx_http_script_file_not_exists: | |
1454 | 1194 if (of.is_file || of.is_dir || of.is_link) { |
2133
c505e2712e13
fix conflicting names "true" and "false"
Igor Sysoev <igor@sysoev.ru>
parents:
2129
diff
changeset
|
1195 goto false_value; |
669 | 1196 } |
2133
c505e2712e13
fix conflicting names "true" and "false"
Igor Sysoev <igor@sysoev.ru>
parents:
2129
diff
changeset
|
1197 goto true_value; |
669 | 1198 |
1199 case ngx_http_script_file_exec: | |
1454 | 1200 if (of.is_exec) { |
2133
c505e2712e13
fix conflicting names "true" and "false"
Igor Sysoev <igor@sysoev.ru>
parents:
2129
diff
changeset
|
1201 goto true_value; |
669 | 1202 } |
2133
c505e2712e13
fix conflicting names "true" and "false"
Igor Sysoev <igor@sysoev.ru>
parents:
2129
diff
changeset
|
1203 goto false_value; |
669 | 1204 |
1205 case ngx_http_script_file_not_exec: | |
1454 | 1206 if (of.is_exec) { |
2133
c505e2712e13
fix conflicting names "true" and "false"
Igor Sysoev <igor@sysoev.ru>
parents:
2129
diff
changeset
|
1207 goto false_value; |
669 | 1208 } |
2133
c505e2712e13
fix conflicting names "true" and "false"
Igor Sysoev <igor@sysoev.ru>
parents:
2129
diff
changeset
|
1209 goto true_value; |
631 | 1210 } |
1211 | |
2133
c505e2712e13
fix conflicting names "true" and "false"
Igor Sysoev <igor@sysoev.ru>
parents:
2129
diff
changeset
|
1212 false_value: |
631 | 1213 |
1454 | 1214 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, |
631 | 1215 "http script file op false"); |
1216 | |
1217 *value = ngx_http_variable_null_value; | |
1218 return; | |
1219 | |
2133
c505e2712e13
fix conflicting names "true" and "false"
Igor Sysoev <igor@sysoev.ru>
parents:
2129
diff
changeset
|
1220 true_value: |
631 | 1221 |
1222 *value = ngx_http_variable_true_value; | |
1223 return; | |
1224 } | |
1225 | |
1226 | |
1227 void | |
515 | 1228 ngx_http_script_complex_value_code(ngx_http_script_engine_t *e) |
1229 { | |
1230 size_t len; | |
1231 ngx_http_script_engine_t le; | |
1232 ngx_http_script_len_code_pt lcode; | |
1233 ngx_http_script_complex_value_code_t *code; | |
1234 | |
1235 code = (ngx_http_script_complex_value_code_t *) e->ip; | |
1236 | |
1237 e->ip += sizeof(ngx_http_script_complex_value_code_t); | |
1238 | |
1239 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0, | |
1240 "http script complex value"); | |
1241 | |
1242 ngx_memzero(&le, sizeof(ngx_http_script_engine_t)); | |
1243 | |
1244 le.ip = code->lengths->elts; | |
655 | 1245 le.line = e->line; |
515 | 1246 le.request = e->request; |
655 | 1247 le.quote = e->quote; |
515 | 1248 |
1249 for (len = 0; *(uintptr_t *) le.ip; len += lcode(&le)) { | |
1250 lcode = *(ngx_http_script_len_code_pt *) le.ip; | |
1251 } | |
1252 | |
1253 e->buf.len = len; | |
2049 | 1254 e->buf.data = ngx_pnalloc(e->request->pool, len); |
515 | 1255 if (e->buf.data == NULL) { |
1256 e->ip = ngx_http_script_exit; | |
1257 e->status = NGX_HTTP_INTERNAL_SERVER_ERROR; | |
1258 return; | |
1259 } | |
1260 | |
1261 e->pos = e->buf.data; | |
1262 | |
577 | 1263 e->sp->len = e->buf.len; |
573 | 1264 e->sp->data = e->buf.data; |
515 | 1265 e->sp++; |
1266 } | |
1267 | |
1268 | |
1269 void | |
509 | 1270 ngx_http_script_value_code(ngx_http_script_engine_t *e) |
1271 { | |
1272 ngx_http_script_value_code_t *code; | |
1273 | |
1274 code = (ngx_http_script_value_code_t *) e->ip; | |
1275 | |
1276 e->ip += sizeof(ngx_http_script_value_code_t); | |
1277 | |
573 | 1278 e->sp->len = code->text_len; |
1279 e->sp->data = (u_char *) code->text_data; | |
577 | 1280 |
1281 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0, | |
1561 | 1282 "http script value: \"%v\"", e->sp); |
577 | 1283 |
509 | 1284 e->sp++; |
1285 } | |
1286 | |
1287 | |
1288 void | |
1289 ngx_http_script_set_var_code(ngx_http_script_engine_t *e) | |
1290 { | |
1291 ngx_http_request_t *r; | |
1292 ngx_http_script_var_code_t *code; | |
1293 | |
1294 code = (ngx_http_script_var_code_t *) e->ip; | |
1295 | |
1296 e->ip += sizeof(ngx_http_script_var_code_t); | |
1297 | |
1298 r = e->request; | |
1299 | |
1300 e->sp--; | |
1301 | |
573 | 1302 r->variables[code->index].len = e->sp->len; |
1303 r->variables[code->index].valid = 1; | |
1565 | 1304 r->variables[code->index].no_cacheable = 0; |
573 | 1305 r->variables[code->index].not_found = 0; |
1306 r->variables[code->index].data = e->sp->data; | |
2393 | 1307 |
1308 #if (NGX_DEBUG) | |
1309 { | |
1310 ngx_http_variable_t *v; | |
1311 ngx_http_core_main_conf_t *cmcf; | |
1312 | |
1313 cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module); | |
1314 | |
1315 v = cmcf->variables.elts; | |
1316 | |
1317 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0, | |
1318 "http script set $%V", &v[code->index].name); | |
1319 } | |
1320 #endif | |
509 | 1321 } |
1322 | |
1323 | |
1324 void | |
637 | 1325 ngx_http_script_var_set_handler_code(ngx_http_script_engine_t *e) |
1326 { | |
1327 ngx_http_script_var_handler_code_t *code; | |
1328 | |
1329 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0, | |
1330 "http script set var handler"); | |
1331 | |
1332 code = (ngx_http_script_var_handler_code_t *) e->ip; | |
1333 | |
1334 e->ip += sizeof(ngx_http_script_var_handler_code_t); | |
1335 | |
1336 e->sp--; | |
1337 | |
1338 code->handler(e->request, e->sp, code->data); | |
1339 } | |
1340 | |
1341 | |
1342 void | |
509 | 1343 ngx_http_script_var_code(ngx_http_script_engine_t *e) |
1344 { | |
1345 ngx_http_variable_value_t *value; | |
1346 ngx_http_script_var_code_t *code; | |
1347 | |
1348 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0, | |
1349 "http script var"); | |
1350 | |
1351 code = (ngx_http_script_var_code_t *) e->ip; | |
1352 | |
1353 e->ip += sizeof(ngx_http_script_var_code_t); | |
1354 | |
573 | 1355 value = ngx_http_get_flushed_variable(e->request, code->index); |
509 | 1356 |
573 | 1357 if (value && !value->not_found) { |
1358 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0, | |
1406
03341711f9a2
use %v for ngx_variable_value_t in ngx_sprintf(),
Igor Sysoev <igor@sysoev.ru>
parents:
1152
diff
changeset
|
1359 "http script var: \"%v\"", value); |
573 | 1360 |
553 | 1361 *e->sp = *value; |
509 | 1362 e->sp++; |
1363 | |
1364 return; | |
1365 } | |
1366 | |
577 | 1367 *e->sp = ngx_http_variable_null_value; |
509 | 1368 e->sp++; |
1369 } | |
1370 | |
1371 | |
1372 void | |
1373 ngx_http_script_nop_code(ngx_http_script_engine_t *e) | |
1374 { | |
1375 e->ip += sizeof(uintptr_t); | |
1376 } |