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