1*3da8d17dSfengbojiang(姜凤波)
2*3da8d17dSfengbojiang(姜凤波) /*
3*3da8d17dSfengbojiang(姜凤波) * Copyright (C) Igor Sysoev
4*3da8d17dSfengbojiang(姜凤波) * Copyright (C) Nginx, Inc.
5*3da8d17dSfengbojiang(姜凤波) */
6*3da8d17dSfengbojiang(姜凤波)
7*3da8d17dSfengbojiang(姜凤波)
8*3da8d17dSfengbojiang(姜凤波) #include <ngx_config.h>
9*3da8d17dSfengbojiang(姜凤波) #include <ngx_core.h>
10*3da8d17dSfengbojiang(姜凤波) #include <ngx_http.h>
11*3da8d17dSfengbojiang(姜凤波)
12*3da8d17dSfengbojiang(姜凤波)
13*3da8d17dSfengbojiang(姜凤波) static ngx_int_t ngx_http_script_init_arrays(ngx_http_script_compile_t *sc);
14*3da8d17dSfengbojiang(姜凤波) static ngx_int_t ngx_http_script_done(ngx_http_script_compile_t *sc);
15*3da8d17dSfengbojiang(姜凤波) static ngx_int_t ngx_http_script_add_copy_code(ngx_http_script_compile_t *sc,
16*3da8d17dSfengbojiang(姜凤波) ngx_str_t *value, ngx_uint_t last);
17*3da8d17dSfengbojiang(姜凤波) static ngx_int_t ngx_http_script_add_var_code(ngx_http_script_compile_t *sc,
18*3da8d17dSfengbojiang(姜凤波) ngx_str_t *name);
19*3da8d17dSfengbojiang(姜凤波) static ngx_int_t ngx_http_script_add_args_code(ngx_http_script_compile_t *sc);
20*3da8d17dSfengbojiang(姜凤波) #if (NGX_PCRE)
21*3da8d17dSfengbojiang(姜凤波) static ngx_int_t ngx_http_script_add_capture_code(ngx_http_script_compile_t *sc,
22*3da8d17dSfengbojiang(姜凤波) ngx_uint_t n);
23*3da8d17dSfengbojiang(姜凤波) #endif
24*3da8d17dSfengbojiang(姜凤波) static ngx_int_t
25*3da8d17dSfengbojiang(姜凤波) ngx_http_script_add_full_name_code(ngx_http_script_compile_t *sc);
26*3da8d17dSfengbojiang(姜凤波) static size_t ngx_http_script_full_name_len_code(ngx_http_script_engine_t *e);
27*3da8d17dSfengbojiang(姜凤波) static void ngx_http_script_full_name_code(ngx_http_script_engine_t *e);
28*3da8d17dSfengbojiang(姜凤波)
29*3da8d17dSfengbojiang(姜凤波)
30*3da8d17dSfengbojiang(姜凤波) #define ngx_http_script_exit (u_char *) &ngx_http_script_exit_code
31*3da8d17dSfengbojiang(姜凤波)
32*3da8d17dSfengbojiang(姜凤波) static uintptr_t ngx_http_script_exit_code = (uintptr_t) NULL;
33*3da8d17dSfengbojiang(姜凤波)
34*3da8d17dSfengbojiang(姜凤波)
35*3da8d17dSfengbojiang(姜凤波) void
ngx_http_script_flush_complex_value(ngx_http_request_t * r,ngx_http_complex_value_t * val)36*3da8d17dSfengbojiang(姜凤波) ngx_http_script_flush_complex_value(ngx_http_request_t *r,
37*3da8d17dSfengbojiang(姜凤波) ngx_http_complex_value_t *val)
38*3da8d17dSfengbojiang(姜凤波) {
39*3da8d17dSfengbojiang(姜凤波) ngx_uint_t *index;
40*3da8d17dSfengbojiang(姜凤波)
41*3da8d17dSfengbojiang(姜凤波) index = val->flushes;
42*3da8d17dSfengbojiang(姜凤波)
43*3da8d17dSfengbojiang(姜凤波) if (index) {
44*3da8d17dSfengbojiang(姜凤波) while (*index != (ngx_uint_t) -1) {
45*3da8d17dSfengbojiang(姜凤波)
46*3da8d17dSfengbojiang(姜凤波) if (r->variables[*index].no_cacheable) {
47*3da8d17dSfengbojiang(姜凤波) r->variables[*index].valid = 0;
48*3da8d17dSfengbojiang(姜凤波) r->variables[*index].not_found = 0;
49*3da8d17dSfengbojiang(姜凤波) }
50*3da8d17dSfengbojiang(姜凤波)
51*3da8d17dSfengbojiang(姜凤波) index++;
52*3da8d17dSfengbojiang(姜凤波) }
53*3da8d17dSfengbojiang(姜凤波) }
54*3da8d17dSfengbojiang(姜凤波) }
55*3da8d17dSfengbojiang(姜凤波)
56*3da8d17dSfengbojiang(姜凤波)
57*3da8d17dSfengbojiang(姜凤波) ngx_int_t
ngx_http_complex_value(ngx_http_request_t * r,ngx_http_complex_value_t * val,ngx_str_t * value)58*3da8d17dSfengbojiang(姜凤波) ngx_http_complex_value(ngx_http_request_t *r, ngx_http_complex_value_t *val,
59*3da8d17dSfengbojiang(姜凤波) ngx_str_t *value)
60*3da8d17dSfengbojiang(姜凤波) {
61*3da8d17dSfengbojiang(姜凤波) size_t len;
62*3da8d17dSfengbojiang(姜凤波) ngx_http_script_code_pt code;
63*3da8d17dSfengbojiang(姜凤波) ngx_http_script_len_code_pt lcode;
64*3da8d17dSfengbojiang(姜凤波) ngx_http_script_engine_t e;
65*3da8d17dSfengbojiang(姜凤波)
66*3da8d17dSfengbojiang(姜凤波) if (val->lengths == NULL) {
67*3da8d17dSfengbojiang(姜凤波) *value = val->value;
68*3da8d17dSfengbojiang(姜凤波) return NGX_OK;
69*3da8d17dSfengbojiang(姜凤波) }
70*3da8d17dSfengbojiang(姜凤波)
71*3da8d17dSfengbojiang(姜凤波) ngx_http_script_flush_complex_value(r, val);
72*3da8d17dSfengbojiang(姜凤波)
73*3da8d17dSfengbojiang(姜凤波) ngx_memzero(&e, sizeof(ngx_http_script_engine_t));
74*3da8d17dSfengbojiang(姜凤波)
75*3da8d17dSfengbojiang(姜凤波) e.ip = val->lengths;
76*3da8d17dSfengbojiang(姜凤波) e.request = r;
77*3da8d17dSfengbojiang(姜凤波) e.flushed = 1;
78*3da8d17dSfengbojiang(姜凤波)
79*3da8d17dSfengbojiang(姜凤波) len = 0;
80*3da8d17dSfengbojiang(姜凤波)
81*3da8d17dSfengbojiang(姜凤波) while (*(uintptr_t *) e.ip) {
82*3da8d17dSfengbojiang(姜凤波) lcode = *(ngx_http_script_len_code_pt *) e.ip;
83*3da8d17dSfengbojiang(姜凤波) len += lcode(&e);
84*3da8d17dSfengbojiang(姜凤波) }
85*3da8d17dSfengbojiang(姜凤波)
86*3da8d17dSfengbojiang(姜凤波) value->len = len;
87*3da8d17dSfengbojiang(姜凤波) value->data = ngx_pnalloc(r->pool, len);
88*3da8d17dSfengbojiang(姜凤波) if (value->data == NULL) {
89*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
90*3da8d17dSfengbojiang(姜凤波) }
91*3da8d17dSfengbojiang(姜凤波)
92*3da8d17dSfengbojiang(姜凤波) e.ip = val->values;
93*3da8d17dSfengbojiang(姜凤波) e.pos = value->data;
94*3da8d17dSfengbojiang(姜凤波) e.buf = *value;
95*3da8d17dSfengbojiang(姜凤波)
96*3da8d17dSfengbojiang(姜凤波) while (*(uintptr_t *) e.ip) {
97*3da8d17dSfengbojiang(姜凤波) code = *(ngx_http_script_code_pt *) e.ip;
98*3da8d17dSfengbojiang(姜凤波) code((ngx_http_script_engine_t *) &e);
99*3da8d17dSfengbojiang(姜凤波) }
100*3da8d17dSfengbojiang(姜凤波)
101*3da8d17dSfengbojiang(姜凤波) *value = e.buf;
102*3da8d17dSfengbojiang(姜凤波)
103*3da8d17dSfengbojiang(姜凤波) return NGX_OK;
104*3da8d17dSfengbojiang(姜凤波) }
105*3da8d17dSfengbojiang(姜凤波)
106*3da8d17dSfengbojiang(姜凤波)
107*3da8d17dSfengbojiang(姜凤波) ngx_int_t
ngx_http_compile_complex_value(ngx_http_compile_complex_value_t * ccv)108*3da8d17dSfengbojiang(姜凤波) ngx_http_compile_complex_value(ngx_http_compile_complex_value_t *ccv)
109*3da8d17dSfengbojiang(姜凤波) {
110*3da8d17dSfengbojiang(姜凤波) ngx_str_t *v;
111*3da8d17dSfengbojiang(姜凤波) ngx_uint_t i, n, nv, nc;
112*3da8d17dSfengbojiang(姜凤波) ngx_array_t flushes, lengths, values, *pf, *pl, *pv;
113*3da8d17dSfengbojiang(姜凤波) ngx_http_script_compile_t sc;
114*3da8d17dSfengbojiang(姜凤波)
115*3da8d17dSfengbojiang(姜凤波) v = ccv->value;
116*3da8d17dSfengbojiang(姜凤波)
117*3da8d17dSfengbojiang(姜凤波) nv = 0;
118*3da8d17dSfengbojiang(姜凤波) nc = 0;
119*3da8d17dSfengbojiang(姜凤波)
120*3da8d17dSfengbojiang(姜凤波) for (i = 0; i < v->len; i++) {
121*3da8d17dSfengbojiang(姜凤波) if (v->data[i] == '$') {
122*3da8d17dSfengbojiang(姜凤波) if (v->data[i + 1] >= '1' && v->data[i + 1] <= '9') {
123*3da8d17dSfengbojiang(姜凤波) nc++;
124*3da8d17dSfengbojiang(姜凤波)
125*3da8d17dSfengbojiang(姜凤波) } else {
126*3da8d17dSfengbojiang(姜凤波) nv++;
127*3da8d17dSfengbojiang(姜凤波) }
128*3da8d17dSfengbojiang(姜凤波) }
129*3da8d17dSfengbojiang(姜凤波) }
130*3da8d17dSfengbojiang(姜凤波)
131*3da8d17dSfengbojiang(姜凤波) if ((v->len == 0 || v->data[0] != '$')
132*3da8d17dSfengbojiang(姜凤波) && (ccv->conf_prefix || ccv->root_prefix))
133*3da8d17dSfengbojiang(姜凤波) {
134*3da8d17dSfengbojiang(姜凤波) if (ngx_conf_full_name(ccv->cf->cycle, v, ccv->conf_prefix) != NGX_OK) {
135*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
136*3da8d17dSfengbojiang(姜凤波) }
137*3da8d17dSfengbojiang(姜凤波)
138*3da8d17dSfengbojiang(姜凤波) ccv->conf_prefix = 0;
139*3da8d17dSfengbojiang(姜凤波) ccv->root_prefix = 0;
140*3da8d17dSfengbojiang(姜凤波) }
141*3da8d17dSfengbojiang(姜凤波)
142*3da8d17dSfengbojiang(姜凤波) ccv->complex_value->value = *v;
143*3da8d17dSfengbojiang(姜凤波) ccv->complex_value->flushes = NULL;
144*3da8d17dSfengbojiang(姜凤波) ccv->complex_value->lengths = NULL;
145*3da8d17dSfengbojiang(姜凤波) ccv->complex_value->values = NULL;
146*3da8d17dSfengbojiang(姜凤波)
147*3da8d17dSfengbojiang(姜凤波) if (nv == 0 && nc == 0) {
148*3da8d17dSfengbojiang(姜凤波) return NGX_OK;
149*3da8d17dSfengbojiang(姜凤波) }
150*3da8d17dSfengbojiang(姜凤波)
151*3da8d17dSfengbojiang(姜凤波) n = nv + 1;
152*3da8d17dSfengbojiang(姜凤波)
153*3da8d17dSfengbojiang(姜凤波) if (ngx_array_init(&flushes, ccv->cf->pool, n, sizeof(ngx_uint_t))
154*3da8d17dSfengbojiang(姜凤波) != NGX_OK)
155*3da8d17dSfengbojiang(姜凤波) {
156*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
157*3da8d17dSfengbojiang(姜凤波) }
158*3da8d17dSfengbojiang(姜凤波)
159*3da8d17dSfengbojiang(姜凤波) n = nv * (2 * sizeof(ngx_http_script_copy_code_t)
160*3da8d17dSfengbojiang(姜凤波) + sizeof(ngx_http_script_var_code_t))
161*3da8d17dSfengbojiang(姜凤波) + sizeof(uintptr_t);
162*3da8d17dSfengbojiang(姜凤波)
163*3da8d17dSfengbojiang(姜凤波) if (ngx_array_init(&lengths, ccv->cf->pool, n, 1) != NGX_OK) {
164*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
165*3da8d17dSfengbojiang(姜凤波) }
166*3da8d17dSfengbojiang(姜凤波)
167*3da8d17dSfengbojiang(姜凤波) n = (nv * (2 * sizeof(ngx_http_script_copy_code_t)
168*3da8d17dSfengbojiang(姜凤波) + sizeof(ngx_http_script_var_code_t))
169*3da8d17dSfengbojiang(姜凤波) + sizeof(uintptr_t)
170*3da8d17dSfengbojiang(姜凤波) + v->len
171*3da8d17dSfengbojiang(姜凤波) + sizeof(uintptr_t) - 1)
172*3da8d17dSfengbojiang(姜凤波) & ~(sizeof(uintptr_t) - 1);
173*3da8d17dSfengbojiang(姜凤波)
174*3da8d17dSfengbojiang(姜凤波) if (ngx_array_init(&values, ccv->cf->pool, n, 1) != NGX_OK) {
175*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
176*3da8d17dSfengbojiang(姜凤波) }
177*3da8d17dSfengbojiang(姜凤波)
178*3da8d17dSfengbojiang(姜凤波) pf = &flushes;
179*3da8d17dSfengbojiang(姜凤波) pl = &lengths;
180*3da8d17dSfengbojiang(姜凤波) pv = &values;
181*3da8d17dSfengbojiang(姜凤波)
182*3da8d17dSfengbojiang(姜凤波) ngx_memzero(&sc, sizeof(ngx_http_script_compile_t));
183*3da8d17dSfengbojiang(姜凤波)
184*3da8d17dSfengbojiang(姜凤波) sc.cf = ccv->cf;
185*3da8d17dSfengbojiang(姜凤波) sc.source = v;
186*3da8d17dSfengbojiang(姜凤波) sc.flushes = &pf;
187*3da8d17dSfengbojiang(姜凤波) sc.lengths = &pl;
188*3da8d17dSfengbojiang(姜凤波) sc.values = &pv;
189*3da8d17dSfengbojiang(姜凤波) sc.complete_lengths = 1;
190*3da8d17dSfengbojiang(姜凤波) sc.complete_values = 1;
191*3da8d17dSfengbojiang(姜凤波) sc.zero = ccv->zero;
192*3da8d17dSfengbojiang(姜凤波) sc.conf_prefix = ccv->conf_prefix;
193*3da8d17dSfengbojiang(姜凤波) sc.root_prefix = ccv->root_prefix;
194*3da8d17dSfengbojiang(姜凤波)
195*3da8d17dSfengbojiang(姜凤波) if (ngx_http_script_compile(&sc) != NGX_OK) {
196*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
197*3da8d17dSfengbojiang(姜凤波) }
198*3da8d17dSfengbojiang(姜凤波)
199*3da8d17dSfengbojiang(姜凤波) if (flushes.nelts) {
200*3da8d17dSfengbojiang(姜凤波) ccv->complex_value->flushes = flushes.elts;
201*3da8d17dSfengbojiang(姜凤波) ccv->complex_value->flushes[flushes.nelts] = (ngx_uint_t) -1;
202*3da8d17dSfengbojiang(姜凤波) }
203*3da8d17dSfengbojiang(姜凤波)
204*3da8d17dSfengbojiang(姜凤波) ccv->complex_value->lengths = lengths.elts;
205*3da8d17dSfengbojiang(姜凤波) ccv->complex_value->values = values.elts;
206*3da8d17dSfengbojiang(姜凤波)
207*3da8d17dSfengbojiang(姜凤波) return NGX_OK;
208*3da8d17dSfengbojiang(姜凤波) }
209*3da8d17dSfengbojiang(姜凤波)
210*3da8d17dSfengbojiang(姜凤波)
211*3da8d17dSfengbojiang(姜凤波) char *
ngx_http_set_complex_value_slot(ngx_conf_t * cf,ngx_command_t * cmd,void * conf)212*3da8d17dSfengbojiang(姜凤波) ngx_http_set_complex_value_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
213*3da8d17dSfengbojiang(姜凤波) {
214*3da8d17dSfengbojiang(姜凤波) char *p = conf;
215*3da8d17dSfengbojiang(姜凤波)
216*3da8d17dSfengbojiang(姜凤波) ngx_str_t *value;
217*3da8d17dSfengbojiang(姜凤波) ngx_http_complex_value_t **cv;
218*3da8d17dSfengbojiang(姜凤波) ngx_http_compile_complex_value_t ccv;
219*3da8d17dSfengbojiang(姜凤波)
220*3da8d17dSfengbojiang(姜凤波) cv = (ngx_http_complex_value_t **) (p + cmd->offset);
221*3da8d17dSfengbojiang(姜凤波)
222*3da8d17dSfengbojiang(姜凤波) if (*cv != NULL) {
223*3da8d17dSfengbojiang(姜凤波) return "is duplicate";
224*3da8d17dSfengbojiang(姜凤波) }
225*3da8d17dSfengbojiang(姜凤波)
226*3da8d17dSfengbojiang(姜凤波) *cv = ngx_palloc(cf->pool, sizeof(ngx_http_complex_value_t));
227*3da8d17dSfengbojiang(姜凤波) if (*cv == NULL) {
228*3da8d17dSfengbojiang(姜凤波) return NGX_CONF_ERROR;
229*3da8d17dSfengbojiang(姜凤波) }
230*3da8d17dSfengbojiang(姜凤波)
231*3da8d17dSfengbojiang(姜凤波) value = cf->args->elts;
232*3da8d17dSfengbojiang(姜凤波)
233*3da8d17dSfengbojiang(姜凤波) ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));
234*3da8d17dSfengbojiang(姜凤波)
235*3da8d17dSfengbojiang(姜凤波) ccv.cf = cf;
236*3da8d17dSfengbojiang(姜凤波) ccv.value = &value[1];
237*3da8d17dSfengbojiang(姜凤波) ccv.complex_value = *cv;
238*3da8d17dSfengbojiang(姜凤波)
239*3da8d17dSfengbojiang(姜凤波) if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {
240*3da8d17dSfengbojiang(姜凤波) return NGX_CONF_ERROR;
241*3da8d17dSfengbojiang(姜凤波) }
242*3da8d17dSfengbojiang(姜凤波)
243*3da8d17dSfengbojiang(姜凤波) return NGX_CONF_OK;
244*3da8d17dSfengbojiang(姜凤波) }
245*3da8d17dSfengbojiang(姜凤波)
246*3da8d17dSfengbojiang(姜凤波)
247*3da8d17dSfengbojiang(姜凤波) ngx_int_t
ngx_http_test_predicates(ngx_http_request_t * r,ngx_array_t * predicates)248*3da8d17dSfengbojiang(姜凤波) ngx_http_test_predicates(ngx_http_request_t *r, ngx_array_t *predicates)
249*3da8d17dSfengbojiang(姜凤波) {
250*3da8d17dSfengbojiang(姜凤波) ngx_str_t val;
251*3da8d17dSfengbojiang(姜凤波) ngx_uint_t i;
252*3da8d17dSfengbojiang(姜凤波) ngx_http_complex_value_t *cv;
253*3da8d17dSfengbojiang(姜凤波)
254*3da8d17dSfengbojiang(姜凤波) if (predicates == NULL) {
255*3da8d17dSfengbojiang(姜凤波) return NGX_OK;
256*3da8d17dSfengbojiang(姜凤波) }
257*3da8d17dSfengbojiang(姜凤波)
258*3da8d17dSfengbojiang(姜凤波) cv = predicates->elts;
259*3da8d17dSfengbojiang(姜凤波)
260*3da8d17dSfengbojiang(姜凤波) for (i = 0; i < predicates->nelts; i++) {
261*3da8d17dSfengbojiang(姜凤波) if (ngx_http_complex_value(r, &cv[i], &val) != NGX_OK) {
262*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
263*3da8d17dSfengbojiang(姜凤波) }
264*3da8d17dSfengbojiang(姜凤波)
265*3da8d17dSfengbojiang(姜凤波) if (val.len && (val.len != 1 || val.data[0] != '0')) {
266*3da8d17dSfengbojiang(姜凤波) return NGX_DECLINED;
267*3da8d17dSfengbojiang(姜凤波) }
268*3da8d17dSfengbojiang(姜凤波) }
269*3da8d17dSfengbojiang(姜凤波)
270*3da8d17dSfengbojiang(姜凤波) return NGX_OK;
271*3da8d17dSfengbojiang(姜凤波) }
272*3da8d17dSfengbojiang(姜凤波)
273*3da8d17dSfengbojiang(姜凤波)
274*3da8d17dSfengbojiang(姜凤波) ngx_int_t
ngx_http_test_required_predicates(ngx_http_request_t * r,ngx_array_t * predicates)275*3da8d17dSfengbojiang(姜凤波) ngx_http_test_required_predicates(ngx_http_request_t *r,
276*3da8d17dSfengbojiang(姜凤波) ngx_array_t *predicates)
277*3da8d17dSfengbojiang(姜凤波) {
278*3da8d17dSfengbojiang(姜凤波) ngx_str_t val;
279*3da8d17dSfengbojiang(姜凤波) ngx_uint_t i;
280*3da8d17dSfengbojiang(姜凤波) ngx_http_complex_value_t *cv;
281*3da8d17dSfengbojiang(姜凤波)
282*3da8d17dSfengbojiang(姜凤波) if (predicates == NULL) {
283*3da8d17dSfengbojiang(姜凤波) return NGX_OK;
284*3da8d17dSfengbojiang(姜凤波) }
285*3da8d17dSfengbojiang(姜凤波)
286*3da8d17dSfengbojiang(姜凤波) cv = predicates->elts;
287*3da8d17dSfengbojiang(姜凤波)
288*3da8d17dSfengbojiang(姜凤波) for (i = 0; i < predicates->nelts; i++) {
289*3da8d17dSfengbojiang(姜凤波) if (ngx_http_complex_value(r, &cv[i], &val) != NGX_OK) {
290*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
291*3da8d17dSfengbojiang(姜凤波) }
292*3da8d17dSfengbojiang(姜凤波)
293*3da8d17dSfengbojiang(姜凤波) if (val.len == 0 || (val.len == 1 && val.data[0] == '0')) {
294*3da8d17dSfengbojiang(姜凤波) return NGX_DECLINED;
295*3da8d17dSfengbojiang(姜凤波) }
296*3da8d17dSfengbojiang(姜凤波) }
297*3da8d17dSfengbojiang(姜凤波)
298*3da8d17dSfengbojiang(姜凤波) return NGX_OK;
299*3da8d17dSfengbojiang(姜凤波) }
300*3da8d17dSfengbojiang(姜凤波)
301*3da8d17dSfengbojiang(姜凤波)
302*3da8d17dSfengbojiang(姜凤波) char *
ngx_http_set_predicate_slot(ngx_conf_t * cf,ngx_command_t * cmd,void * conf)303*3da8d17dSfengbojiang(姜凤波) ngx_http_set_predicate_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
304*3da8d17dSfengbojiang(姜凤波) {
305*3da8d17dSfengbojiang(姜凤波) char *p = conf;
306*3da8d17dSfengbojiang(姜凤波)
307*3da8d17dSfengbojiang(姜凤波) ngx_str_t *value;
308*3da8d17dSfengbojiang(姜凤波) ngx_uint_t i;
309*3da8d17dSfengbojiang(姜凤波) ngx_array_t **a;
310*3da8d17dSfengbojiang(姜凤波) ngx_http_complex_value_t *cv;
311*3da8d17dSfengbojiang(姜凤波) ngx_http_compile_complex_value_t ccv;
312*3da8d17dSfengbojiang(姜凤波)
313*3da8d17dSfengbojiang(姜凤波) a = (ngx_array_t **) (p + cmd->offset);
314*3da8d17dSfengbojiang(姜凤波)
315*3da8d17dSfengbojiang(姜凤波) if (*a == NGX_CONF_UNSET_PTR) {
316*3da8d17dSfengbojiang(姜凤波) *a = ngx_array_create(cf->pool, 1, sizeof(ngx_http_complex_value_t));
317*3da8d17dSfengbojiang(姜凤波) if (*a == NULL) {
318*3da8d17dSfengbojiang(姜凤波) return NGX_CONF_ERROR;
319*3da8d17dSfengbojiang(姜凤波) }
320*3da8d17dSfengbojiang(姜凤波) }
321*3da8d17dSfengbojiang(姜凤波)
322*3da8d17dSfengbojiang(姜凤波) value = cf->args->elts;
323*3da8d17dSfengbojiang(姜凤波)
324*3da8d17dSfengbojiang(姜凤波) for (i = 1; i < cf->args->nelts; i++) {
325*3da8d17dSfengbojiang(姜凤波) cv = ngx_array_push(*a);
326*3da8d17dSfengbojiang(姜凤波) if (cv == NULL) {
327*3da8d17dSfengbojiang(姜凤波) return NGX_CONF_ERROR;
328*3da8d17dSfengbojiang(姜凤波) }
329*3da8d17dSfengbojiang(姜凤波)
330*3da8d17dSfengbojiang(姜凤波) ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));
331*3da8d17dSfengbojiang(姜凤波)
332*3da8d17dSfengbojiang(姜凤波) ccv.cf = cf;
333*3da8d17dSfengbojiang(姜凤波) ccv.value = &value[i];
334*3da8d17dSfengbojiang(姜凤波) ccv.complex_value = cv;
335*3da8d17dSfengbojiang(姜凤波)
336*3da8d17dSfengbojiang(姜凤波) if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {
337*3da8d17dSfengbojiang(姜凤波) return NGX_CONF_ERROR;
338*3da8d17dSfengbojiang(姜凤波) }
339*3da8d17dSfengbojiang(姜凤波) }
340*3da8d17dSfengbojiang(姜凤波)
341*3da8d17dSfengbojiang(姜凤波) return NGX_CONF_OK;
342*3da8d17dSfengbojiang(姜凤波) }
343*3da8d17dSfengbojiang(姜凤波)
344*3da8d17dSfengbojiang(姜凤波)
345*3da8d17dSfengbojiang(姜凤波) ngx_uint_t
ngx_http_script_variables_count(ngx_str_t * value)346*3da8d17dSfengbojiang(姜凤波) ngx_http_script_variables_count(ngx_str_t *value)
347*3da8d17dSfengbojiang(姜凤波) {
348*3da8d17dSfengbojiang(姜凤波) ngx_uint_t i, n;
349*3da8d17dSfengbojiang(姜凤波)
350*3da8d17dSfengbojiang(姜凤波) for (n = 0, i = 0; i < value->len; i++) {
351*3da8d17dSfengbojiang(姜凤波) if (value->data[i] == '$') {
352*3da8d17dSfengbojiang(姜凤波) n++;
353*3da8d17dSfengbojiang(姜凤波) }
354*3da8d17dSfengbojiang(姜凤波) }
355*3da8d17dSfengbojiang(姜凤波)
356*3da8d17dSfengbojiang(姜凤波) return n;
357*3da8d17dSfengbojiang(姜凤波) }
358*3da8d17dSfengbojiang(姜凤波)
359*3da8d17dSfengbojiang(姜凤波)
360*3da8d17dSfengbojiang(姜凤波) ngx_int_t
ngx_http_script_compile(ngx_http_script_compile_t * sc)361*3da8d17dSfengbojiang(姜凤波) ngx_http_script_compile(ngx_http_script_compile_t *sc)
362*3da8d17dSfengbojiang(姜凤波) {
363*3da8d17dSfengbojiang(姜凤波) u_char ch;
364*3da8d17dSfengbojiang(姜凤波) ngx_str_t name;
365*3da8d17dSfengbojiang(姜凤波) ngx_uint_t i, bracket;
366*3da8d17dSfengbojiang(姜凤波)
367*3da8d17dSfengbojiang(姜凤波) if (ngx_http_script_init_arrays(sc) != NGX_OK) {
368*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
369*3da8d17dSfengbojiang(姜凤波) }
370*3da8d17dSfengbojiang(姜凤波)
371*3da8d17dSfengbojiang(姜凤波) for (i = 0; i < sc->source->len; /* void */ ) {
372*3da8d17dSfengbojiang(姜凤波)
373*3da8d17dSfengbojiang(姜凤波) name.len = 0;
374*3da8d17dSfengbojiang(姜凤波)
375*3da8d17dSfengbojiang(姜凤波) if (sc->source->data[i] == '$') {
376*3da8d17dSfengbojiang(姜凤波)
377*3da8d17dSfengbojiang(姜凤波) if (++i == sc->source->len) {
378*3da8d17dSfengbojiang(姜凤波) goto invalid_variable;
379*3da8d17dSfengbojiang(姜凤波) }
380*3da8d17dSfengbojiang(姜凤波)
381*3da8d17dSfengbojiang(姜凤波) if (sc->source->data[i] >= '1' && sc->source->data[i] <= '9') {
382*3da8d17dSfengbojiang(姜凤波) #if (NGX_PCRE)
383*3da8d17dSfengbojiang(姜凤波) ngx_uint_t n;
384*3da8d17dSfengbojiang(姜凤波)
385*3da8d17dSfengbojiang(姜凤波) n = sc->source->data[i] - '0';
386*3da8d17dSfengbojiang(姜凤波)
387*3da8d17dSfengbojiang(姜凤波) if (sc->captures_mask & ((ngx_uint_t) 1 << n)) {
388*3da8d17dSfengbojiang(姜凤波) sc->dup_capture = 1;
389*3da8d17dSfengbojiang(姜凤波) }
390*3da8d17dSfengbojiang(姜凤波)
391*3da8d17dSfengbojiang(姜凤波) sc->captures_mask |= (ngx_uint_t) 1 << n;
392*3da8d17dSfengbojiang(姜凤波)
393*3da8d17dSfengbojiang(姜凤波) if (ngx_http_script_add_capture_code(sc, n) != NGX_OK) {
394*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
395*3da8d17dSfengbojiang(姜凤波) }
396*3da8d17dSfengbojiang(姜凤波)
397*3da8d17dSfengbojiang(姜凤波) i++;
398*3da8d17dSfengbojiang(姜凤波)
399*3da8d17dSfengbojiang(姜凤波) continue;
400*3da8d17dSfengbojiang(姜凤波) #else
401*3da8d17dSfengbojiang(姜凤波) ngx_conf_log_error(NGX_LOG_EMERG, sc->cf, 0,
402*3da8d17dSfengbojiang(姜凤波) "using variable \"$%c\" requires "
403*3da8d17dSfengbojiang(姜凤波) "PCRE library", sc->source->data[i]);
404*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
405*3da8d17dSfengbojiang(姜凤波) #endif
406*3da8d17dSfengbojiang(姜凤波) }
407*3da8d17dSfengbojiang(姜凤波)
408*3da8d17dSfengbojiang(姜凤波) if (sc->source->data[i] == '{') {
409*3da8d17dSfengbojiang(姜凤波) bracket = 1;
410*3da8d17dSfengbojiang(姜凤波)
411*3da8d17dSfengbojiang(姜凤波) if (++i == sc->source->len) {
412*3da8d17dSfengbojiang(姜凤波) goto invalid_variable;
413*3da8d17dSfengbojiang(姜凤波) }
414*3da8d17dSfengbojiang(姜凤波)
415*3da8d17dSfengbojiang(姜凤波) name.data = &sc->source->data[i];
416*3da8d17dSfengbojiang(姜凤波)
417*3da8d17dSfengbojiang(姜凤波) } else {
418*3da8d17dSfengbojiang(姜凤波) bracket = 0;
419*3da8d17dSfengbojiang(姜凤波) name.data = &sc->source->data[i];
420*3da8d17dSfengbojiang(姜凤波) }
421*3da8d17dSfengbojiang(姜凤波)
422*3da8d17dSfengbojiang(姜凤波) for ( /* void */ ; i < sc->source->len; i++, name.len++) {
423*3da8d17dSfengbojiang(姜凤波) ch = sc->source->data[i];
424*3da8d17dSfengbojiang(姜凤波)
425*3da8d17dSfengbojiang(姜凤波) if (ch == '}' && bracket) {
426*3da8d17dSfengbojiang(姜凤波) i++;
427*3da8d17dSfengbojiang(姜凤波) bracket = 0;
428*3da8d17dSfengbojiang(姜凤波) break;
429*3da8d17dSfengbojiang(姜凤波) }
430*3da8d17dSfengbojiang(姜凤波)
431*3da8d17dSfengbojiang(姜凤波) if ((ch >= 'A' && ch <= 'Z')
432*3da8d17dSfengbojiang(姜凤波) || (ch >= 'a' && ch <= 'z')
433*3da8d17dSfengbojiang(姜凤波) || (ch >= '0' && ch <= '9')
434*3da8d17dSfengbojiang(姜凤波) || ch == '_')
435*3da8d17dSfengbojiang(姜凤波) {
436*3da8d17dSfengbojiang(姜凤波) continue;
437*3da8d17dSfengbojiang(姜凤波) }
438*3da8d17dSfengbojiang(姜凤波)
439*3da8d17dSfengbojiang(姜凤波) break;
440*3da8d17dSfengbojiang(姜凤波) }
441*3da8d17dSfengbojiang(姜凤波)
442*3da8d17dSfengbojiang(姜凤波) if (bracket) {
443*3da8d17dSfengbojiang(姜凤波) ngx_conf_log_error(NGX_LOG_EMERG, sc->cf, 0,
444*3da8d17dSfengbojiang(姜凤波) "the closing bracket in \"%V\" "
445*3da8d17dSfengbojiang(姜凤波) "variable is missing", &name);
446*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
447*3da8d17dSfengbojiang(姜凤波) }
448*3da8d17dSfengbojiang(姜凤波)
449*3da8d17dSfengbojiang(姜凤波) if (name.len == 0) {
450*3da8d17dSfengbojiang(姜凤波) goto invalid_variable;
451*3da8d17dSfengbojiang(姜凤波) }
452*3da8d17dSfengbojiang(姜凤波)
453*3da8d17dSfengbojiang(姜凤波) sc->variables++;
454*3da8d17dSfengbojiang(姜凤波)
455*3da8d17dSfengbojiang(姜凤波) if (ngx_http_script_add_var_code(sc, &name) != NGX_OK) {
456*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
457*3da8d17dSfengbojiang(姜凤波) }
458*3da8d17dSfengbojiang(姜凤波)
459*3da8d17dSfengbojiang(姜凤波) continue;
460*3da8d17dSfengbojiang(姜凤波) }
461*3da8d17dSfengbojiang(姜凤波)
462*3da8d17dSfengbojiang(姜凤波) if (sc->source->data[i] == '?' && sc->compile_args) {
463*3da8d17dSfengbojiang(姜凤波) sc->args = 1;
464*3da8d17dSfengbojiang(姜凤波) sc->compile_args = 0;
465*3da8d17dSfengbojiang(姜凤波)
466*3da8d17dSfengbojiang(姜凤波) if (ngx_http_script_add_args_code(sc) != NGX_OK) {
467*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
468*3da8d17dSfengbojiang(姜凤波) }
469*3da8d17dSfengbojiang(姜凤波)
470*3da8d17dSfengbojiang(姜凤波) i++;
471*3da8d17dSfengbojiang(姜凤波)
472*3da8d17dSfengbojiang(姜凤波) continue;
473*3da8d17dSfengbojiang(姜凤波) }
474*3da8d17dSfengbojiang(姜凤波)
475*3da8d17dSfengbojiang(姜凤波) name.data = &sc->source->data[i];
476*3da8d17dSfengbojiang(姜凤波)
477*3da8d17dSfengbojiang(姜凤波) while (i < sc->source->len) {
478*3da8d17dSfengbojiang(姜凤波)
479*3da8d17dSfengbojiang(姜凤波) if (sc->source->data[i] == '$') {
480*3da8d17dSfengbojiang(姜凤波) break;
481*3da8d17dSfengbojiang(姜凤波) }
482*3da8d17dSfengbojiang(姜凤波)
483*3da8d17dSfengbojiang(姜凤波) if (sc->source->data[i] == '?') {
484*3da8d17dSfengbojiang(姜凤波)
485*3da8d17dSfengbojiang(姜凤波) sc->args = 1;
486*3da8d17dSfengbojiang(姜凤波)
487*3da8d17dSfengbojiang(姜凤波) if (sc->compile_args) {
488*3da8d17dSfengbojiang(姜凤波) break;
489*3da8d17dSfengbojiang(姜凤波) }
490*3da8d17dSfengbojiang(姜凤波) }
491*3da8d17dSfengbojiang(姜凤波)
492*3da8d17dSfengbojiang(姜凤波) i++;
493*3da8d17dSfengbojiang(姜凤波) name.len++;
494*3da8d17dSfengbojiang(姜凤波) }
495*3da8d17dSfengbojiang(姜凤波)
496*3da8d17dSfengbojiang(姜凤波) sc->size += name.len;
497*3da8d17dSfengbojiang(姜凤波)
498*3da8d17dSfengbojiang(姜凤波) if (ngx_http_script_add_copy_code(sc, &name, (i == sc->source->len))
499*3da8d17dSfengbojiang(姜凤波) != NGX_OK)
500*3da8d17dSfengbojiang(姜凤波) {
501*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
502*3da8d17dSfengbojiang(姜凤波) }
503*3da8d17dSfengbojiang(姜凤波) }
504*3da8d17dSfengbojiang(姜凤波)
505*3da8d17dSfengbojiang(姜凤波) return ngx_http_script_done(sc);
506*3da8d17dSfengbojiang(姜凤波)
507*3da8d17dSfengbojiang(姜凤波) invalid_variable:
508*3da8d17dSfengbojiang(姜凤波)
509*3da8d17dSfengbojiang(姜凤波) ngx_conf_log_error(NGX_LOG_EMERG, sc->cf, 0, "invalid variable name");
510*3da8d17dSfengbojiang(姜凤波)
511*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
512*3da8d17dSfengbojiang(姜凤波) }
513*3da8d17dSfengbojiang(姜凤波)
514*3da8d17dSfengbojiang(姜凤波)
515*3da8d17dSfengbojiang(姜凤波) u_char *
ngx_http_script_run(ngx_http_request_t * r,ngx_str_t * value,void * code_lengths,size_t len,void * code_values)516*3da8d17dSfengbojiang(姜凤波) ngx_http_script_run(ngx_http_request_t *r, ngx_str_t *value,
517*3da8d17dSfengbojiang(姜凤波) void *code_lengths, size_t len, void *code_values)
518*3da8d17dSfengbojiang(姜凤波) {
519*3da8d17dSfengbojiang(姜凤波) ngx_uint_t i;
520*3da8d17dSfengbojiang(姜凤波) ngx_http_script_code_pt code;
521*3da8d17dSfengbojiang(姜凤波) ngx_http_script_len_code_pt lcode;
522*3da8d17dSfengbojiang(姜凤波) ngx_http_script_engine_t e;
523*3da8d17dSfengbojiang(姜凤波) ngx_http_core_main_conf_t *cmcf;
524*3da8d17dSfengbojiang(姜凤波)
525*3da8d17dSfengbojiang(姜凤波) cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);
526*3da8d17dSfengbojiang(姜凤波)
527*3da8d17dSfengbojiang(姜凤波) for (i = 0; i < cmcf->variables.nelts; i++) {
528*3da8d17dSfengbojiang(姜凤波) if (r->variables[i].no_cacheable) {
529*3da8d17dSfengbojiang(姜凤波) r->variables[i].valid = 0;
530*3da8d17dSfengbojiang(姜凤波) r->variables[i].not_found = 0;
531*3da8d17dSfengbojiang(姜凤波) }
532*3da8d17dSfengbojiang(姜凤波) }
533*3da8d17dSfengbojiang(姜凤波)
534*3da8d17dSfengbojiang(姜凤波) ngx_memzero(&e, sizeof(ngx_http_script_engine_t));
535*3da8d17dSfengbojiang(姜凤波)
536*3da8d17dSfengbojiang(姜凤波) e.ip = code_lengths;
537*3da8d17dSfengbojiang(姜凤波) e.request = r;
538*3da8d17dSfengbojiang(姜凤波) e.flushed = 1;
539*3da8d17dSfengbojiang(姜凤波)
540*3da8d17dSfengbojiang(姜凤波) while (*(uintptr_t *) e.ip) {
541*3da8d17dSfengbojiang(姜凤波) lcode = *(ngx_http_script_len_code_pt *) e.ip;
542*3da8d17dSfengbojiang(姜凤波) len += lcode(&e);
543*3da8d17dSfengbojiang(姜凤波) }
544*3da8d17dSfengbojiang(姜凤波)
545*3da8d17dSfengbojiang(姜凤波)
546*3da8d17dSfengbojiang(姜凤波) value->len = len;
547*3da8d17dSfengbojiang(姜凤波) value->data = ngx_pnalloc(r->pool, len);
548*3da8d17dSfengbojiang(姜凤波) if (value->data == NULL) {
549*3da8d17dSfengbojiang(姜凤波) return NULL;
550*3da8d17dSfengbojiang(姜凤波) }
551*3da8d17dSfengbojiang(姜凤波)
552*3da8d17dSfengbojiang(姜凤波) e.ip = code_values;
553*3da8d17dSfengbojiang(姜凤波) e.pos = value->data;
554*3da8d17dSfengbojiang(姜凤波)
555*3da8d17dSfengbojiang(姜凤波) while (*(uintptr_t *) e.ip) {
556*3da8d17dSfengbojiang(姜凤波) code = *(ngx_http_script_code_pt *) e.ip;
557*3da8d17dSfengbojiang(姜凤波) code((ngx_http_script_engine_t *) &e);
558*3da8d17dSfengbojiang(姜凤波) }
559*3da8d17dSfengbojiang(姜凤波)
560*3da8d17dSfengbojiang(姜凤波) return e.pos;
561*3da8d17dSfengbojiang(姜凤波) }
562*3da8d17dSfengbojiang(姜凤波)
563*3da8d17dSfengbojiang(姜凤波)
564*3da8d17dSfengbojiang(姜凤波) void
ngx_http_script_flush_no_cacheable_variables(ngx_http_request_t * r,ngx_array_t * indices)565*3da8d17dSfengbojiang(姜凤波) ngx_http_script_flush_no_cacheable_variables(ngx_http_request_t *r,
566*3da8d17dSfengbojiang(姜凤波) ngx_array_t *indices)
567*3da8d17dSfengbojiang(姜凤波) {
568*3da8d17dSfengbojiang(姜凤波) ngx_uint_t n, *index;
569*3da8d17dSfengbojiang(姜凤波)
570*3da8d17dSfengbojiang(姜凤波) if (indices) {
571*3da8d17dSfengbojiang(姜凤波) index = indices->elts;
572*3da8d17dSfengbojiang(姜凤波) for (n = 0; n < indices->nelts; n++) {
573*3da8d17dSfengbojiang(姜凤波) if (r->variables[index[n]].no_cacheable) {
574*3da8d17dSfengbojiang(姜凤波) r->variables[index[n]].valid = 0;
575*3da8d17dSfengbojiang(姜凤波) r->variables[index[n]].not_found = 0;
576*3da8d17dSfengbojiang(姜凤波) }
577*3da8d17dSfengbojiang(姜凤波) }
578*3da8d17dSfengbojiang(姜凤波) }
579*3da8d17dSfengbojiang(姜凤波) }
580*3da8d17dSfengbojiang(姜凤波)
581*3da8d17dSfengbojiang(姜凤波)
582*3da8d17dSfengbojiang(姜凤波) static ngx_int_t
ngx_http_script_init_arrays(ngx_http_script_compile_t * sc)583*3da8d17dSfengbojiang(姜凤波) ngx_http_script_init_arrays(ngx_http_script_compile_t *sc)
584*3da8d17dSfengbojiang(姜凤波) {
585*3da8d17dSfengbojiang(姜凤波) ngx_uint_t n;
586*3da8d17dSfengbojiang(姜凤波)
587*3da8d17dSfengbojiang(姜凤波) if (sc->flushes && *sc->flushes == NULL) {
588*3da8d17dSfengbojiang(姜凤波) n = sc->variables ? sc->variables : 1;
589*3da8d17dSfengbojiang(姜凤波) *sc->flushes = ngx_array_create(sc->cf->pool, n, sizeof(ngx_uint_t));
590*3da8d17dSfengbojiang(姜凤波) if (*sc->flushes == NULL) {
591*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
592*3da8d17dSfengbojiang(姜凤波) }
593*3da8d17dSfengbojiang(姜凤波) }
594*3da8d17dSfengbojiang(姜凤波)
595*3da8d17dSfengbojiang(姜凤波) if (*sc->lengths == NULL) {
596*3da8d17dSfengbojiang(姜凤波) n = sc->variables * (2 * sizeof(ngx_http_script_copy_code_t)
597*3da8d17dSfengbojiang(姜凤波) + sizeof(ngx_http_script_var_code_t))
598*3da8d17dSfengbojiang(姜凤波) + sizeof(uintptr_t);
599*3da8d17dSfengbojiang(姜凤波)
600*3da8d17dSfengbojiang(姜凤波) *sc->lengths = ngx_array_create(sc->cf->pool, n, 1);
601*3da8d17dSfengbojiang(姜凤波) if (*sc->lengths == NULL) {
602*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
603*3da8d17dSfengbojiang(姜凤波) }
604*3da8d17dSfengbojiang(姜凤波) }
605*3da8d17dSfengbojiang(姜凤波)
606*3da8d17dSfengbojiang(姜凤波) if (*sc->values == NULL) {
607*3da8d17dSfengbojiang(姜凤波) n = (sc->variables * (2 * sizeof(ngx_http_script_copy_code_t)
608*3da8d17dSfengbojiang(姜凤波) + sizeof(ngx_http_script_var_code_t))
609*3da8d17dSfengbojiang(姜凤波) + sizeof(uintptr_t)
610*3da8d17dSfengbojiang(姜凤波) + sc->source->len
611*3da8d17dSfengbojiang(姜凤波) + sizeof(uintptr_t) - 1)
612*3da8d17dSfengbojiang(姜凤波) & ~(sizeof(uintptr_t) - 1);
613*3da8d17dSfengbojiang(姜凤波)
614*3da8d17dSfengbojiang(姜凤波) *sc->values = ngx_array_create(sc->cf->pool, n, 1);
615*3da8d17dSfengbojiang(姜凤波) if (*sc->values == NULL) {
616*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
617*3da8d17dSfengbojiang(姜凤波) }
618*3da8d17dSfengbojiang(姜凤波) }
619*3da8d17dSfengbojiang(姜凤波)
620*3da8d17dSfengbojiang(姜凤波) sc->variables = 0;
621*3da8d17dSfengbojiang(姜凤波)
622*3da8d17dSfengbojiang(姜凤波) return NGX_OK;
623*3da8d17dSfengbojiang(姜凤波) }
624*3da8d17dSfengbojiang(姜凤波)
625*3da8d17dSfengbojiang(姜凤波)
626*3da8d17dSfengbojiang(姜凤波) static ngx_int_t
ngx_http_script_done(ngx_http_script_compile_t * sc)627*3da8d17dSfengbojiang(姜凤波) ngx_http_script_done(ngx_http_script_compile_t *sc)
628*3da8d17dSfengbojiang(姜凤波) {
629*3da8d17dSfengbojiang(姜凤波) ngx_str_t zero;
630*3da8d17dSfengbojiang(姜凤波) uintptr_t *code;
631*3da8d17dSfengbojiang(姜凤波)
632*3da8d17dSfengbojiang(姜凤波) if (sc->zero) {
633*3da8d17dSfengbojiang(姜凤波)
634*3da8d17dSfengbojiang(姜凤波) zero.len = 1;
635*3da8d17dSfengbojiang(姜凤波) zero.data = (u_char *) "\0";
636*3da8d17dSfengbojiang(姜凤波)
637*3da8d17dSfengbojiang(姜凤波) if (ngx_http_script_add_copy_code(sc, &zero, 0) != NGX_OK) {
638*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
639*3da8d17dSfengbojiang(姜凤波) }
640*3da8d17dSfengbojiang(姜凤波) }
641*3da8d17dSfengbojiang(姜凤波)
642*3da8d17dSfengbojiang(姜凤波) if (sc->conf_prefix || sc->root_prefix) {
643*3da8d17dSfengbojiang(姜凤波) if (ngx_http_script_add_full_name_code(sc) != NGX_OK) {
644*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
645*3da8d17dSfengbojiang(姜凤波) }
646*3da8d17dSfengbojiang(姜凤波) }
647*3da8d17dSfengbojiang(姜凤波)
648*3da8d17dSfengbojiang(姜凤波) if (sc->complete_lengths) {
649*3da8d17dSfengbojiang(姜凤波) code = ngx_http_script_add_code(*sc->lengths, sizeof(uintptr_t), NULL);
650*3da8d17dSfengbojiang(姜凤波) if (code == NULL) {
651*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
652*3da8d17dSfengbojiang(姜凤波) }
653*3da8d17dSfengbojiang(姜凤波)
654*3da8d17dSfengbojiang(姜凤波) *code = (uintptr_t) NULL;
655*3da8d17dSfengbojiang(姜凤波) }
656*3da8d17dSfengbojiang(姜凤波)
657*3da8d17dSfengbojiang(姜凤波) if (sc->complete_values) {
658*3da8d17dSfengbojiang(姜凤波) code = ngx_http_script_add_code(*sc->values, sizeof(uintptr_t),
659*3da8d17dSfengbojiang(姜凤波) &sc->main);
660*3da8d17dSfengbojiang(姜凤波) if (code == NULL) {
661*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
662*3da8d17dSfengbojiang(姜凤波) }
663*3da8d17dSfengbojiang(姜凤波)
664*3da8d17dSfengbojiang(姜凤波) *code = (uintptr_t) NULL;
665*3da8d17dSfengbojiang(姜凤波) }
666*3da8d17dSfengbojiang(姜凤波)
667*3da8d17dSfengbojiang(姜凤波) return NGX_OK;
668*3da8d17dSfengbojiang(姜凤波) }
669*3da8d17dSfengbojiang(姜凤波)
670*3da8d17dSfengbojiang(姜凤波)
671*3da8d17dSfengbojiang(姜凤波) void *
ngx_http_script_start_code(ngx_pool_t * pool,ngx_array_t ** codes,size_t size)672*3da8d17dSfengbojiang(姜凤波) ngx_http_script_start_code(ngx_pool_t *pool, ngx_array_t **codes, size_t size)
673*3da8d17dSfengbojiang(姜凤波) {
674*3da8d17dSfengbojiang(姜凤波) if (*codes == NULL) {
675*3da8d17dSfengbojiang(姜凤波) *codes = ngx_array_create(pool, 256, 1);
676*3da8d17dSfengbojiang(姜凤波) if (*codes == NULL) {
677*3da8d17dSfengbojiang(姜凤波) return NULL;
678*3da8d17dSfengbojiang(姜凤波) }
679*3da8d17dSfengbojiang(姜凤波) }
680*3da8d17dSfengbojiang(姜凤波)
681*3da8d17dSfengbojiang(姜凤波) return ngx_array_push_n(*codes, size);
682*3da8d17dSfengbojiang(姜凤波) }
683*3da8d17dSfengbojiang(姜凤波)
684*3da8d17dSfengbojiang(姜凤波)
685*3da8d17dSfengbojiang(姜凤波) void *
ngx_http_script_add_code(ngx_array_t * codes,size_t size,void * code)686*3da8d17dSfengbojiang(姜凤波) ngx_http_script_add_code(ngx_array_t *codes, size_t size, void *code)
687*3da8d17dSfengbojiang(姜凤波) {
688*3da8d17dSfengbojiang(姜凤波) u_char *elts, **p;
689*3da8d17dSfengbojiang(姜凤波) void *new;
690*3da8d17dSfengbojiang(姜凤波)
691*3da8d17dSfengbojiang(姜凤波) elts = codes->elts;
692*3da8d17dSfengbojiang(姜凤波)
693*3da8d17dSfengbojiang(姜凤波) new = ngx_array_push_n(codes, size);
694*3da8d17dSfengbojiang(姜凤波) if (new == NULL) {
695*3da8d17dSfengbojiang(姜凤波) return NULL;
696*3da8d17dSfengbojiang(姜凤波) }
697*3da8d17dSfengbojiang(姜凤波)
698*3da8d17dSfengbojiang(姜凤波) if (code) {
699*3da8d17dSfengbojiang(姜凤波) if (elts != codes->elts) {
700*3da8d17dSfengbojiang(姜凤波) p = code;
701*3da8d17dSfengbojiang(姜凤波) *p += (u_char *) codes->elts - elts;
702*3da8d17dSfengbojiang(姜凤波) }
703*3da8d17dSfengbojiang(姜凤波) }
704*3da8d17dSfengbojiang(姜凤波)
705*3da8d17dSfengbojiang(姜凤波) return new;
706*3da8d17dSfengbojiang(姜凤波) }
707*3da8d17dSfengbojiang(姜凤波)
708*3da8d17dSfengbojiang(姜凤波)
709*3da8d17dSfengbojiang(姜凤波) static ngx_int_t
ngx_http_script_add_copy_code(ngx_http_script_compile_t * sc,ngx_str_t * value,ngx_uint_t last)710*3da8d17dSfengbojiang(姜凤波) ngx_http_script_add_copy_code(ngx_http_script_compile_t *sc, ngx_str_t *value,
711*3da8d17dSfengbojiang(姜凤波) ngx_uint_t last)
712*3da8d17dSfengbojiang(姜凤波) {
713*3da8d17dSfengbojiang(姜凤波) u_char *p;
714*3da8d17dSfengbojiang(姜凤波) size_t size, len, zero;
715*3da8d17dSfengbojiang(姜凤波) ngx_http_script_copy_code_t *code;
716*3da8d17dSfengbojiang(姜凤波)
717*3da8d17dSfengbojiang(姜凤波) zero = (sc->zero && last);
718*3da8d17dSfengbojiang(姜凤波) len = value->len + zero;
719*3da8d17dSfengbojiang(姜凤波)
720*3da8d17dSfengbojiang(姜凤波) code = ngx_http_script_add_code(*sc->lengths,
721*3da8d17dSfengbojiang(姜凤波) sizeof(ngx_http_script_copy_code_t), NULL);
722*3da8d17dSfengbojiang(姜凤波) if (code == NULL) {
723*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
724*3da8d17dSfengbojiang(姜凤波) }
725*3da8d17dSfengbojiang(姜凤波)
726*3da8d17dSfengbojiang(姜凤波) code->code = (ngx_http_script_code_pt) (void *)
727*3da8d17dSfengbojiang(姜凤波) ngx_http_script_copy_len_code;
728*3da8d17dSfengbojiang(姜凤波) code->len = len;
729*3da8d17dSfengbojiang(姜凤波)
730*3da8d17dSfengbojiang(姜凤波) size = (sizeof(ngx_http_script_copy_code_t) + len + sizeof(uintptr_t) - 1)
731*3da8d17dSfengbojiang(姜凤波) & ~(sizeof(uintptr_t) - 1);
732*3da8d17dSfengbojiang(姜凤波)
733*3da8d17dSfengbojiang(姜凤波) code = ngx_http_script_add_code(*sc->values, size, &sc->main);
734*3da8d17dSfengbojiang(姜凤波) if (code == NULL) {
735*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
736*3da8d17dSfengbojiang(姜凤波) }
737*3da8d17dSfengbojiang(姜凤波)
738*3da8d17dSfengbojiang(姜凤波) code->code = ngx_http_script_copy_code;
739*3da8d17dSfengbojiang(姜凤波) code->len = len;
740*3da8d17dSfengbojiang(姜凤波)
741*3da8d17dSfengbojiang(姜凤波) p = ngx_cpymem((u_char *) code + sizeof(ngx_http_script_copy_code_t),
742*3da8d17dSfengbojiang(姜凤波) value->data, value->len);
743*3da8d17dSfengbojiang(姜凤波)
744*3da8d17dSfengbojiang(姜凤波) if (zero) {
745*3da8d17dSfengbojiang(姜凤波) *p = '\0';
746*3da8d17dSfengbojiang(姜凤波) sc->zero = 0;
747*3da8d17dSfengbojiang(姜凤波) }
748*3da8d17dSfengbojiang(姜凤波)
749*3da8d17dSfengbojiang(姜凤波) return NGX_OK;
750*3da8d17dSfengbojiang(姜凤波) }
751*3da8d17dSfengbojiang(姜凤波)
752*3da8d17dSfengbojiang(姜凤波)
753*3da8d17dSfengbojiang(姜凤波) size_t
ngx_http_script_copy_len_code(ngx_http_script_engine_t * e)754*3da8d17dSfengbojiang(姜凤波) ngx_http_script_copy_len_code(ngx_http_script_engine_t *e)
755*3da8d17dSfengbojiang(姜凤波) {
756*3da8d17dSfengbojiang(姜凤波) ngx_http_script_copy_code_t *code;
757*3da8d17dSfengbojiang(姜凤波)
758*3da8d17dSfengbojiang(姜凤波) code = (ngx_http_script_copy_code_t *) e->ip;
759*3da8d17dSfengbojiang(姜凤波)
760*3da8d17dSfengbojiang(姜凤波) e->ip += sizeof(ngx_http_script_copy_code_t);
761*3da8d17dSfengbojiang(姜凤波)
762*3da8d17dSfengbojiang(姜凤波) return code->len;
763*3da8d17dSfengbojiang(姜凤波) }
764*3da8d17dSfengbojiang(姜凤波)
765*3da8d17dSfengbojiang(姜凤波)
766*3da8d17dSfengbojiang(姜凤波) void
ngx_http_script_copy_code(ngx_http_script_engine_t * e)767*3da8d17dSfengbojiang(姜凤波) ngx_http_script_copy_code(ngx_http_script_engine_t *e)
768*3da8d17dSfengbojiang(姜凤波) {
769*3da8d17dSfengbojiang(姜凤波) u_char *p;
770*3da8d17dSfengbojiang(姜凤波) ngx_http_script_copy_code_t *code;
771*3da8d17dSfengbojiang(姜凤波)
772*3da8d17dSfengbojiang(姜凤波) code = (ngx_http_script_copy_code_t *) e->ip;
773*3da8d17dSfengbojiang(姜凤波)
774*3da8d17dSfengbojiang(姜凤波) p = e->pos;
775*3da8d17dSfengbojiang(姜凤波)
776*3da8d17dSfengbojiang(姜凤波) if (!e->skip) {
777*3da8d17dSfengbojiang(姜凤波) e->pos = ngx_copy(p, e->ip + sizeof(ngx_http_script_copy_code_t),
778*3da8d17dSfengbojiang(姜凤波) code->len);
779*3da8d17dSfengbojiang(姜凤波) }
780*3da8d17dSfengbojiang(姜凤波)
781*3da8d17dSfengbojiang(姜凤波) e->ip += sizeof(ngx_http_script_copy_code_t)
782*3da8d17dSfengbojiang(姜凤波) + ((code->len + sizeof(uintptr_t) - 1) & ~(sizeof(uintptr_t) - 1));
783*3da8d17dSfengbojiang(姜凤波)
784*3da8d17dSfengbojiang(姜凤波) ngx_log_debug2(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0,
785*3da8d17dSfengbojiang(姜凤波) "http script copy: \"%*s\"", e->pos - p, p);
786*3da8d17dSfengbojiang(姜凤波) }
787*3da8d17dSfengbojiang(姜凤波)
788*3da8d17dSfengbojiang(姜凤波)
789*3da8d17dSfengbojiang(姜凤波) static ngx_int_t
ngx_http_script_add_var_code(ngx_http_script_compile_t * sc,ngx_str_t * name)790*3da8d17dSfengbojiang(姜凤波) ngx_http_script_add_var_code(ngx_http_script_compile_t *sc, ngx_str_t *name)
791*3da8d17dSfengbojiang(姜凤波) {
792*3da8d17dSfengbojiang(姜凤波) ngx_int_t index, *p;
793*3da8d17dSfengbojiang(姜凤波) ngx_http_script_var_code_t *code;
794*3da8d17dSfengbojiang(姜凤波)
795*3da8d17dSfengbojiang(姜凤波) index = ngx_http_get_variable_index(sc->cf, name);
796*3da8d17dSfengbojiang(姜凤波)
797*3da8d17dSfengbojiang(姜凤波) if (index == NGX_ERROR) {
798*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
799*3da8d17dSfengbojiang(姜凤波) }
800*3da8d17dSfengbojiang(姜凤波)
801*3da8d17dSfengbojiang(姜凤波) if (sc->flushes) {
802*3da8d17dSfengbojiang(姜凤波) p = ngx_array_push(*sc->flushes);
803*3da8d17dSfengbojiang(姜凤波) if (p == NULL) {
804*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
805*3da8d17dSfengbojiang(姜凤波) }
806*3da8d17dSfengbojiang(姜凤波)
807*3da8d17dSfengbojiang(姜凤波) *p = index;
808*3da8d17dSfengbojiang(姜凤波) }
809*3da8d17dSfengbojiang(姜凤波)
810*3da8d17dSfengbojiang(姜凤波) code = ngx_http_script_add_code(*sc->lengths,
811*3da8d17dSfengbojiang(姜凤波) sizeof(ngx_http_script_var_code_t), NULL);
812*3da8d17dSfengbojiang(姜凤波) if (code == NULL) {
813*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
814*3da8d17dSfengbojiang(姜凤波) }
815*3da8d17dSfengbojiang(姜凤波)
816*3da8d17dSfengbojiang(姜凤波) code->code = (ngx_http_script_code_pt) (void *)
817*3da8d17dSfengbojiang(姜凤波) ngx_http_script_copy_var_len_code;
818*3da8d17dSfengbojiang(姜凤波) code->index = (uintptr_t) index;
819*3da8d17dSfengbojiang(姜凤波)
820*3da8d17dSfengbojiang(姜凤波) code = ngx_http_script_add_code(*sc->values,
821*3da8d17dSfengbojiang(姜凤波) sizeof(ngx_http_script_var_code_t),
822*3da8d17dSfengbojiang(姜凤波) &sc->main);
823*3da8d17dSfengbojiang(姜凤波) if (code == NULL) {
824*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
825*3da8d17dSfengbojiang(姜凤波) }
826*3da8d17dSfengbojiang(姜凤波)
827*3da8d17dSfengbojiang(姜凤波) code->code = ngx_http_script_copy_var_code;
828*3da8d17dSfengbojiang(姜凤波) code->index = (uintptr_t) index;
829*3da8d17dSfengbojiang(姜凤波)
830*3da8d17dSfengbojiang(姜凤波) return NGX_OK;
831*3da8d17dSfengbojiang(姜凤波) }
832*3da8d17dSfengbojiang(姜凤波)
833*3da8d17dSfengbojiang(姜凤波)
834*3da8d17dSfengbojiang(姜凤波) size_t
ngx_http_script_copy_var_len_code(ngx_http_script_engine_t * e)835*3da8d17dSfengbojiang(姜凤波) ngx_http_script_copy_var_len_code(ngx_http_script_engine_t *e)
836*3da8d17dSfengbojiang(姜凤波) {
837*3da8d17dSfengbojiang(姜凤波) ngx_http_variable_value_t *value;
838*3da8d17dSfengbojiang(姜凤波) ngx_http_script_var_code_t *code;
839*3da8d17dSfengbojiang(姜凤波)
840*3da8d17dSfengbojiang(姜凤波) code = (ngx_http_script_var_code_t *) e->ip;
841*3da8d17dSfengbojiang(姜凤波)
842*3da8d17dSfengbojiang(姜凤波) e->ip += sizeof(ngx_http_script_var_code_t);
843*3da8d17dSfengbojiang(姜凤波)
844*3da8d17dSfengbojiang(姜凤波) if (e->flushed) {
845*3da8d17dSfengbojiang(姜凤波) value = ngx_http_get_indexed_variable(e->request, code->index);
846*3da8d17dSfengbojiang(姜凤波)
847*3da8d17dSfengbojiang(姜凤波) } else {
848*3da8d17dSfengbojiang(姜凤波) value = ngx_http_get_flushed_variable(e->request, code->index);
849*3da8d17dSfengbojiang(姜凤波) }
850*3da8d17dSfengbojiang(姜凤波)
851*3da8d17dSfengbojiang(姜凤波) if (value && !value->not_found) {
852*3da8d17dSfengbojiang(姜凤波) return value->len;
853*3da8d17dSfengbojiang(姜凤波) }
854*3da8d17dSfengbojiang(姜凤波)
855*3da8d17dSfengbojiang(姜凤波) return 0;
856*3da8d17dSfengbojiang(姜凤波) }
857*3da8d17dSfengbojiang(姜凤波)
858*3da8d17dSfengbojiang(姜凤波)
859*3da8d17dSfengbojiang(姜凤波) void
ngx_http_script_copy_var_code(ngx_http_script_engine_t * e)860*3da8d17dSfengbojiang(姜凤波) ngx_http_script_copy_var_code(ngx_http_script_engine_t *e)
861*3da8d17dSfengbojiang(姜凤波) {
862*3da8d17dSfengbojiang(姜凤波) u_char *p;
863*3da8d17dSfengbojiang(姜凤波) ngx_http_variable_value_t *value;
864*3da8d17dSfengbojiang(姜凤波) ngx_http_script_var_code_t *code;
865*3da8d17dSfengbojiang(姜凤波)
866*3da8d17dSfengbojiang(姜凤波) code = (ngx_http_script_var_code_t *) e->ip;
867*3da8d17dSfengbojiang(姜凤波)
868*3da8d17dSfengbojiang(姜凤波) e->ip += sizeof(ngx_http_script_var_code_t);
869*3da8d17dSfengbojiang(姜凤波)
870*3da8d17dSfengbojiang(姜凤波) if (!e->skip) {
871*3da8d17dSfengbojiang(姜凤波)
872*3da8d17dSfengbojiang(姜凤波) if (e->flushed) {
873*3da8d17dSfengbojiang(姜凤波) value = ngx_http_get_indexed_variable(e->request, code->index);
874*3da8d17dSfengbojiang(姜凤波)
875*3da8d17dSfengbojiang(姜凤波) } else {
876*3da8d17dSfengbojiang(姜凤波) value = ngx_http_get_flushed_variable(e->request, code->index);
877*3da8d17dSfengbojiang(姜凤波) }
878*3da8d17dSfengbojiang(姜凤波)
879*3da8d17dSfengbojiang(姜凤波) if (value && !value->not_found) {
880*3da8d17dSfengbojiang(姜凤波) p = e->pos;
881*3da8d17dSfengbojiang(姜凤波) e->pos = ngx_copy(p, value->data, value->len);
882*3da8d17dSfengbojiang(姜凤波)
883*3da8d17dSfengbojiang(姜凤波) ngx_log_debug2(NGX_LOG_DEBUG_HTTP,
884*3da8d17dSfengbojiang(姜凤波) e->request->connection->log, 0,
885*3da8d17dSfengbojiang(姜凤波) "http script var: \"%*s\"", e->pos - p, p);
886*3da8d17dSfengbojiang(姜凤波) }
887*3da8d17dSfengbojiang(姜凤波) }
888*3da8d17dSfengbojiang(姜凤波) }
889*3da8d17dSfengbojiang(姜凤波)
890*3da8d17dSfengbojiang(姜凤波)
891*3da8d17dSfengbojiang(姜凤波) static ngx_int_t
ngx_http_script_add_args_code(ngx_http_script_compile_t * sc)892*3da8d17dSfengbojiang(姜凤波) ngx_http_script_add_args_code(ngx_http_script_compile_t *sc)
893*3da8d17dSfengbojiang(姜凤波) {
894*3da8d17dSfengbojiang(姜凤波) uintptr_t *code;
895*3da8d17dSfengbojiang(姜凤波)
896*3da8d17dSfengbojiang(姜凤波) code = ngx_http_script_add_code(*sc->lengths, sizeof(uintptr_t), NULL);
897*3da8d17dSfengbojiang(姜凤波) if (code == NULL) {
898*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
899*3da8d17dSfengbojiang(姜凤波) }
900*3da8d17dSfengbojiang(姜凤波)
901*3da8d17dSfengbojiang(姜凤波) *code = (uintptr_t) ngx_http_script_mark_args_code;
902*3da8d17dSfengbojiang(姜凤波)
903*3da8d17dSfengbojiang(姜凤波) code = ngx_http_script_add_code(*sc->values, sizeof(uintptr_t), &sc->main);
904*3da8d17dSfengbojiang(姜凤波) if (code == NULL) {
905*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
906*3da8d17dSfengbojiang(姜凤波) }
907*3da8d17dSfengbojiang(姜凤波)
908*3da8d17dSfengbojiang(姜凤波) *code = (uintptr_t) ngx_http_script_start_args_code;
909*3da8d17dSfengbojiang(姜凤波)
910*3da8d17dSfengbojiang(姜凤波) return NGX_OK;
911*3da8d17dSfengbojiang(姜凤波) }
912*3da8d17dSfengbojiang(姜凤波)
913*3da8d17dSfengbojiang(姜凤波)
914*3da8d17dSfengbojiang(姜凤波) size_t
ngx_http_script_mark_args_code(ngx_http_script_engine_t * e)915*3da8d17dSfengbojiang(姜凤波) ngx_http_script_mark_args_code(ngx_http_script_engine_t *e)
916*3da8d17dSfengbojiang(姜凤波) {
917*3da8d17dSfengbojiang(姜凤波) e->is_args = 1;
918*3da8d17dSfengbojiang(姜凤波) e->ip += sizeof(uintptr_t);
919*3da8d17dSfengbojiang(姜凤波)
920*3da8d17dSfengbojiang(姜凤波) return 1;
921*3da8d17dSfengbojiang(姜凤波) }
922*3da8d17dSfengbojiang(姜凤波)
923*3da8d17dSfengbojiang(姜凤波)
924*3da8d17dSfengbojiang(姜凤波) void
ngx_http_script_start_args_code(ngx_http_script_engine_t * e)925*3da8d17dSfengbojiang(姜凤波) ngx_http_script_start_args_code(ngx_http_script_engine_t *e)
926*3da8d17dSfengbojiang(姜凤波) {
927*3da8d17dSfengbojiang(姜凤波) ngx_log_debug0(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0,
928*3da8d17dSfengbojiang(姜凤波) "http script args");
929*3da8d17dSfengbojiang(姜凤波)
930*3da8d17dSfengbojiang(姜凤波) e->is_args = 1;
931*3da8d17dSfengbojiang(姜凤波) e->args = e->pos;
932*3da8d17dSfengbojiang(姜凤波) e->ip += sizeof(uintptr_t);
933*3da8d17dSfengbojiang(姜凤波) }
934*3da8d17dSfengbojiang(姜凤波)
935*3da8d17dSfengbojiang(姜凤波)
936*3da8d17dSfengbojiang(姜凤波) #if (NGX_PCRE)
937*3da8d17dSfengbojiang(姜凤波)
938*3da8d17dSfengbojiang(姜凤波) void
ngx_http_script_regex_start_code(ngx_http_script_engine_t * e)939*3da8d17dSfengbojiang(姜凤波) ngx_http_script_regex_start_code(ngx_http_script_engine_t *e)
940*3da8d17dSfengbojiang(姜凤波) {
941*3da8d17dSfengbojiang(姜凤波) size_t len;
942*3da8d17dSfengbojiang(姜凤波) ngx_int_t rc;
943*3da8d17dSfengbojiang(姜凤波) ngx_uint_t n;
944*3da8d17dSfengbojiang(姜凤波) ngx_http_request_t *r;
945*3da8d17dSfengbojiang(姜凤波) ngx_http_script_engine_t le;
946*3da8d17dSfengbojiang(姜凤波) ngx_http_script_len_code_pt lcode;
947*3da8d17dSfengbojiang(姜凤波) ngx_http_script_regex_code_t *code;
948*3da8d17dSfengbojiang(姜凤波)
949*3da8d17dSfengbojiang(姜凤波) code = (ngx_http_script_regex_code_t *) e->ip;
950*3da8d17dSfengbojiang(姜凤波)
951*3da8d17dSfengbojiang(姜凤波) r = e->request;
952*3da8d17dSfengbojiang(姜凤波)
953*3da8d17dSfengbojiang(姜凤波) ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
954*3da8d17dSfengbojiang(姜凤波) "http script regex: \"%V\"", &code->name);
955*3da8d17dSfengbojiang(姜凤波)
956*3da8d17dSfengbojiang(姜凤波) if (code->uri) {
957*3da8d17dSfengbojiang(姜凤波) e->line = r->uri;
958*3da8d17dSfengbojiang(姜凤波) } else {
959*3da8d17dSfengbojiang(姜凤波) e->sp--;
960*3da8d17dSfengbojiang(姜凤波) e->line.len = e->sp->len;
961*3da8d17dSfengbojiang(姜凤波) e->line.data = e->sp->data;
962*3da8d17dSfengbojiang(姜凤波) }
963*3da8d17dSfengbojiang(姜凤波)
964*3da8d17dSfengbojiang(姜凤波) rc = ngx_http_regex_exec(r, code->regex, &e->line);
965*3da8d17dSfengbojiang(姜凤波)
966*3da8d17dSfengbojiang(姜凤波) if (rc == NGX_DECLINED) {
967*3da8d17dSfengbojiang(姜凤波) if (e->log || (r->connection->log->log_level & NGX_LOG_DEBUG_HTTP)) {
968*3da8d17dSfengbojiang(姜凤波) ngx_log_error(NGX_LOG_NOTICE, r->connection->log, 0,
969*3da8d17dSfengbojiang(姜凤波) "\"%V\" does not match \"%V\"",
970*3da8d17dSfengbojiang(姜凤波) &code->name, &e->line);
971*3da8d17dSfengbojiang(姜凤波) }
972*3da8d17dSfengbojiang(姜凤波)
973*3da8d17dSfengbojiang(姜凤波) r->ncaptures = 0;
974*3da8d17dSfengbojiang(姜凤波)
975*3da8d17dSfengbojiang(姜凤波) if (code->test) {
976*3da8d17dSfengbojiang(姜凤波) if (code->negative_test) {
977*3da8d17dSfengbojiang(姜凤波) e->sp->len = 1;
978*3da8d17dSfengbojiang(姜凤波) e->sp->data = (u_char *) "1";
979*3da8d17dSfengbojiang(姜凤波)
980*3da8d17dSfengbojiang(姜凤波) } else {
981*3da8d17dSfengbojiang(姜凤波) e->sp->len = 0;
982*3da8d17dSfengbojiang(姜凤波) e->sp->data = (u_char *) "";
983*3da8d17dSfengbojiang(姜凤波) }
984*3da8d17dSfengbojiang(姜凤波)
985*3da8d17dSfengbojiang(姜凤波) e->sp++;
986*3da8d17dSfengbojiang(姜凤波)
987*3da8d17dSfengbojiang(姜凤波) e->ip += sizeof(ngx_http_script_regex_code_t);
988*3da8d17dSfengbojiang(姜凤波) return;
989*3da8d17dSfengbojiang(姜凤波) }
990*3da8d17dSfengbojiang(姜凤波)
991*3da8d17dSfengbojiang(姜凤波) e->ip += code->next;
992*3da8d17dSfengbojiang(姜凤波) return;
993*3da8d17dSfengbojiang(姜凤波) }
994*3da8d17dSfengbojiang(姜凤波)
995*3da8d17dSfengbojiang(姜凤波) if (rc == NGX_ERROR) {
996*3da8d17dSfengbojiang(姜凤波) e->ip = ngx_http_script_exit;
997*3da8d17dSfengbojiang(姜凤波) e->status = NGX_HTTP_INTERNAL_SERVER_ERROR;
998*3da8d17dSfengbojiang(姜凤波) return;
999*3da8d17dSfengbojiang(姜凤波) }
1000*3da8d17dSfengbojiang(姜凤波)
1001*3da8d17dSfengbojiang(姜凤波) if (e->log || (r->connection->log->log_level & NGX_LOG_DEBUG_HTTP)) {
1002*3da8d17dSfengbojiang(姜凤波) ngx_log_error(NGX_LOG_NOTICE, r->connection->log, 0,
1003*3da8d17dSfengbojiang(姜凤波) "\"%V\" matches \"%V\"", &code->name, &e->line);
1004*3da8d17dSfengbojiang(姜凤波) }
1005*3da8d17dSfengbojiang(姜凤波)
1006*3da8d17dSfengbojiang(姜凤波) if (code->test) {
1007*3da8d17dSfengbojiang(姜凤波) if (code->negative_test) {
1008*3da8d17dSfengbojiang(姜凤波) e->sp->len = 0;
1009*3da8d17dSfengbojiang(姜凤波) e->sp->data = (u_char *) "";
1010*3da8d17dSfengbojiang(姜凤波)
1011*3da8d17dSfengbojiang(姜凤波) } else {
1012*3da8d17dSfengbojiang(姜凤波) e->sp->len = 1;
1013*3da8d17dSfengbojiang(姜凤波) e->sp->data = (u_char *) "1";
1014*3da8d17dSfengbojiang(姜凤波) }
1015*3da8d17dSfengbojiang(姜凤波)
1016*3da8d17dSfengbojiang(姜凤波) e->sp++;
1017*3da8d17dSfengbojiang(姜凤波)
1018*3da8d17dSfengbojiang(姜凤波) e->ip += sizeof(ngx_http_script_regex_code_t);
1019*3da8d17dSfengbojiang(姜凤波) return;
1020*3da8d17dSfengbojiang(姜凤波) }
1021*3da8d17dSfengbojiang(姜凤波)
1022*3da8d17dSfengbojiang(姜凤波) if (code->status) {
1023*3da8d17dSfengbojiang(姜凤波) e->status = code->status;
1024*3da8d17dSfengbojiang(姜凤波)
1025*3da8d17dSfengbojiang(姜凤波) if (!code->redirect) {
1026*3da8d17dSfengbojiang(姜凤波) e->ip = ngx_http_script_exit;
1027*3da8d17dSfengbojiang(姜凤波) return;
1028*3da8d17dSfengbojiang(姜凤波) }
1029*3da8d17dSfengbojiang(姜凤波) }
1030*3da8d17dSfengbojiang(姜凤波)
1031*3da8d17dSfengbojiang(姜凤波) if (code->uri) {
1032*3da8d17dSfengbojiang(姜凤波) r->internal = 1;
1033*3da8d17dSfengbojiang(姜凤波) r->valid_unparsed_uri = 0;
1034*3da8d17dSfengbojiang(姜凤波)
1035*3da8d17dSfengbojiang(姜凤波) if (code->break_cycle) {
1036*3da8d17dSfengbojiang(姜凤波) r->valid_location = 0;
1037*3da8d17dSfengbojiang(姜凤波) r->uri_changed = 0;
1038*3da8d17dSfengbojiang(姜凤波)
1039*3da8d17dSfengbojiang(姜凤波) } else {
1040*3da8d17dSfengbojiang(姜凤波) r->uri_changed = 1;
1041*3da8d17dSfengbojiang(姜凤波) }
1042*3da8d17dSfengbojiang(姜凤波) }
1043*3da8d17dSfengbojiang(姜凤波)
1044*3da8d17dSfengbojiang(姜凤波) if (code->lengths == NULL) {
1045*3da8d17dSfengbojiang(姜凤波) e->buf.len = code->size;
1046*3da8d17dSfengbojiang(姜凤波)
1047*3da8d17dSfengbojiang(姜凤波) if (code->uri) {
1048*3da8d17dSfengbojiang(姜凤波) if (r->ncaptures && (r->quoted_uri || r->plus_in_uri)) {
1049*3da8d17dSfengbojiang(姜凤波) e->buf.len += 2 * ngx_escape_uri(NULL, r->uri.data, r->uri.len,
1050*3da8d17dSfengbojiang(姜凤波) NGX_ESCAPE_ARGS);
1051*3da8d17dSfengbojiang(姜凤波) }
1052*3da8d17dSfengbojiang(姜凤波) }
1053*3da8d17dSfengbojiang(姜凤波)
1054*3da8d17dSfengbojiang(姜凤波) for (n = 2; n < r->ncaptures; n += 2) {
1055*3da8d17dSfengbojiang(姜凤波) e->buf.len += r->captures[n + 1] - r->captures[n];
1056*3da8d17dSfengbojiang(姜凤波) }
1057*3da8d17dSfengbojiang(姜凤波)
1058*3da8d17dSfengbojiang(姜凤波) } else {
1059*3da8d17dSfengbojiang(姜凤波) ngx_memzero(&le, sizeof(ngx_http_script_engine_t));
1060*3da8d17dSfengbojiang(姜凤波)
1061*3da8d17dSfengbojiang(姜凤波) le.ip = code->lengths->elts;
1062*3da8d17dSfengbojiang(姜凤波) le.line = e->line;
1063*3da8d17dSfengbojiang(姜凤波) le.request = r;
1064*3da8d17dSfengbojiang(姜凤波) le.quote = code->redirect;
1065*3da8d17dSfengbojiang(姜凤波)
1066*3da8d17dSfengbojiang(姜凤波) len = 0;
1067*3da8d17dSfengbojiang(姜凤波)
1068*3da8d17dSfengbojiang(姜凤波) while (*(uintptr_t *) le.ip) {
1069*3da8d17dSfengbojiang(姜凤波) lcode = *(ngx_http_script_len_code_pt *) le.ip;
1070*3da8d17dSfengbojiang(姜凤波) len += lcode(&le);
1071*3da8d17dSfengbojiang(姜凤波) }
1072*3da8d17dSfengbojiang(姜凤波)
1073*3da8d17dSfengbojiang(姜凤波) e->buf.len = len;
1074*3da8d17dSfengbojiang(姜凤波) }
1075*3da8d17dSfengbojiang(姜凤波)
1076*3da8d17dSfengbojiang(姜凤波) if (code->add_args && r->args.len) {
1077*3da8d17dSfengbojiang(姜凤波) e->buf.len += r->args.len + 1;
1078*3da8d17dSfengbojiang(姜凤波) }
1079*3da8d17dSfengbojiang(姜凤波)
1080*3da8d17dSfengbojiang(姜凤波) e->buf.data = ngx_pnalloc(r->pool, e->buf.len);
1081*3da8d17dSfengbojiang(姜凤波) if (e->buf.data == NULL) {
1082*3da8d17dSfengbojiang(姜凤波) e->ip = ngx_http_script_exit;
1083*3da8d17dSfengbojiang(姜凤波) e->status = NGX_HTTP_INTERNAL_SERVER_ERROR;
1084*3da8d17dSfengbojiang(姜凤波) return;
1085*3da8d17dSfengbojiang(姜凤波) }
1086*3da8d17dSfengbojiang(姜凤波)
1087*3da8d17dSfengbojiang(姜凤波) e->quote = code->redirect;
1088*3da8d17dSfengbojiang(姜凤波)
1089*3da8d17dSfengbojiang(姜凤波) e->pos = e->buf.data;
1090*3da8d17dSfengbojiang(姜凤波)
1091*3da8d17dSfengbojiang(姜凤波) e->ip += sizeof(ngx_http_script_regex_code_t);
1092*3da8d17dSfengbojiang(姜凤波) }
1093*3da8d17dSfengbojiang(姜凤波)
1094*3da8d17dSfengbojiang(姜凤波)
1095*3da8d17dSfengbojiang(姜凤波) void
ngx_http_script_regex_end_code(ngx_http_script_engine_t * e)1096*3da8d17dSfengbojiang(姜凤波) ngx_http_script_regex_end_code(ngx_http_script_engine_t *e)
1097*3da8d17dSfengbojiang(姜凤波) {
1098*3da8d17dSfengbojiang(姜凤波) u_char *dst, *src;
1099*3da8d17dSfengbojiang(姜凤波) ngx_http_request_t *r;
1100*3da8d17dSfengbojiang(姜凤波) ngx_http_script_regex_end_code_t *code;
1101*3da8d17dSfengbojiang(姜凤波)
1102*3da8d17dSfengbojiang(姜凤波) code = (ngx_http_script_regex_end_code_t *) e->ip;
1103*3da8d17dSfengbojiang(姜凤波)
1104*3da8d17dSfengbojiang(姜凤波) r = e->request;
1105*3da8d17dSfengbojiang(姜凤波)
1106*3da8d17dSfengbojiang(姜凤波) e->quote = 0;
1107*3da8d17dSfengbojiang(姜凤波)
1108*3da8d17dSfengbojiang(姜凤波) ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
1109*3da8d17dSfengbojiang(姜凤波) "http script regex end");
1110*3da8d17dSfengbojiang(姜凤波)
1111*3da8d17dSfengbojiang(姜凤波) if (code->redirect) {
1112*3da8d17dSfengbojiang(姜凤波)
1113*3da8d17dSfengbojiang(姜凤波) dst = e->buf.data;
1114*3da8d17dSfengbojiang(姜凤波) src = e->buf.data;
1115*3da8d17dSfengbojiang(姜凤波)
1116*3da8d17dSfengbojiang(姜凤波) ngx_unescape_uri(&dst, &src, e->pos - e->buf.data,
1117*3da8d17dSfengbojiang(姜凤波) NGX_UNESCAPE_REDIRECT);
1118*3da8d17dSfengbojiang(姜凤波)
1119*3da8d17dSfengbojiang(姜凤波) if (src < e->pos) {
1120*3da8d17dSfengbojiang(姜凤波) dst = ngx_movemem(dst, src, e->pos - src);
1121*3da8d17dSfengbojiang(姜凤波) }
1122*3da8d17dSfengbojiang(姜凤波)
1123*3da8d17dSfengbojiang(姜凤波) e->pos = dst;
1124*3da8d17dSfengbojiang(姜凤波)
1125*3da8d17dSfengbojiang(姜凤波) if (code->add_args && r->args.len) {
1126*3da8d17dSfengbojiang(姜凤波) *e->pos++ = (u_char) (code->args ? '&' : '?');
1127*3da8d17dSfengbojiang(姜凤波) e->pos = ngx_copy(e->pos, r->args.data, r->args.len);
1128*3da8d17dSfengbojiang(姜凤波) }
1129*3da8d17dSfengbojiang(姜凤波)
1130*3da8d17dSfengbojiang(姜凤波) e->buf.len = e->pos - e->buf.data;
1131*3da8d17dSfengbojiang(姜凤波)
1132*3da8d17dSfengbojiang(姜凤波) if (e->log || (r->connection->log->log_level & NGX_LOG_DEBUG_HTTP)) {
1133*3da8d17dSfengbojiang(姜凤波) ngx_log_error(NGX_LOG_NOTICE, r->connection->log, 0,
1134*3da8d17dSfengbojiang(姜凤波) "rewritten redirect: \"%V\"", &e->buf);
1135*3da8d17dSfengbojiang(姜凤波) }
1136*3da8d17dSfengbojiang(姜凤波)
1137*3da8d17dSfengbojiang(姜凤波) ngx_http_clear_location(r);
1138*3da8d17dSfengbojiang(姜凤波)
1139*3da8d17dSfengbojiang(姜凤波) r->headers_out.location = ngx_list_push(&r->headers_out.headers);
1140*3da8d17dSfengbojiang(姜凤波) if (r->headers_out.location == NULL) {
1141*3da8d17dSfengbojiang(姜凤波) e->ip = ngx_http_script_exit;
1142*3da8d17dSfengbojiang(姜凤波) e->status = NGX_HTTP_INTERNAL_SERVER_ERROR;
1143*3da8d17dSfengbojiang(姜凤波) return;
1144*3da8d17dSfengbojiang(姜凤波) }
1145*3da8d17dSfengbojiang(姜凤波)
1146*3da8d17dSfengbojiang(姜凤波) r->headers_out.location->hash = 1;
1147*3da8d17dSfengbojiang(姜凤波) ngx_str_set(&r->headers_out.location->key, "Location");
1148*3da8d17dSfengbojiang(姜凤波) r->headers_out.location->value = e->buf;
1149*3da8d17dSfengbojiang(姜凤波)
1150*3da8d17dSfengbojiang(姜凤波) e->ip += sizeof(ngx_http_script_regex_end_code_t);
1151*3da8d17dSfengbojiang(姜凤波) return;
1152*3da8d17dSfengbojiang(姜凤波) }
1153*3da8d17dSfengbojiang(姜凤波)
1154*3da8d17dSfengbojiang(姜凤波) if (e->args) {
1155*3da8d17dSfengbojiang(姜凤波) e->buf.len = e->args - e->buf.data;
1156*3da8d17dSfengbojiang(姜凤波)
1157*3da8d17dSfengbojiang(姜凤波) if (code->add_args && r->args.len) {
1158*3da8d17dSfengbojiang(姜凤波) *e->pos++ = '&';
1159*3da8d17dSfengbojiang(姜凤波) e->pos = ngx_copy(e->pos, r->args.data, r->args.len);
1160*3da8d17dSfengbojiang(姜凤波) }
1161*3da8d17dSfengbojiang(姜凤波)
1162*3da8d17dSfengbojiang(姜凤波) r->args.len = e->pos - e->args;
1163*3da8d17dSfengbojiang(姜凤波) r->args.data = e->args;
1164*3da8d17dSfengbojiang(姜凤波)
1165*3da8d17dSfengbojiang(姜凤波) e->args = NULL;
1166*3da8d17dSfengbojiang(姜凤波)
1167*3da8d17dSfengbojiang(姜凤波) } else {
1168*3da8d17dSfengbojiang(姜凤波) e->buf.len = e->pos - e->buf.data;
1169*3da8d17dSfengbojiang(姜凤波)
1170*3da8d17dSfengbojiang(姜凤波) if (!code->add_args) {
1171*3da8d17dSfengbojiang(姜凤波) r->args.len = 0;
1172*3da8d17dSfengbojiang(姜凤波) }
1173*3da8d17dSfengbojiang(姜凤波) }
1174*3da8d17dSfengbojiang(姜凤波)
1175*3da8d17dSfengbojiang(姜凤波) if (e->log || (r->connection->log->log_level & NGX_LOG_DEBUG_HTTP)) {
1176*3da8d17dSfengbojiang(姜凤波) ngx_log_error(NGX_LOG_NOTICE, r->connection->log, 0,
1177*3da8d17dSfengbojiang(姜凤波) "rewritten data: \"%V\", args: \"%V\"",
1178*3da8d17dSfengbojiang(姜凤波) &e->buf, &r->args);
1179*3da8d17dSfengbojiang(姜凤波) }
1180*3da8d17dSfengbojiang(姜凤波)
1181*3da8d17dSfengbojiang(姜凤波) if (code->uri) {
1182*3da8d17dSfengbojiang(姜凤波) r->uri = e->buf;
1183*3da8d17dSfengbojiang(姜凤波)
1184*3da8d17dSfengbojiang(姜凤波) if (r->uri.len == 0) {
1185*3da8d17dSfengbojiang(姜凤波) ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
1186*3da8d17dSfengbojiang(姜凤波) "the rewritten URI has a zero length");
1187*3da8d17dSfengbojiang(姜凤波) e->ip = ngx_http_script_exit;
1188*3da8d17dSfengbojiang(姜凤波) e->status = NGX_HTTP_INTERNAL_SERVER_ERROR;
1189*3da8d17dSfengbojiang(姜凤波) return;
1190*3da8d17dSfengbojiang(姜凤波) }
1191*3da8d17dSfengbojiang(姜凤波)
1192*3da8d17dSfengbojiang(姜凤波) ngx_http_set_exten(r);
1193*3da8d17dSfengbojiang(姜凤波) }
1194*3da8d17dSfengbojiang(姜凤波)
1195*3da8d17dSfengbojiang(姜凤波) e->ip += sizeof(ngx_http_script_regex_end_code_t);
1196*3da8d17dSfengbojiang(姜凤波) }
1197*3da8d17dSfengbojiang(姜凤波)
1198*3da8d17dSfengbojiang(姜凤波)
1199*3da8d17dSfengbojiang(姜凤波) static ngx_int_t
ngx_http_script_add_capture_code(ngx_http_script_compile_t * sc,ngx_uint_t n)1200*3da8d17dSfengbojiang(姜凤波) ngx_http_script_add_capture_code(ngx_http_script_compile_t *sc, ngx_uint_t n)
1201*3da8d17dSfengbojiang(姜凤波) {
1202*3da8d17dSfengbojiang(姜凤波) ngx_http_script_copy_capture_code_t *code;
1203*3da8d17dSfengbojiang(姜凤波)
1204*3da8d17dSfengbojiang(姜凤波) code = ngx_http_script_add_code(*sc->lengths,
1205*3da8d17dSfengbojiang(姜凤波) sizeof(ngx_http_script_copy_capture_code_t),
1206*3da8d17dSfengbojiang(姜凤波) NULL);
1207*3da8d17dSfengbojiang(姜凤波) if (code == NULL) {
1208*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
1209*3da8d17dSfengbojiang(姜凤波) }
1210*3da8d17dSfengbojiang(姜凤波)
1211*3da8d17dSfengbojiang(姜凤波) code->code = (ngx_http_script_code_pt) (void *)
1212*3da8d17dSfengbojiang(姜凤波) ngx_http_script_copy_capture_len_code;
1213*3da8d17dSfengbojiang(姜凤波) code->n = 2 * n;
1214*3da8d17dSfengbojiang(姜凤波)
1215*3da8d17dSfengbojiang(姜凤波)
1216*3da8d17dSfengbojiang(姜凤波) code = ngx_http_script_add_code(*sc->values,
1217*3da8d17dSfengbojiang(姜凤波) sizeof(ngx_http_script_copy_capture_code_t),
1218*3da8d17dSfengbojiang(姜凤波) &sc->main);
1219*3da8d17dSfengbojiang(姜凤波) if (code == NULL) {
1220*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
1221*3da8d17dSfengbojiang(姜凤波) }
1222*3da8d17dSfengbojiang(姜凤波)
1223*3da8d17dSfengbojiang(姜凤波) code->code = ngx_http_script_copy_capture_code;
1224*3da8d17dSfengbojiang(姜凤波) code->n = 2 * n;
1225*3da8d17dSfengbojiang(姜凤波)
1226*3da8d17dSfengbojiang(姜凤波) if (sc->ncaptures < n) {
1227*3da8d17dSfengbojiang(姜凤波) sc->ncaptures = n;
1228*3da8d17dSfengbojiang(姜凤波) }
1229*3da8d17dSfengbojiang(姜凤波)
1230*3da8d17dSfengbojiang(姜凤波) return NGX_OK;
1231*3da8d17dSfengbojiang(姜凤波) }
1232*3da8d17dSfengbojiang(姜凤波)
1233*3da8d17dSfengbojiang(姜凤波)
1234*3da8d17dSfengbojiang(姜凤波) size_t
ngx_http_script_copy_capture_len_code(ngx_http_script_engine_t * e)1235*3da8d17dSfengbojiang(姜凤波) ngx_http_script_copy_capture_len_code(ngx_http_script_engine_t *e)
1236*3da8d17dSfengbojiang(姜凤波) {
1237*3da8d17dSfengbojiang(姜凤波) int *cap;
1238*3da8d17dSfengbojiang(姜凤波) u_char *p;
1239*3da8d17dSfengbojiang(姜凤波) ngx_uint_t n;
1240*3da8d17dSfengbojiang(姜凤波) ngx_http_request_t *r;
1241*3da8d17dSfengbojiang(姜凤波) ngx_http_script_copy_capture_code_t *code;
1242*3da8d17dSfengbojiang(姜凤波)
1243*3da8d17dSfengbojiang(姜凤波) r = e->request;
1244*3da8d17dSfengbojiang(姜凤波)
1245*3da8d17dSfengbojiang(姜凤波) code = (ngx_http_script_copy_capture_code_t *) e->ip;
1246*3da8d17dSfengbojiang(姜凤波)
1247*3da8d17dSfengbojiang(姜凤波) e->ip += sizeof(ngx_http_script_copy_capture_code_t);
1248*3da8d17dSfengbojiang(姜凤波)
1249*3da8d17dSfengbojiang(姜凤波) n = code->n;
1250*3da8d17dSfengbojiang(姜凤波)
1251*3da8d17dSfengbojiang(姜凤波) if (n < r->ncaptures) {
1252*3da8d17dSfengbojiang(姜凤波)
1253*3da8d17dSfengbojiang(姜凤波) cap = r->captures;
1254*3da8d17dSfengbojiang(姜凤波)
1255*3da8d17dSfengbojiang(姜凤波) if ((e->is_args || e->quote)
1256*3da8d17dSfengbojiang(姜凤波) && (e->request->quoted_uri || e->request->plus_in_uri))
1257*3da8d17dSfengbojiang(姜凤波) {
1258*3da8d17dSfengbojiang(姜凤波) p = r->captures_data;
1259*3da8d17dSfengbojiang(姜凤波)
1260*3da8d17dSfengbojiang(姜凤波) return cap[n + 1] - cap[n]
1261*3da8d17dSfengbojiang(姜凤波) + 2 * ngx_escape_uri(NULL, &p[cap[n]], cap[n + 1] - cap[n],
1262*3da8d17dSfengbojiang(姜凤波) NGX_ESCAPE_ARGS);
1263*3da8d17dSfengbojiang(姜凤波) } else {
1264*3da8d17dSfengbojiang(姜凤波) return cap[n + 1] - cap[n];
1265*3da8d17dSfengbojiang(姜凤波) }
1266*3da8d17dSfengbojiang(姜凤波) }
1267*3da8d17dSfengbojiang(姜凤波)
1268*3da8d17dSfengbojiang(姜凤波) return 0;
1269*3da8d17dSfengbojiang(姜凤波) }
1270*3da8d17dSfengbojiang(姜凤波)
1271*3da8d17dSfengbojiang(姜凤波)
1272*3da8d17dSfengbojiang(姜凤波) void
ngx_http_script_copy_capture_code(ngx_http_script_engine_t * e)1273*3da8d17dSfengbojiang(姜凤波) ngx_http_script_copy_capture_code(ngx_http_script_engine_t *e)
1274*3da8d17dSfengbojiang(姜凤波) {
1275*3da8d17dSfengbojiang(姜凤波) int *cap;
1276*3da8d17dSfengbojiang(姜凤波) u_char *p, *pos;
1277*3da8d17dSfengbojiang(姜凤波) ngx_uint_t n;
1278*3da8d17dSfengbojiang(姜凤波) ngx_http_request_t *r;
1279*3da8d17dSfengbojiang(姜凤波) ngx_http_script_copy_capture_code_t *code;
1280*3da8d17dSfengbojiang(姜凤波)
1281*3da8d17dSfengbojiang(姜凤波) r = e->request;
1282*3da8d17dSfengbojiang(姜凤波)
1283*3da8d17dSfengbojiang(姜凤波) code = (ngx_http_script_copy_capture_code_t *) e->ip;
1284*3da8d17dSfengbojiang(姜凤波)
1285*3da8d17dSfengbojiang(姜凤波) e->ip += sizeof(ngx_http_script_copy_capture_code_t);
1286*3da8d17dSfengbojiang(姜凤波)
1287*3da8d17dSfengbojiang(姜凤波) n = code->n;
1288*3da8d17dSfengbojiang(姜凤波)
1289*3da8d17dSfengbojiang(姜凤波) pos = e->pos;
1290*3da8d17dSfengbojiang(姜凤波)
1291*3da8d17dSfengbojiang(姜凤波) if (n < r->ncaptures) {
1292*3da8d17dSfengbojiang(姜凤波)
1293*3da8d17dSfengbojiang(姜凤波) cap = r->captures;
1294*3da8d17dSfengbojiang(姜凤波) p = r->captures_data;
1295*3da8d17dSfengbojiang(姜凤波)
1296*3da8d17dSfengbojiang(姜凤波) if ((e->is_args || e->quote)
1297*3da8d17dSfengbojiang(姜凤波) && (e->request->quoted_uri || e->request->plus_in_uri))
1298*3da8d17dSfengbojiang(姜凤波) {
1299*3da8d17dSfengbojiang(姜凤波) e->pos = (u_char *) ngx_escape_uri(pos, &p[cap[n]],
1300*3da8d17dSfengbojiang(姜凤波) cap[n + 1] - cap[n],
1301*3da8d17dSfengbojiang(姜凤波) NGX_ESCAPE_ARGS);
1302*3da8d17dSfengbojiang(姜凤波) } else {
1303*3da8d17dSfengbojiang(姜凤波) e->pos = ngx_copy(pos, &p[cap[n]], cap[n + 1] - cap[n]);
1304*3da8d17dSfengbojiang(姜凤波) }
1305*3da8d17dSfengbojiang(姜凤波) }
1306*3da8d17dSfengbojiang(姜凤波)
1307*3da8d17dSfengbojiang(姜凤波) ngx_log_debug2(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0,
1308*3da8d17dSfengbojiang(姜凤波) "http script capture: \"%*s\"", e->pos - pos, pos);
1309*3da8d17dSfengbojiang(姜凤波) }
1310*3da8d17dSfengbojiang(姜凤波)
1311*3da8d17dSfengbojiang(姜凤波) #endif
1312*3da8d17dSfengbojiang(姜凤波)
1313*3da8d17dSfengbojiang(姜凤波)
1314*3da8d17dSfengbojiang(姜凤波) static ngx_int_t
ngx_http_script_add_full_name_code(ngx_http_script_compile_t * sc)1315*3da8d17dSfengbojiang(姜凤波) ngx_http_script_add_full_name_code(ngx_http_script_compile_t *sc)
1316*3da8d17dSfengbojiang(姜凤波) {
1317*3da8d17dSfengbojiang(姜凤波) ngx_http_script_full_name_code_t *code;
1318*3da8d17dSfengbojiang(姜凤波)
1319*3da8d17dSfengbojiang(姜凤波) code = ngx_http_script_add_code(*sc->lengths,
1320*3da8d17dSfengbojiang(姜凤波) sizeof(ngx_http_script_full_name_code_t),
1321*3da8d17dSfengbojiang(姜凤波) NULL);
1322*3da8d17dSfengbojiang(姜凤波) if (code == NULL) {
1323*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
1324*3da8d17dSfengbojiang(姜凤波) }
1325*3da8d17dSfengbojiang(姜凤波)
1326*3da8d17dSfengbojiang(姜凤波) code->code = (ngx_http_script_code_pt) (void *)
1327*3da8d17dSfengbojiang(姜凤波) ngx_http_script_full_name_len_code;
1328*3da8d17dSfengbojiang(姜凤波) code->conf_prefix = sc->conf_prefix;
1329*3da8d17dSfengbojiang(姜凤波)
1330*3da8d17dSfengbojiang(姜凤波) code = ngx_http_script_add_code(*sc->values,
1331*3da8d17dSfengbojiang(姜凤波) sizeof(ngx_http_script_full_name_code_t),
1332*3da8d17dSfengbojiang(姜凤波) &sc->main);
1333*3da8d17dSfengbojiang(姜凤波) if (code == NULL) {
1334*3da8d17dSfengbojiang(姜凤波) return NGX_ERROR;
1335*3da8d17dSfengbojiang(姜凤波) }
1336*3da8d17dSfengbojiang(姜凤波)
1337*3da8d17dSfengbojiang(姜凤波) code->code = ngx_http_script_full_name_code;
1338*3da8d17dSfengbojiang(姜凤波) code->conf_prefix = sc->conf_prefix;
1339*3da8d17dSfengbojiang(姜凤波)
1340*3da8d17dSfengbojiang(姜凤波) return NGX_OK;
1341*3da8d17dSfengbojiang(姜凤波) }
1342*3da8d17dSfengbojiang(姜凤波)
1343*3da8d17dSfengbojiang(姜凤波)
1344*3da8d17dSfengbojiang(姜凤波) static size_t
ngx_http_script_full_name_len_code(ngx_http_script_engine_t * e)1345*3da8d17dSfengbojiang(姜凤波) ngx_http_script_full_name_len_code(ngx_http_script_engine_t *e)
1346*3da8d17dSfengbojiang(姜凤波) {
1347*3da8d17dSfengbojiang(姜凤波) ngx_http_script_full_name_code_t *code;
1348*3da8d17dSfengbojiang(姜凤波)
1349*3da8d17dSfengbojiang(姜凤波) code = (ngx_http_script_full_name_code_t *) e->ip;
1350*3da8d17dSfengbojiang(姜凤波)
1351*3da8d17dSfengbojiang(姜凤波) e->ip += sizeof(ngx_http_script_full_name_code_t);
1352*3da8d17dSfengbojiang(姜凤波)
1353*3da8d17dSfengbojiang(姜凤波) return code->conf_prefix ? ngx_cycle->conf_prefix.len:
1354*3da8d17dSfengbojiang(姜凤波) ngx_cycle->prefix.len;
1355*3da8d17dSfengbojiang(姜凤波) }
1356*3da8d17dSfengbojiang(姜凤波)
1357*3da8d17dSfengbojiang(姜凤波)
1358*3da8d17dSfengbojiang(姜凤波) static void
ngx_http_script_full_name_code(ngx_http_script_engine_t * e)1359*3da8d17dSfengbojiang(姜凤波) ngx_http_script_full_name_code(ngx_http_script_engine_t *e)
1360*3da8d17dSfengbojiang(姜凤波) {
1361*3da8d17dSfengbojiang(姜凤波) ngx_http_script_full_name_code_t *code;
1362*3da8d17dSfengbojiang(姜凤波)
1363*3da8d17dSfengbojiang(姜凤波) ngx_str_t value, *prefix;
1364*3da8d17dSfengbojiang(姜凤波)
1365*3da8d17dSfengbojiang(姜凤波) code = (ngx_http_script_full_name_code_t *) e->ip;
1366*3da8d17dSfengbojiang(姜凤波)
1367*3da8d17dSfengbojiang(姜凤波) value.data = e->buf.data;
1368*3da8d17dSfengbojiang(姜凤波) value.len = e->pos - e->buf.data;
1369*3da8d17dSfengbojiang(姜凤波)
1370*3da8d17dSfengbojiang(姜凤波) prefix = code->conf_prefix ? (ngx_str_t *) &ngx_cycle->conf_prefix:
1371*3da8d17dSfengbojiang(姜凤波) (ngx_str_t *) &ngx_cycle->prefix;
1372*3da8d17dSfengbojiang(姜凤波)
1373*3da8d17dSfengbojiang(姜凤波) if (ngx_get_full_name(e->request->pool, prefix, &value) != NGX_OK) {
1374*3da8d17dSfengbojiang(姜凤波) e->ip = ngx_http_script_exit;
1375*3da8d17dSfengbojiang(姜凤波) e->status = NGX_HTTP_INTERNAL_SERVER_ERROR;
1376*3da8d17dSfengbojiang(姜凤波) return;
1377*3da8d17dSfengbojiang(姜凤波) }
1378*3da8d17dSfengbojiang(姜凤波)
1379*3da8d17dSfengbojiang(姜凤波) e->buf = value;
1380*3da8d17dSfengbojiang(姜凤波)
1381*3da8d17dSfengbojiang(姜凤波) ngx_log_debug1(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0,
1382*3da8d17dSfengbojiang(姜凤波) "http script fullname: \"%V\"", &value);
1383*3da8d17dSfengbojiang(姜凤波)
1384*3da8d17dSfengbojiang(姜凤波) e->ip += sizeof(ngx_http_script_full_name_code_t);
1385*3da8d17dSfengbojiang(姜凤波) }
1386*3da8d17dSfengbojiang(姜凤波)
1387*3da8d17dSfengbojiang(姜凤波)
1388*3da8d17dSfengbojiang(姜凤波) void
ngx_http_script_return_code(ngx_http_script_engine_t * e)1389*3da8d17dSfengbojiang(姜凤波) ngx_http_script_return_code(ngx_http_script_engine_t *e)
1390*3da8d17dSfengbojiang(姜凤波) {
1391*3da8d17dSfengbojiang(姜凤波) ngx_http_script_return_code_t *code;
1392*3da8d17dSfengbojiang(姜凤波)
1393*3da8d17dSfengbojiang(姜凤波) code = (ngx_http_script_return_code_t *) e->ip;
1394*3da8d17dSfengbojiang(姜凤波)
1395*3da8d17dSfengbojiang(姜凤波) if (code->status < NGX_HTTP_BAD_REQUEST
1396*3da8d17dSfengbojiang(姜凤波) || code->text.value.len
1397*3da8d17dSfengbojiang(姜凤波) || code->text.lengths)
1398*3da8d17dSfengbojiang(姜凤波) {
1399*3da8d17dSfengbojiang(姜凤波) e->status = ngx_http_send_response(e->request, code->status, NULL,
1400*3da8d17dSfengbojiang(姜凤波) &code->text);
1401*3da8d17dSfengbojiang(姜凤波) } else {
1402*3da8d17dSfengbojiang(姜凤波) e->status = code->status;
1403*3da8d17dSfengbojiang(姜凤波) }
1404*3da8d17dSfengbojiang(姜凤波)
1405*3da8d17dSfengbojiang(姜凤波) e->ip = ngx_http_script_exit;
1406*3da8d17dSfengbojiang(姜凤波) }
1407*3da8d17dSfengbojiang(姜凤波)
1408*3da8d17dSfengbojiang(姜凤波)
1409*3da8d17dSfengbojiang(姜凤波) void
ngx_http_script_break_code(ngx_http_script_engine_t * e)1410*3da8d17dSfengbojiang(姜凤波) ngx_http_script_break_code(ngx_http_script_engine_t *e)
1411*3da8d17dSfengbojiang(姜凤波) {
1412*3da8d17dSfengbojiang(姜凤波) e->request->uri_changed = 0;
1413*3da8d17dSfengbojiang(姜凤波)
1414*3da8d17dSfengbojiang(姜凤波) e->ip = ngx_http_script_exit;
1415*3da8d17dSfengbojiang(姜凤波) }
1416*3da8d17dSfengbojiang(姜凤波)
1417*3da8d17dSfengbojiang(姜凤波)
1418*3da8d17dSfengbojiang(姜凤波) void
ngx_http_script_if_code(ngx_http_script_engine_t * e)1419*3da8d17dSfengbojiang(姜凤波) ngx_http_script_if_code(ngx_http_script_engine_t *e)
1420*3da8d17dSfengbojiang(姜凤波) {
1421*3da8d17dSfengbojiang(姜凤波) ngx_http_script_if_code_t *code;
1422*3da8d17dSfengbojiang(姜凤波)
1423*3da8d17dSfengbojiang(姜凤波) code = (ngx_http_script_if_code_t *) e->ip;
1424*3da8d17dSfengbojiang(姜凤波)
1425*3da8d17dSfengbojiang(姜凤波) ngx_log_debug0(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0,
1426*3da8d17dSfengbojiang(姜凤波) "http script if");
1427*3da8d17dSfengbojiang(姜凤波)
1428*3da8d17dSfengbojiang(姜凤波) e->sp--;
1429*3da8d17dSfengbojiang(姜凤波)
1430*3da8d17dSfengbojiang(姜凤波) if (e->sp->len && (e->sp->len != 1 || e->sp->data[0] != '0')) {
1431*3da8d17dSfengbojiang(姜凤波) if (code->loc_conf) {
1432*3da8d17dSfengbojiang(姜凤波) e->request->loc_conf = code->loc_conf;
1433*3da8d17dSfengbojiang(姜凤波) ngx_http_update_location_config(e->request);
1434*3da8d17dSfengbojiang(姜凤波) }
1435*3da8d17dSfengbojiang(姜凤波)
1436*3da8d17dSfengbojiang(姜凤波) e->ip += sizeof(ngx_http_script_if_code_t);
1437*3da8d17dSfengbojiang(姜凤波) return;
1438*3da8d17dSfengbojiang(姜凤波) }
1439*3da8d17dSfengbojiang(姜凤波)
1440*3da8d17dSfengbojiang(姜凤波) ngx_log_debug0(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0,
1441*3da8d17dSfengbojiang(姜凤波) "http script if: false");
1442*3da8d17dSfengbojiang(姜凤波)
1443*3da8d17dSfengbojiang(姜凤波) e->ip += code->next;
1444*3da8d17dSfengbojiang(姜凤波) }
1445*3da8d17dSfengbojiang(姜凤波)
1446*3da8d17dSfengbojiang(姜凤波)
1447*3da8d17dSfengbojiang(姜凤波) void
ngx_http_script_equal_code(ngx_http_script_engine_t * e)1448*3da8d17dSfengbojiang(姜凤波) ngx_http_script_equal_code(ngx_http_script_engine_t *e)
1449*3da8d17dSfengbojiang(姜凤波) {
1450*3da8d17dSfengbojiang(姜凤波) ngx_http_variable_value_t *val, *res;
1451*3da8d17dSfengbojiang(姜凤波)
1452*3da8d17dSfengbojiang(姜凤波) ngx_log_debug0(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0,
1453*3da8d17dSfengbojiang(姜凤波) "http script equal");
1454*3da8d17dSfengbojiang(姜凤波)
1455*3da8d17dSfengbojiang(姜凤波) e->sp--;
1456*3da8d17dSfengbojiang(姜凤波) val = e->sp;
1457*3da8d17dSfengbojiang(姜凤波) res = e->sp - 1;
1458*3da8d17dSfengbojiang(姜凤波)
1459*3da8d17dSfengbojiang(姜凤波) e->ip += sizeof(uintptr_t);
1460*3da8d17dSfengbojiang(姜凤波)
1461*3da8d17dSfengbojiang(姜凤波) if (val->len == res->len
1462*3da8d17dSfengbojiang(姜凤波) && ngx_strncmp(val->data, res->data, res->len) == 0)
1463*3da8d17dSfengbojiang(姜凤波) {
1464*3da8d17dSfengbojiang(姜凤波) *res = ngx_http_variable_true_value;
1465*3da8d17dSfengbojiang(姜凤波) return;
1466*3da8d17dSfengbojiang(姜凤波) }
1467*3da8d17dSfengbojiang(姜凤波)
1468*3da8d17dSfengbojiang(姜凤波) ngx_log_debug0(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0,
1469*3da8d17dSfengbojiang(姜凤波) "http script equal: no");
1470*3da8d17dSfengbojiang(姜凤波)
1471*3da8d17dSfengbojiang(姜凤波) *res = ngx_http_variable_null_value;
1472*3da8d17dSfengbojiang(姜凤波) }
1473*3da8d17dSfengbojiang(姜凤波)
1474*3da8d17dSfengbojiang(姜凤波)
1475*3da8d17dSfengbojiang(姜凤波) void
ngx_http_script_not_equal_code(ngx_http_script_engine_t * e)1476*3da8d17dSfengbojiang(姜凤波) ngx_http_script_not_equal_code(ngx_http_script_engine_t *e)
1477*3da8d17dSfengbojiang(姜凤波) {
1478*3da8d17dSfengbojiang(姜凤波) ngx_http_variable_value_t *val, *res;
1479*3da8d17dSfengbojiang(姜凤波)
1480*3da8d17dSfengbojiang(姜凤波) ngx_log_debug0(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0,
1481*3da8d17dSfengbojiang(姜凤波) "http script not equal");
1482*3da8d17dSfengbojiang(姜凤波)
1483*3da8d17dSfengbojiang(姜凤波) e->sp--;
1484*3da8d17dSfengbojiang(姜凤波) val = e->sp;
1485*3da8d17dSfengbojiang(姜凤波) res = e->sp - 1;
1486*3da8d17dSfengbojiang(姜凤波)
1487*3da8d17dSfengbojiang(姜凤波) e->ip += sizeof(uintptr_t);
1488*3da8d17dSfengbojiang(姜凤波)
1489*3da8d17dSfengbojiang(姜凤波) if (val->len == res->len
1490*3da8d17dSfengbojiang(姜凤波) && ngx_strncmp(val->data, res->data, res->len) == 0)
1491*3da8d17dSfengbojiang(姜凤波) {
1492*3da8d17dSfengbojiang(姜凤波) ngx_log_debug0(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0,
1493*3da8d17dSfengbojiang(姜凤波) "http script not equal: no");
1494*3da8d17dSfengbojiang(姜凤波)
1495*3da8d17dSfengbojiang(姜凤波) *res = ngx_http_variable_null_value;
1496*3da8d17dSfengbojiang(姜凤波) return;
1497*3da8d17dSfengbojiang(姜凤波) }
1498*3da8d17dSfengbojiang(姜凤波)
1499*3da8d17dSfengbojiang(姜凤波) *res = ngx_http_variable_true_value;
1500*3da8d17dSfengbojiang(姜凤波) }
1501*3da8d17dSfengbojiang(姜凤波)
1502*3da8d17dSfengbojiang(姜凤波)
1503*3da8d17dSfengbojiang(姜凤波) void
ngx_http_script_file_code(ngx_http_script_engine_t * e)1504*3da8d17dSfengbojiang(姜凤波) ngx_http_script_file_code(ngx_http_script_engine_t *e)
1505*3da8d17dSfengbojiang(姜凤波) {
1506*3da8d17dSfengbojiang(姜凤波) ngx_str_t path;
1507*3da8d17dSfengbojiang(姜凤波) ngx_http_request_t *r;
1508*3da8d17dSfengbojiang(姜凤波) ngx_open_file_info_t of;
1509*3da8d17dSfengbojiang(姜凤波) ngx_http_core_loc_conf_t *clcf;
1510*3da8d17dSfengbojiang(姜凤波) ngx_http_variable_value_t *value;
1511*3da8d17dSfengbojiang(姜凤波) ngx_http_script_file_code_t *code;
1512*3da8d17dSfengbojiang(姜凤波)
1513*3da8d17dSfengbojiang(姜凤波) value = e->sp - 1;
1514*3da8d17dSfengbojiang(姜凤波)
1515*3da8d17dSfengbojiang(姜凤波) code = (ngx_http_script_file_code_t *) e->ip;
1516*3da8d17dSfengbojiang(姜凤波) e->ip += sizeof(ngx_http_script_file_code_t);
1517*3da8d17dSfengbojiang(姜凤波)
1518*3da8d17dSfengbojiang(姜凤波) path.len = value->len - 1;
1519*3da8d17dSfengbojiang(姜凤波) path.data = value->data;
1520*3da8d17dSfengbojiang(姜凤波)
1521*3da8d17dSfengbojiang(姜凤波) r = e->request;
1522*3da8d17dSfengbojiang(姜凤波)
1523*3da8d17dSfengbojiang(姜凤波) ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
1524*3da8d17dSfengbojiang(姜凤波) "http script file op %p \"%V\"", (void *) code->op, &path);
1525*3da8d17dSfengbojiang(姜凤波)
1526*3da8d17dSfengbojiang(姜凤波) clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
1527*3da8d17dSfengbojiang(姜凤波)
1528*3da8d17dSfengbojiang(姜凤波) ngx_memzero(&of, sizeof(ngx_open_file_info_t));
1529*3da8d17dSfengbojiang(姜凤波)
1530*3da8d17dSfengbojiang(姜凤波) of.read_ahead = clcf->read_ahead;
1531*3da8d17dSfengbojiang(姜凤波) of.directio = clcf->directio;
1532*3da8d17dSfengbojiang(姜凤波) of.valid = clcf->open_file_cache_valid;
1533*3da8d17dSfengbojiang(姜凤波) of.min_uses = clcf->open_file_cache_min_uses;
1534*3da8d17dSfengbojiang(姜凤波) of.test_only = 1;
1535*3da8d17dSfengbojiang(姜凤波) of.errors = clcf->open_file_cache_errors;
1536*3da8d17dSfengbojiang(姜凤波) of.events = clcf->open_file_cache_events;
1537*3da8d17dSfengbojiang(姜凤波)
1538*3da8d17dSfengbojiang(姜凤波) if (ngx_http_set_disable_symlinks(r, clcf, &path, &of) != NGX_OK) {
1539*3da8d17dSfengbojiang(姜凤波) e->ip = ngx_http_script_exit;
1540*3da8d17dSfengbojiang(姜凤波) e->status = NGX_HTTP_INTERNAL_SERVER_ERROR;
1541*3da8d17dSfengbojiang(姜凤波) return;
1542*3da8d17dSfengbojiang(姜凤波) }
1543*3da8d17dSfengbojiang(姜凤波)
1544*3da8d17dSfengbojiang(姜凤波) if (ngx_open_cached_file(clcf->open_file_cache, &path, &of, r->pool)
1545*3da8d17dSfengbojiang(姜凤波) != NGX_OK)
1546*3da8d17dSfengbojiang(姜凤波) {
1547*3da8d17dSfengbojiang(姜凤波) if (of.err == 0) {
1548*3da8d17dSfengbojiang(姜凤波) e->ip = ngx_http_script_exit;
1549*3da8d17dSfengbojiang(姜凤波) e->status = NGX_HTTP_INTERNAL_SERVER_ERROR;
1550*3da8d17dSfengbojiang(姜凤波) return;
1551*3da8d17dSfengbojiang(姜凤波) }
1552*3da8d17dSfengbojiang(姜凤波)
1553*3da8d17dSfengbojiang(姜凤波) if (of.err != NGX_ENOENT
1554*3da8d17dSfengbojiang(姜凤波) && of.err != NGX_ENOTDIR
1555*3da8d17dSfengbojiang(姜凤波) && of.err != NGX_ENAMETOOLONG)
1556*3da8d17dSfengbojiang(姜凤波) {
1557*3da8d17dSfengbojiang(姜凤波) ngx_log_error(NGX_LOG_CRIT, r->connection->log, of.err,
1558*3da8d17dSfengbojiang(姜凤波) "%s \"%s\" failed", of.failed, value->data);
1559*3da8d17dSfengbojiang(姜凤波) }
1560*3da8d17dSfengbojiang(姜凤波)
1561*3da8d17dSfengbojiang(姜凤波) switch (code->op) {
1562*3da8d17dSfengbojiang(姜凤波)
1563*3da8d17dSfengbojiang(姜凤波) case ngx_http_script_file_plain:
1564*3da8d17dSfengbojiang(姜凤波) case ngx_http_script_file_dir:
1565*3da8d17dSfengbojiang(姜凤波) case ngx_http_script_file_exists:
1566*3da8d17dSfengbojiang(姜凤波) case ngx_http_script_file_exec:
1567*3da8d17dSfengbojiang(姜凤波) goto false_value;
1568*3da8d17dSfengbojiang(姜凤波)
1569*3da8d17dSfengbojiang(姜凤波) case ngx_http_script_file_not_plain:
1570*3da8d17dSfengbojiang(姜凤波) case ngx_http_script_file_not_dir:
1571*3da8d17dSfengbojiang(姜凤波) case ngx_http_script_file_not_exists:
1572*3da8d17dSfengbojiang(姜凤波) case ngx_http_script_file_not_exec:
1573*3da8d17dSfengbojiang(姜凤波) goto true_value;
1574*3da8d17dSfengbojiang(姜凤波) }
1575*3da8d17dSfengbojiang(姜凤波)
1576*3da8d17dSfengbojiang(姜凤波) goto false_value;
1577*3da8d17dSfengbojiang(姜凤波) }
1578*3da8d17dSfengbojiang(姜凤波)
1579*3da8d17dSfengbojiang(姜凤波) switch (code->op) {
1580*3da8d17dSfengbojiang(姜凤波) case ngx_http_script_file_plain:
1581*3da8d17dSfengbojiang(姜凤波) if (of.is_file) {
1582*3da8d17dSfengbojiang(姜凤波) goto true_value;
1583*3da8d17dSfengbojiang(姜凤波) }
1584*3da8d17dSfengbojiang(姜凤波) goto false_value;
1585*3da8d17dSfengbojiang(姜凤波)
1586*3da8d17dSfengbojiang(姜凤波) case ngx_http_script_file_not_plain:
1587*3da8d17dSfengbojiang(姜凤波) if (of.is_file) {
1588*3da8d17dSfengbojiang(姜凤波) goto false_value;
1589*3da8d17dSfengbojiang(姜凤波) }
1590*3da8d17dSfengbojiang(姜凤波) goto true_value;
1591*3da8d17dSfengbojiang(姜凤波)
1592*3da8d17dSfengbojiang(姜凤波) case ngx_http_script_file_dir:
1593*3da8d17dSfengbojiang(姜凤波) if (of.is_dir) {
1594*3da8d17dSfengbojiang(姜凤波) goto true_value;
1595*3da8d17dSfengbojiang(姜凤波) }
1596*3da8d17dSfengbojiang(姜凤波) goto false_value;
1597*3da8d17dSfengbojiang(姜凤波)
1598*3da8d17dSfengbojiang(姜凤波) case ngx_http_script_file_not_dir:
1599*3da8d17dSfengbojiang(姜凤波) if (of.is_dir) {
1600*3da8d17dSfengbojiang(姜凤波) goto false_value;
1601*3da8d17dSfengbojiang(姜凤波) }
1602*3da8d17dSfengbojiang(姜凤波) goto true_value;
1603*3da8d17dSfengbojiang(姜凤波)
1604*3da8d17dSfengbojiang(姜凤波) case ngx_http_script_file_exists:
1605*3da8d17dSfengbojiang(姜凤波) if (of.is_file || of.is_dir || of.is_link) {
1606*3da8d17dSfengbojiang(姜凤波) goto true_value;
1607*3da8d17dSfengbojiang(姜凤波) }
1608*3da8d17dSfengbojiang(姜凤波) goto false_value;
1609*3da8d17dSfengbojiang(姜凤波)
1610*3da8d17dSfengbojiang(姜凤波) case ngx_http_script_file_not_exists:
1611*3da8d17dSfengbojiang(姜凤波) if (of.is_file || of.is_dir || of.is_link) {
1612*3da8d17dSfengbojiang(姜凤波) goto false_value;
1613*3da8d17dSfengbojiang(姜凤波) }
1614*3da8d17dSfengbojiang(姜凤波) goto true_value;
1615*3da8d17dSfengbojiang(姜凤波)
1616*3da8d17dSfengbojiang(姜凤波) case ngx_http_script_file_exec:
1617*3da8d17dSfengbojiang(姜凤波) if (of.is_exec) {
1618*3da8d17dSfengbojiang(姜凤波) goto true_value;
1619*3da8d17dSfengbojiang(姜凤波) }
1620*3da8d17dSfengbojiang(姜凤波) goto false_value;
1621*3da8d17dSfengbojiang(姜凤波)
1622*3da8d17dSfengbojiang(姜凤波) case ngx_http_script_file_not_exec:
1623*3da8d17dSfengbojiang(姜凤波) if (of.is_exec) {
1624*3da8d17dSfengbojiang(姜凤波) goto false_value;
1625*3da8d17dSfengbojiang(姜凤波) }
1626*3da8d17dSfengbojiang(姜凤波) goto true_value;
1627*3da8d17dSfengbojiang(姜凤波) }
1628*3da8d17dSfengbojiang(姜凤波)
1629*3da8d17dSfengbojiang(姜凤波) false_value:
1630*3da8d17dSfengbojiang(姜凤波)
1631*3da8d17dSfengbojiang(姜凤波) ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
1632*3da8d17dSfengbojiang(姜凤波) "http script file op false");
1633*3da8d17dSfengbojiang(姜凤波)
1634*3da8d17dSfengbojiang(姜凤波) *value = ngx_http_variable_null_value;
1635*3da8d17dSfengbojiang(姜凤波) return;
1636*3da8d17dSfengbojiang(姜凤波)
1637*3da8d17dSfengbojiang(姜凤波) true_value:
1638*3da8d17dSfengbojiang(姜凤波)
1639*3da8d17dSfengbojiang(姜凤波) *value = ngx_http_variable_true_value;
1640*3da8d17dSfengbojiang(姜凤波) return;
1641*3da8d17dSfengbojiang(姜凤波) }
1642*3da8d17dSfengbojiang(姜凤波)
1643*3da8d17dSfengbojiang(姜凤波)
1644*3da8d17dSfengbojiang(姜凤波) void
ngx_http_script_complex_value_code(ngx_http_script_engine_t * e)1645*3da8d17dSfengbojiang(姜凤波) ngx_http_script_complex_value_code(ngx_http_script_engine_t *e)
1646*3da8d17dSfengbojiang(姜凤波) {
1647*3da8d17dSfengbojiang(姜凤波) size_t len;
1648*3da8d17dSfengbojiang(姜凤波) ngx_http_script_engine_t le;
1649*3da8d17dSfengbojiang(姜凤波) ngx_http_script_len_code_pt lcode;
1650*3da8d17dSfengbojiang(姜凤波) ngx_http_script_complex_value_code_t *code;
1651*3da8d17dSfengbojiang(姜凤波)
1652*3da8d17dSfengbojiang(姜凤波) code = (ngx_http_script_complex_value_code_t *) e->ip;
1653*3da8d17dSfengbojiang(姜凤波)
1654*3da8d17dSfengbojiang(姜凤波) e->ip += sizeof(ngx_http_script_complex_value_code_t);
1655*3da8d17dSfengbojiang(姜凤波)
1656*3da8d17dSfengbojiang(姜凤波) ngx_log_debug0(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0,
1657*3da8d17dSfengbojiang(姜凤波) "http script complex value");
1658*3da8d17dSfengbojiang(姜凤波)
1659*3da8d17dSfengbojiang(姜凤波) ngx_memzero(&le, sizeof(ngx_http_script_engine_t));
1660*3da8d17dSfengbojiang(姜凤波)
1661*3da8d17dSfengbojiang(姜凤波) le.ip = code->lengths->elts;
1662*3da8d17dSfengbojiang(姜凤波) le.line = e->line;
1663*3da8d17dSfengbojiang(姜凤波) le.request = e->request;
1664*3da8d17dSfengbojiang(姜凤波) le.quote = e->quote;
1665*3da8d17dSfengbojiang(姜凤波)
1666*3da8d17dSfengbojiang(姜凤波) for (len = 0; *(uintptr_t *) le.ip; len += lcode(&le)) {
1667*3da8d17dSfengbojiang(姜凤波) lcode = *(ngx_http_script_len_code_pt *) le.ip;
1668*3da8d17dSfengbojiang(姜凤波) }
1669*3da8d17dSfengbojiang(姜凤波)
1670*3da8d17dSfengbojiang(姜凤波) e->buf.len = len;
1671*3da8d17dSfengbojiang(姜凤波) e->buf.data = ngx_pnalloc(e->request->pool, len);
1672*3da8d17dSfengbojiang(姜凤波) if (e->buf.data == NULL) {
1673*3da8d17dSfengbojiang(姜凤波) e->ip = ngx_http_script_exit;
1674*3da8d17dSfengbojiang(姜凤波) e->status = NGX_HTTP_INTERNAL_SERVER_ERROR;
1675*3da8d17dSfengbojiang(姜凤波) return;
1676*3da8d17dSfengbojiang(姜凤波) }
1677*3da8d17dSfengbojiang(姜凤波)
1678*3da8d17dSfengbojiang(姜凤波) e->pos = e->buf.data;
1679*3da8d17dSfengbojiang(姜凤波)
1680*3da8d17dSfengbojiang(姜凤波) e->sp->len = e->buf.len;
1681*3da8d17dSfengbojiang(姜凤波) e->sp->data = e->buf.data;
1682*3da8d17dSfengbojiang(姜凤波) e->sp++;
1683*3da8d17dSfengbojiang(姜凤波) }
1684*3da8d17dSfengbojiang(姜凤波)
1685*3da8d17dSfengbojiang(姜凤波)
1686*3da8d17dSfengbojiang(姜凤波) void
ngx_http_script_value_code(ngx_http_script_engine_t * e)1687*3da8d17dSfengbojiang(姜凤波) ngx_http_script_value_code(ngx_http_script_engine_t *e)
1688*3da8d17dSfengbojiang(姜凤波) {
1689*3da8d17dSfengbojiang(姜凤波) ngx_http_script_value_code_t *code;
1690*3da8d17dSfengbojiang(姜凤波)
1691*3da8d17dSfengbojiang(姜凤波) code = (ngx_http_script_value_code_t *) e->ip;
1692*3da8d17dSfengbojiang(姜凤波)
1693*3da8d17dSfengbojiang(姜凤波) e->ip += sizeof(ngx_http_script_value_code_t);
1694*3da8d17dSfengbojiang(姜凤波)
1695*3da8d17dSfengbojiang(姜凤波) e->sp->len = code->text_len;
1696*3da8d17dSfengbojiang(姜凤波) e->sp->data = (u_char *) code->text_data;
1697*3da8d17dSfengbojiang(姜凤波)
1698*3da8d17dSfengbojiang(姜凤波) ngx_log_debug1(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0,
1699*3da8d17dSfengbojiang(姜凤波) "http script value: \"%v\"", e->sp);
1700*3da8d17dSfengbojiang(姜凤波)
1701*3da8d17dSfengbojiang(姜凤波) e->sp++;
1702*3da8d17dSfengbojiang(姜凤波) }
1703*3da8d17dSfengbojiang(姜凤波)
1704*3da8d17dSfengbojiang(姜凤波)
1705*3da8d17dSfengbojiang(姜凤波) void
ngx_http_script_set_var_code(ngx_http_script_engine_t * e)1706*3da8d17dSfengbojiang(姜凤波) ngx_http_script_set_var_code(ngx_http_script_engine_t *e)
1707*3da8d17dSfengbojiang(姜凤波) {
1708*3da8d17dSfengbojiang(姜凤波) ngx_http_request_t *r;
1709*3da8d17dSfengbojiang(姜凤波) ngx_http_script_var_code_t *code;
1710*3da8d17dSfengbojiang(姜凤波)
1711*3da8d17dSfengbojiang(姜凤波) code = (ngx_http_script_var_code_t *) e->ip;
1712*3da8d17dSfengbojiang(姜凤波)
1713*3da8d17dSfengbojiang(姜凤波) e->ip += sizeof(ngx_http_script_var_code_t);
1714*3da8d17dSfengbojiang(姜凤波)
1715*3da8d17dSfengbojiang(姜凤波) r = e->request;
1716*3da8d17dSfengbojiang(姜凤波)
1717*3da8d17dSfengbojiang(姜凤波) e->sp--;
1718*3da8d17dSfengbojiang(姜凤波)
1719*3da8d17dSfengbojiang(姜凤波) r->variables[code->index].len = e->sp->len;
1720*3da8d17dSfengbojiang(姜凤波) r->variables[code->index].valid = 1;
1721*3da8d17dSfengbojiang(姜凤波) r->variables[code->index].no_cacheable = 0;
1722*3da8d17dSfengbojiang(姜凤波) r->variables[code->index].not_found = 0;
1723*3da8d17dSfengbojiang(姜凤波) r->variables[code->index].data = e->sp->data;
1724*3da8d17dSfengbojiang(姜凤波)
1725*3da8d17dSfengbojiang(姜凤波) #if (NGX_DEBUG)
1726*3da8d17dSfengbojiang(姜凤波) {
1727*3da8d17dSfengbojiang(姜凤波) ngx_http_variable_t *v;
1728*3da8d17dSfengbojiang(姜凤波) ngx_http_core_main_conf_t *cmcf;
1729*3da8d17dSfengbojiang(姜凤波)
1730*3da8d17dSfengbojiang(姜凤波) cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);
1731*3da8d17dSfengbojiang(姜凤波)
1732*3da8d17dSfengbojiang(姜凤波) v = cmcf->variables.elts;
1733*3da8d17dSfengbojiang(姜凤波)
1734*3da8d17dSfengbojiang(姜凤波) ngx_log_debug1(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0,
1735*3da8d17dSfengbojiang(姜凤波) "http script set $%V", &v[code->index].name);
1736*3da8d17dSfengbojiang(姜凤波) }
1737*3da8d17dSfengbojiang(姜凤波) #endif
1738*3da8d17dSfengbojiang(姜凤波) }
1739*3da8d17dSfengbojiang(姜凤波)
1740*3da8d17dSfengbojiang(姜凤波)
1741*3da8d17dSfengbojiang(姜凤波) void
ngx_http_script_var_set_handler_code(ngx_http_script_engine_t * e)1742*3da8d17dSfengbojiang(姜凤波) ngx_http_script_var_set_handler_code(ngx_http_script_engine_t *e)
1743*3da8d17dSfengbojiang(姜凤波) {
1744*3da8d17dSfengbojiang(姜凤波) ngx_http_script_var_handler_code_t *code;
1745*3da8d17dSfengbojiang(姜凤波)
1746*3da8d17dSfengbojiang(姜凤波) ngx_log_debug0(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0,
1747*3da8d17dSfengbojiang(姜凤波) "http script set var handler");
1748*3da8d17dSfengbojiang(姜凤波)
1749*3da8d17dSfengbojiang(姜凤波) code = (ngx_http_script_var_handler_code_t *) e->ip;
1750*3da8d17dSfengbojiang(姜凤波)
1751*3da8d17dSfengbojiang(姜凤波) e->ip += sizeof(ngx_http_script_var_handler_code_t);
1752*3da8d17dSfengbojiang(姜凤波)
1753*3da8d17dSfengbojiang(姜凤波) e->sp--;
1754*3da8d17dSfengbojiang(姜凤波)
1755*3da8d17dSfengbojiang(姜凤波) code->handler(e->request, e->sp, code->data);
1756*3da8d17dSfengbojiang(姜凤波) }
1757*3da8d17dSfengbojiang(姜凤波)
1758*3da8d17dSfengbojiang(姜凤波)
1759*3da8d17dSfengbojiang(姜凤波) void
ngx_http_script_var_code(ngx_http_script_engine_t * e)1760*3da8d17dSfengbojiang(姜凤波) ngx_http_script_var_code(ngx_http_script_engine_t *e)
1761*3da8d17dSfengbojiang(姜凤波) {
1762*3da8d17dSfengbojiang(姜凤波) ngx_http_variable_value_t *value;
1763*3da8d17dSfengbojiang(姜凤波) ngx_http_script_var_code_t *code;
1764*3da8d17dSfengbojiang(姜凤波)
1765*3da8d17dSfengbojiang(姜凤波) ngx_log_debug0(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0,
1766*3da8d17dSfengbojiang(姜凤波) "http script var");
1767*3da8d17dSfengbojiang(姜凤波)
1768*3da8d17dSfengbojiang(姜凤波) code = (ngx_http_script_var_code_t *) e->ip;
1769*3da8d17dSfengbojiang(姜凤波)
1770*3da8d17dSfengbojiang(姜凤波) e->ip += sizeof(ngx_http_script_var_code_t);
1771*3da8d17dSfengbojiang(姜凤波)
1772*3da8d17dSfengbojiang(姜凤波) value = ngx_http_get_flushed_variable(e->request, code->index);
1773*3da8d17dSfengbojiang(姜凤波)
1774*3da8d17dSfengbojiang(姜凤波) if (value && !value->not_found) {
1775*3da8d17dSfengbojiang(姜凤波) ngx_log_debug1(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0,
1776*3da8d17dSfengbojiang(姜凤波) "http script var: \"%v\"", value);
1777*3da8d17dSfengbojiang(姜凤波)
1778*3da8d17dSfengbojiang(姜凤波) *e->sp = *value;
1779*3da8d17dSfengbojiang(姜凤波) e->sp++;
1780*3da8d17dSfengbojiang(姜凤波)
1781*3da8d17dSfengbojiang(姜凤波) return;
1782*3da8d17dSfengbojiang(姜凤波) }
1783*3da8d17dSfengbojiang(姜凤波)
1784*3da8d17dSfengbojiang(姜凤波) *e->sp = ngx_http_variable_null_value;
1785*3da8d17dSfengbojiang(姜凤波) e->sp++;
1786*3da8d17dSfengbojiang(姜凤波) }
1787*3da8d17dSfengbojiang(姜凤波)
1788*3da8d17dSfengbojiang(姜凤波)
1789*3da8d17dSfengbojiang(姜凤波) void
ngx_http_script_nop_code(ngx_http_script_engine_t * e)1790*3da8d17dSfengbojiang(姜凤波) ngx_http_script_nop_code(ngx_http_script_engine_t *e)
1791*3da8d17dSfengbojiang(姜凤波) {
1792*3da8d17dSfengbojiang(姜凤波) e->ip += sizeof(uintptr_t);
1793*3da8d17dSfengbojiang(姜凤波) }
1794