1 
2 /*
3  * Copyright (C) Igor Sysoev
4  * Copyright (C) Nginx, Inc.
5  */
6 
7 
8 #ifndef _NGX_HTTP_SCRIPT_H_INCLUDED_
9 #define _NGX_HTTP_SCRIPT_H_INCLUDED_
10 
11 
12 #include <ngx_config.h>
13 #include <ngx_core.h>
14 #include <ngx_http.h>
15 
16 
17 typedef struct {
18     u_char                     *ip;
19     u_char                     *pos;
20     ngx_http_variable_value_t  *sp;
21 
22     ngx_str_t                   buf;
23     ngx_str_t                   line;
24 
25     /* the start of the rewritten arguments */
26     u_char                     *args;
27 
28     unsigned                    flushed:1;
29     unsigned                    skip:1;
30     unsigned                    quote:1;
31     unsigned                    is_args:1;
32     unsigned                    log:1;
33 
34     ngx_int_t                   status;
35     ngx_http_request_t         *request;
36 } ngx_http_script_engine_t;
37 
38 
39 typedef struct {
40     ngx_conf_t                 *cf;
41     ngx_str_t                  *source;
42 
43     ngx_array_t               **flushes;
44     ngx_array_t               **lengths;
45     ngx_array_t               **values;
46 
47     ngx_uint_t                  variables;
48     ngx_uint_t                  ncaptures;
49     ngx_uint_t                  captures_mask;
50     ngx_uint_t                  size;
51 
52     void                       *main;
53 
54     unsigned                    compile_args:1;
55     unsigned                    complete_lengths:1;
56     unsigned                    complete_values:1;
57     unsigned                    zero:1;
58     unsigned                    conf_prefix:1;
59     unsigned                    root_prefix:1;
60 
61     unsigned                    dup_capture:1;
62     unsigned                    args:1;
63 } ngx_http_script_compile_t;
64 
65 
66 typedef struct {
67     ngx_str_t                   value;
68     ngx_uint_t                 *flushes;
69     void                       *lengths;
70     void                       *values;
71 } ngx_http_complex_value_t;
72 
73 
74 typedef struct {
75     ngx_conf_t                 *cf;
76     ngx_str_t                  *value;
77     ngx_http_complex_value_t   *complex_value;
78 
79     unsigned                    zero:1;
80     unsigned                    conf_prefix:1;
81     unsigned                    root_prefix:1;
82 } ngx_http_compile_complex_value_t;
83 
84 
85 typedef void (*ngx_http_script_code_pt) (ngx_http_script_engine_t *e);
86 typedef size_t (*ngx_http_script_len_code_pt) (ngx_http_script_engine_t *e);
87 
88 
89 typedef struct {
90     ngx_http_script_code_pt     code;
91     uintptr_t                   len;
92 } ngx_http_script_copy_code_t;
93 
94 
95 typedef struct {
96     ngx_http_script_code_pt     code;
97     uintptr_t                   index;
98 } ngx_http_script_var_code_t;
99 
100 
101 typedef struct {
102     ngx_http_script_code_pt     code;
103     ngx_http_set_variable_pt    handler;
104     uintptr_t                   data;
105 } ngx_http_script_var_handler_code_t;
106 
107 
108 typedef struct {
109     ngx_http_script_code_pt     code;
110     uintptr_t                   n;
111 } ngx_http_script_copy_capture_code_t;
112 
113 
114 #if (NGX_PCRE)
115 
116 typedef struct {
117     ngx_http_script_code_pt     code;
118     ngx_http_regex_t           *regex;
119     ngx_array_t                *lengths;
120     uintptr_t                   size;
121     uintptr_t                   status;
122     uintptr_t                   next;
123 
124     unsigned                    test:1;
125     unsigned                    negative_test:1;
126     unsigned                    uri:1;
127     unsigned                    args:1;
128 
129     /* add the r->args to the new arguments */
130     unsigned                    add_args:1;
131 
132     unsigned                    redirect:1;
133     unsigned                    break_cycle:1;
134 
135     ngx_str_t                   name;
136 } ngx_http_script_regex_code_t;
137 
138 
139 typedef struct {
140     ngx_http_script_code_pt     code;
141 
142     unsigned                    uri:1;
143     unsigned                    args:1;
144 
145     /* add the r->args to the new arguments */
146     unsigned                    add_args:1;
147 
148     unsigned                    redirect:1;
149 } ngx_http_script_regex_end_code_t;
150 
151 #endif
152 
153 
154 typedef struct {
155     ngx_http_script_code_pt     code;
156     uintptr_t                   conf_prefix;
157 } ngx_http_script_full_name_code_t;
158 
159 
160 typedef struct {
161     ngx_http_script_code_pt     code;
162     uintptr_t                   status;
163     ngx_http_complex_value_t    text;
164 } ngx_http_script_return_code_t;
165 
166 
167 typedef enum {
168     ngx_http_script_file_plain = 0,
169     ngx_http_script_file_not_plain,
170     ngx_http_script_file_dir,
171     ngx_http_script_file_not_dir,
172     ngx_http_script_file_exists,
173     ngx_http_script_file_not_exists,
174     ngx_http_script_file_exec,
175     ngx_http_script_file_not_exec
176 } ngx_http_script_file_op_e;
177 
178 
179 typedef struct {
180     ngx_http_script_code_pt     code;
181     uintptr_t                   op;
182 } ngx_http_script_file_code_t;
183 
184 
185 typedef struct {
186     ngx_http_script_code_pt     code;
187     uintptr_t                   next;
188     void                      **loc_conf;
189 } ngx_http_script_if_code_t;
190 
191 
192 typedef struct {
193     ngx_http_script_code_pt     code;
194     ngx_array_t                *lengths;
195 } ngx_http_script_complex_value_code_t;
196 
197 
198 typedef struct {
199     ngx_http_script_code_pt     code;
200     uintptr_t                   value;
201     uintptr_t                   text_len;
202     uintptr_t                   text_data;
203 } ngx_http_script_value_code_t;
204 
205 
206 void ngx_http_script_flush_complex_value(ngx_http_request_t *r,
207     ngx_http_complex_value_t *val);
208 ngx_int_t ngx_http_complex_value(ngx_http_request_t *r,
209     ngx_http_complex_value_t *val, ngx_str_t *value);
210 ngx_int_t ngx_http_compile_complex_value(ngx_http_compile_complex_value_t *ccv);
211 char *ngx_http_set_complex_value_slot(ngx_conf_t *cf, ngx_command_t *cmd,
212     void *conf);
213 
214 
215 ngx_int_t ngx_http_test_predicates(ngx_http_request_t *r,
216     ngx_array_t *predicates);
217 ngx_int_t ngx_http_test_required_predicates(ngx_http_request_t *r,
218     ngx_array_t *predicates);
219 char *ngx_http_set_predicate_slot(ngx_conf_t *cf, ngx_command_t *cmd,
220     void *conf);
221 
222 ngx_uint_t ngx_http_script_variables_count(ngx_str_t *value);
223 ngx_int_t ngx_http_script_compile(ngx_http_script_compile_t *sc);
224 u_char *ngx_http_script_run(ngx_http_request_t *r, ngx_str_t *value,
225     void *code_lengths, size_t reserved, void *code_values);
226 void ngx_http_script_flush_no_cacheable_variables(ngx_http_request_t *r,
227     ngx_array_t *indices);
228 
229 void *ngx_http_script_start_code(ngx_pool_t *pool, ngx_array_t **codes,
230     size_t size);
231 void *ngx_http_script_add_code(ngx_array_t *codes, size_t size, void *code);
232 
233 size_t ngx_http_script_copy_len_code(ngx_http_script_engine_t *e);
234 void ngx_http_script_copy_code(ngx_http_script_engine_t *e);
235 size_t ngx_http_script_copy_var_len_code(ngx_http_script_engine_t *e);
236 void ngx_http_script_copy_var_code(ngx_http_script_engine_t *e);
237 size_t ngx_http_script_copy_capture_len_code(ngx_http_script_engine_t *e);
238 void ngx_http_script_copy_capture_code(ngx_http_script_engine_t *e);
239 size_t ngx_http_script_mark_args_code(ngx_http_script_engine_t *e);
240 void ngx_http_script_start_args_code(ngx_http_script_engine_t *e);
241 #if (NGX_PCRE)
242 void ngx_http_script_regex_start_code(ngx_http_script_engine_t *e);
243 void ngx_http_script_regex_end_code(ngx_http_script_engine_t *e);
244 #endif
245 void ngx_http_script_return_code(ngx_http_script_engine_t *e);
246 void ngx_http_script_break_code(ngx_http_script_engine_t *e);
247 void ngx_http_script_if_code(ngx_http_script_engine_t *e);
248 void ngx_http_script_equal_code(ngx_http_script_engine_t *e);
249 void ngx_http_script_not_equal_code(ngx_http_script_engine_t *e);
250 void ngx_http_script_file_code(ngx_http_script_engine_t *e);
251 void ngx_http_script_complex_value_code(ngx_http_script_engine_t *e);
252 void ngx_http_script_value_code(ngx_http_script_engine_t *e);
253 void ngx_http_script_set_var_code(ngx_http_script_engine_t *e);
254 void ngx_http_script_var_set_handler_code(ngx_http_script_engine_t *e);
255 void ngx_http_script_var_code(ngx_http_script_engine_t *e);
256 void ngx_http_script_nop_code(ngx_http_script_engine_t *e);
257 
258 
259 #endif /* _NGX_HTTP_SCRIPT_H_INCLUDED_ */
260