Igor Sysoev | d90282d | 2004-09-28 08:34:51 +0000 | [diff] [blame] | 1 | |
| 2 | /* |
Igor Sysoev | ff8da91 | 2004-09-29 16:00:49 +0000 | [diff] [blame] | 3 | * Copyright (C) Igor Sysoev |
Igor Sysoev | d90282d | 2004-09-28 08:34:51 +0000 | [diff] [blame] | 4 | */ |
| 5 | |
| 6 | |
Igor Sysoev | 7578ec9 | 2003-06-02 15:24:30 +0000 | [diff] [blame] | 7 | #ifndef _NGX_HTTP_SCRIPT_H_INCLUDED_ |
| 8 | #define _NGX_HTTP_SCRIPT_H_INCLUDED_ |
| 9 | |
| 10 | |
Igor Sysoev | 02025fd | 2005-01-18 13:03:58 +0000 | [diff] [blame] | 11 | #include <ngx_config.h> |
| 12 | #include <ngx_core.h> |
| 13 | #include <ngx_http.h> |
| 14 | |
| 15 | |
Igor Sysoev | 02f742b | 2005-04-08 15:18:55 +0000 | [diff] [blame] | 16 | typedef struct { |
Igor Sysoev | 09c684b | 2005-11-09 17:25:55 +0000 | [diff] [blame] | 17 | u_char *ip; |
| 18 | u_char *pos; |
| 19 | ngx_http_variable_value_t *sp; |
Igor Sysoev | 899b44e | 2005-05-12 14:58:06 +0000 | [diff] [blame] | 20 | |
Igor Sysoev | 09c684b | 2005-11-09 17:25:55 +0000 | [diff] [blame] | 21 | ngx_str_t buf; |
| 22 | ngx_str_t line; |
Igor Sysoev | 899b44e | 2005-05-12 14:58:06 +0000 | [diff] [blame] | 23 | |
| 24 | /* the start of the rewritten arguments */ |
Igor Sysoev | 09c684b | 2005-11-09 17:25:55 +0000 | [diff] [blame] | 25 | u_char *args; |
Igor Sysoev | 899b44e | 2005-05-12 14:58:06 +0000 | [diff] [blame] | 26 | |
Igor Sysoev | 09c684b | 2005-11-09 17:25:55 +0000 | [diff] [blame] | 27 | unsigned flushed:1; |
| 28 | unsigned skip:1; |
| 29 | unsigned quote:1; |
Igor Sysoev | 04610ea | 2008-02-12 18:05:32 +0000 | [diff] [blame] | 30 | unsigned is_args:1; |
Igor Sysoev | 09c684b | 2005-11-09 17:25:55 +0000 | [diff] [blame] | 31 | unsigned log:1; |
Igor Sysoev | 899b44e | 2005-05-12 14:58:06 +0000 | [diff] [blame] | 32 | |
Igor Sysoev | 09c684b | 2005-11-09 17:25:55 +0000 | [diff] [blame] | 33 | ngx_int_t status; |
| 34 | ngx_http_request_t *request; |
Igor Sysoev | 02f742b | 2005-04-08 15:18:55 +0000 | [diff] [blame] | 35 | } ngx_http_script_engine_t; |
| 36 | |
| 37 | |
Igor Sysoev | 899b44e | 2005-05-12 14:58:06 +0000 | [diff] [blame] | 38 | typedef struct { |
Igor Sysoev | 09c684b | 2005-11-09 17:25:55 +0000 | [diff] [blame] | 39 | ngx_conf_t *cf; |
| 40 | ngx_str_t *source; |
Igor Sysoev | 02f742b | 2005-04-08 15:18:55 +0000 | [diff] [blame] | 41 | |
Igor Sysoev | 09c684b | 2005-11-09 17:25:55 +0000 | [diff] [blame] | 42 | ngx_array_t **flushes; |
| 43 | ngx_array_t **lengths; |
| 44 | ngx_array_t **values; |
Igor Sysoev | 899b44e | 2005-05-12 14:58:06 +0000 | [diff] [blame] | 45 | |
Igor Sysoev | 09c684b | 2005-11-09 17:25:55 +0000 | [diff] [blame] | 46 | ngx_uint_t variables; |
| 47 | ngx_uint_t ncaptures; |
Igor Sysoev | 7f7846d | 2006-04-26 09:52:47 +0000 | [diff] [blame] | 48 | ngx_uint_t captures_mask; |
Igor Sysoev | 09c684b | 2005-11-09 17:25:55 +0000 | [diff] [blame] | 49 | ngx_uint_t size; |
Igor Sysoev | 899b44e | 2005-05-12 14:58:06 +0000 | [diff] [blame] | 50 | |
Igor Sysoev | 09c684b | 2005-11-09 17:25:55 +0000 | [diff] [blame] | 51 | void *main; |
Igor Sysoev | 899b44e | 2005-05-12 14:58:06 +0000 | [diff] [blame] | 52 | |
Igor Sysoev | 09c684b | 2005-11-09 17:25:55 +0000 | [diff] [blame] | 53 | unsigned compile_args:1; |
Igor Sysoev | 09c684b | 2005-11-09 17:25:55 +0000 | [diff] [blame] | 54 | unsigned complete_lengths:1; |
| 55 | unsigned complete_values:1; |
Igor Sysoev | 8508c10 | 2009-03-22 09:36:51 +0000 | [diff] [blame] | 56 | unsigned zero:1; |
| 57 | unsigned conf_prefix:1; |
| 58 | unsigned root_prefix:1; |
Igor Sysoev | 09c684b | 2005-11-09 17:25:55 +0000 | [diff] [blame] | 59 | |
Igor Sysoev | 8508c10 | 2009-03-22 09:36:51 +0000 | [diff] [blame] | 60 | unsigned dup_capture:1; |
Igor Sysoev | 09c684b | 2005-11-09 17:25:55 +0000 | [diff] [blame] | 61 | unsigned args:1; |
Igor Sysoev | 899b44e | 2005-05-12 14:58:06 +0000 | [diff] [blame] | 62 | } ngx_http_script_compile_t; |
| 63 | |
| 64 | |
Igor Sysoev | 8508c10 | 2009-03-22 09:36:51 +0000 | [diff] [blame] | 65 | typedef struct { |
| 66 | ngx_str_t value; |
| 67 | ngx_uint_t *flushes; |
| 68 | void *lengths; |
| 69 | void *values; |
| 70 | } ngx_http_complex_value_t; |
| 71 | |
| 72 | |
| 73 | typedef struct { |
| 74 | ngx_conf_t *cf; |
| 75 | ngx_str_t *value; |
| 76 | ngx_http_complex_value_t *complex_value; |
| 77 | |
| 78 | unsigned zero:1; |
| 79 | unsigned conf_prefix:1; |
| 80 | unsigned root_prefix:1; |
| 81 | } ngx_http_compile_complex_value_t; |
| 82 | |
| 83 | |
Igor Sysoev | 899b44e | 2005-05-12 14:58:06 +0000 | [diff] [blame] | 84 | typedef void (*ngx_http_script_code_pt) (ngx_http_script_engine_t *e); |
| 85 | typedef size_t (*ngx_http_script_len_code_pt) (ngx_http_script_engine_t *e); |
Igor Sysoev | 02f742b | 2005-04-08 15:18:55 +0000 | [diff] [blame] | 86 | |
| 87 | |
| 88 | typedef struct { |
Igor Sysoev | 8508c10 | 2009-03-22 09:36:51 +0000 | [diff] [blame] | 89 | ngx_http_script_code_pt code; |
| 90 | uintptr_t len; |
Igor Sysoev | 02f742b | 2005-04-08 15:18:55 +0000 | [diff] [blame] | 91 | } ngx_http_script_copy_code_t; |
| 92 | |
| 93 | |
| 94 | typedef struct { |
Igor Sysoev | 8508c10 | 2009-03-22 09:36:51 +0000 | [diff] [blame] | 95 | ngx_http_script_code_pt code; |
| 96 | uintptr_t index; |
Igor Sysoev | 02f742b | 2005-04-08 15:18:55 +0000 | [diff] [blame] | 97 | } ngx_http_script_var_code_t; |
| 98 | |
| 99 | |
Igor Sysoev | 899b44e | 2005-05-12 14:58:06 +0000 | [diff] [blame] | 100 | typedef struct { |
Igor Sysoev | 8508c10 | 2009-03-22 09:36:51 +0000 | [diff] [blame] | 101 | ngx_http_script_code_pt code; |
| 102 | ngx_http_set_variable_pt handler; |
| 103 | uintptr_t data; |
Igor Sysoev | 7bdb720 | 2006-04-19 15:30:56 +0000 | [diff] [blame] | 104 | } ngx_http_script_var_handler_code_t; |
| 105 | |
| 106 | |
| 107 | typedef struct { |
Igor Sysoev | 8508c10 | 2009-03-22 09:36:51 +0000 | [diff] [blame] | 108 | ngx_http_script_code_pt code; |
| 109 | uintptr_t n; |
Igor Sysoev | 899b44e | 2005-05-12 14:58:06 +0000 | [diff] [blame] | 110 | } ngx_http_script_copy_capture_code_t; |
Igor Sysoev | 02f742b | 2005-04-08 15:18:55 +0000 | [diff] [blame] | 111 | |
| 112 | |
Igor Sysoev | 4959ec4 | 2005-05-23 12:07:45 +0000 | [diff] [blame] | 113 | #if (NGX_PCRE) |
| 114 | |
Igor Sysoev | 899b44e | 2005-05-12 14:58:06 +0000 | [diff] [blame] | 115 | typedef struct { |
Igor Sysoev | 8508c10 | 2009-03-22 09:36:51 +0000 | [diff] [blame] | 116 | ngx_http_script_code_pt code; |
| 117 | ngx_regex_t *regex; |
| 118 | ngx_array_t *lengths; |
| 119 | uintptr_t size; |
| 120 | uintptr_t ncaptures; |
| 121 | uintptr_t status; |
| 122 | uintptr_t next; |
Igor Sysoev | 899b44e | 2005-05-12 14:58:06 +0000 | [diff] [blame] | 123 | |
Igor Sysoev | 8508c10 | 2009-03-22 09:36:51 +0000 | [diff] [blame] | 124 | uintptr_t test:1; |
| 125 | uintptr_t negative_test:1; |
| 126 | uintptr_t uri:1; |
| 127 | uintptr_t args:1; |
Igor Sysoev | 899b44e | 2005-05-12 14:58:06 +0000 | [diff] [blame] | 128 | |
| 129 | /* add the r->args to the new arguments */ |
Igor Sysoev | 8508c10 | 2009-03-22 09:36:51 +0000 | [diff] [blame] | 130 | uintptr_t add_args:1; |
Igor Sysoev | 0e5dc5c | 2005-11-15 13:30:52 +0000 | [diff] [blame] | 131 | |
Igor Sysoev | 8508c10 | 2009-03-22 09:36:51 +0000 | [diff] [blame] | 132 | uintptr_t redirect:1; |
| 133 | uintptr_t break_cycle:1; |
Igor Sysoev | 899b44e | 2005-05-12 14:58:06 +0000 | [diff] [blame] | 134 | |
Igor Sysoev | 8508c10 | 2009-03-22 09:36:51 +0000 | [diff] [blame] | 135 | ngx_str_t name; |
Igor Sysoev | 899b44e | 2005-05-12 14:58:06 +0000 | [diff] [blame] | 136 | } ngx_http_script_regex_code_t; |
| 137 | |
| 138 | |
| 139 | typedef struct { |
Igor Sysoev | 8508c10 | 2009-03-22 09:36:51 +0000 | [diff] [blame] | 140 | ngx_http_script_code_pt code; |
Igor Sysoev | 899b44e | 2005-05-12 14:58:06 +0000 | [diff] [blame] | 141 | |
Igor Sysoev | 8508c10 | 2009-03-22 09:36:51 +0000 | [diff] [blame] | 142 | uintptr_t uri:1; |
| 143 | uintptr_t args:1; |
Igor Sysoev | 899b44e | 2005-05-12 14:58:06 +0000 | [diff] [blame] | 144 | |
| 145 | /* add the r->args to the new arguments */ |
Igor Sysoev | 8508c10 | 2009-03-22 09:36:51 +0000 | [diff] [blame] | 146 | uintptr_t add_args:1; |
Igor Sysoev | 899b44e | 2005-05-12 14:58:06 +0000 | [diff] [blame] | 147 | |
Igor Sysoev | 8508c10 | 2009-03-22 09:36:51 +0000 | [diff] [blame] | 148 | uintptr_t redirect:1; |
Igor Sysoev | 899b44e | 2005-05-12 14:58:06 +0000 | [diff] [blame] | 149 | } ngx_http_script_regex_end_code_t; |
| 150 | |
Igor Sysoev | 4959ec4 | 2005-05-23 12:07:45 +0000 | [diff] [blame] | 151 | #endif |
| 152 | |
Igor Sysoev | 899b44e | 2005-05-12 14:58:06 +0000 | [diff] [blame] | 153 | |
| 154 | typedef struct { |
Igor Sysoev | 8508c10 | 2009-03-22 09:36:51 +0000 | [diff] [blame] | 155 | ngx_http_script_code_pt code; |
| 156 | uintptr_t 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 | uintptr_t null; |
Igor Sysoev | 899b44e | 2005-05-12 14:58:06 +0000 | [diff] [blame] | 164 | } ngx_http_script_return_code_t; |
| 165 | |
| 166 | |
Igor Sysoev | 94e32ce | 2006-04-07 14:08:04 +0000 | [diff] [blame] | 167 | typedef enum { |
| 168 | ngx_http_script_file_plain = 0, |
Igor Sysoev | b71c690 | 2006-08-04 16:04:04 +0000 | [diff] [blame] | 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 |
Igor Sysoev | 94e32ce | 2006-04-07 14:08:04 +0000 | [diff] [blame] | 176 | } ngx_http_script_file_op_e; |
| 177 | |
| 178 | |
| 179 | typedef struct { |
Igor Sysoev | 8508c10 | 2009-03-22 09:36:51 +0000 | [diff] [blame] | 180 | ngx_http_script_code_pt code; |
| 181 | uintptr_t op; |
Igor Sysoev | 94e32ce | 2006-04-07 14:08:04 +0000 | [diff] [blame] | 182 | } ngx_http_script_file_code_t; |
| 183 | |
| 184 | |
Igor Sysoev | 899b44e | 2005-05-12 14:58:06 +0000 | [diff] [blame] | 185 | typedef struct { |
Igor Sysoev | 8508c10 | 2009-03-22 09:36:51 +0000 | [diff] [blame] | 186 | ngx_http_script_code_pt code; |
| 187 | uintptr_t next; |
| 188 | void **loc_conf; |
Igor Sysoev | 899b44e | 2005-05-12 14:58:06 +0000 | [diff] [blame] | 189 | } ngx_http_script_if_code_t; |
| 190 | |
| 191 | |
| 192 | typedef struct { |
Igor Sysoev | 8508c10 | 2009-03-22 09:36:51 +0000 | [diff] [blame] | 193 | ngx_http_script_code_pt code; |
| 194 | ngx_array_t *lengths; |
Igor Sysoev | e31e90b | 2005-05-19 13:25:22 +0000 | [diff] [blame] | 195 | } ngx_http_script_complex_value_code_t; |
| 196 | |
| 197 | |
| 198 | typedef struct { |
Igor Sysoev | 8508c10 | 2009-03-22 09:36:51 +0000 | [diff] [blame] | 199 | ngx_http_script_code_pt code; |
| 200 | uintptr_t value; |
| 201 | uintptr_t text_len; |
| 202 | uintptr_t text_data; |
Igor Sysoev | 899b44e | 2005-05-12 14:58:06 +0000 | [diff] [blame] | 203 | } ngx_http_script_value_code_t; |
| 204 | |
| 205 | |
Igor Sysoev | 8508c10 | 2009-03-22 09:36:51 +0000 | [diff] [blame] | 206 | void ngx_http_scrip_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 | |
Igor Sysoev | 899b44e | 2005-05-12 14:58:06 +0000 | [diff] [blame] | 212 | ngx_uint_t ngx_http_script_variables_count(ngx_str_t *value); |
| 213 | ngx_int_t ngx_http_script_compile(ngx_http_script_compile_t *sc); |
Igor Sysoev | 8fea885 | 2006-03-15 09:53:04 +0000 | [diff] [blame] | 214 | u_char *ngx_http_script_run(ngx_http_request_t *r, ngx_str_t *value, |
| 215 | void *code_lengths, size_t reserved, void *code_values); |
Igor Sysoev | 2d3f3f6 | 2007-10-14 18:56:15 +0000 | [diff] [blame] | 216 | void ngx_http_script_flush_no_cacheable_variables(ngx_http_request_t *r, |
Igor Sysoev | 09c684b | 2005-11-09 17:25:55 +0000 | [diff] [blame] | 217 | ngx_array_t *indices); |
Igor Sysoev | 899b44e | 2005-05-12 14:58:06 +0000 | [diff] [blame] | 218 | |
| 219 | void *ngx_http_script_start_code(ngx_pool_t *pool, ngx_array_t **codes, |
Igor Sysoev | 02f742b | 2005-04-08 15:18:55 +0000 | [diff] [blame] | 220 | size_t size); |
Igor Sysoev | 899b44e | 2005-05-12 14:58:06 +0000 | [diff] [blame] | 221 | void *ngx_http_script_add_code(ngx_array_t *codes, size_t size, void *code); |
Igor Sysoev | 02f742b | 2005-04-08 15:18:55 +0000 | [diff] [blame] | 222 | |
Igor Sysoev | 899b44e | 2005-05-12 14:58:06 +0000 | [diff] [blame] | 223 | size_t ngx_http_script_copy_len_code(ngx_http_script_engine_t *e); |
| 224 | void ngx_http_script_copy_code(ngx_http_script_engine_t *e); |
| 225 | size_t ngx_http_script_copy_var_len_code(ngx_http_script_engine_t *e); |
| 226 | void ngx_http_script_copy_var_code(ngx_http_script_engine_t *e); |
| 227 | size_t ngx_http_script_copy_capture_len_code(ngx_http_script_engine_t *e); |
| 228 | void ngx_http_script_copy_capture_code(ngx_http_script_engine_t *e); |
Igor Sysoev | 04610ea | 2008-02-12 18:05:32 +0000 | [diff] [blame] | 229 | size_t ngx_http_script_mark_args_code(ngx_http_script_engine_t *e); |
Igor Sysoev | 4959ec4 | 2005-05-23 12:07:45 +0000 | [diff] [blame] | 230 | void ngx_http_script_start_args_code(ngx_http_script_engine_t *e); |
| 231 | #if (NGX_PCRE) |
Igor Sysoev | 899b44e | 2005-05-12 14:58:06 +0000 | [diff] [blame] | 232 | void ngx_http_script_regex_start_code(ngx_http_script_engine_t *e); |
| 233 | void ngx_http_script_regex_end_code(ngx_http_script_engine_t *e); |
Igor Sysoev | 4959ec4 | 2005-05-23 12:07:45 +0000 | [diff] [blame] | 234 | #endif |
Igor Sysoev | 899b44e | 2005-05-12 14:58:06 +0000 | [diff] [blame] | 235 | void ngx_http_script_return_code(ngx_http_script_engine_t *e); |
Igor Sysoev | 5192b36 | 2005-07-08 14:34:20 +0000 | [diff] [blame] | 236 | void ngx_http_script_break_code(ngx_http_script_engine_t *e); |
Igor Sysoev | 899b44e | 2005-05-12 14:58:06 +0000 | [diff] [blame] | 237 | void ngx_http_script_if_code(ngx_http_script_engine_t *e); |
Igor Sysoev | 0e5dc5c | 2005-11-15 13:30:52 +0000 | [diff] [blame] | 238 | void ngx_http_script_equal_code(ngx_http_script_engine_t *e); |
| 239 | void ngx_http_script_not_equal_code(ngx_http_script_engine_t *e); |
Igor Sysoev | 94e32ce | 2006-04-07 14:08:04 +0000 | [diff] [blame] | 240 | void ngx_http_script_file_code(ngx_http_script_engine_t *e); |
Igor Sysoev | e31e90b | 2005-05-19 13:25:22 +0000 | [diff] [blame] | 241 | void ngx_http_script_complex_value_code(ngx_http_script_engine_t *e); |
Igor Sysoev | 899b44e | 2005-05-12 14:58:06 +0000 | [diff] [blame] | 242 | void ngx_http_script_value_code(ngx_http_script_engine_t *e); |
| 243 | void ngx_http_script_set_var_code(ngx_http_script_engine_t *e); |
Igor Sysoev | 7bdb720 | 2006-04-19 15:30:56 +0000 | [diff] [blame] | 244 | void ngx_http_script_var_set_handler_code(ngx_http_script_engine_t *e); |
Igor Sysoev | 899b44e | 2005-05-12 14:58:06 +0000 | [diff] [blame] | 245 | void ngx_http_script_var_code(ngx_http_script_engine_t *e); |
| 246 | void ngx_http_script_nop_code(ngx_http_script_engine_t *e); |
Igor Sysoev | 7578ec9 | 2003-06-02 15:24:30 +0000 | [diff] [blame] | 247 | |
| 248 | |
| 249 | #endif /* _NGX_HTTP_SCRIPT_H_INCLUDED_ */ |