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