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 |
Maxim Konovalov | f8d59e3 | 2012-01-18 15:07:43 +0000 | [diff] [blame] | 4 | * Copyright (C) Nginx, Inc. |
Igor Sysoev | d90282d | 2004-09-28 08:34:51 +0000 | [diff] [blame] | 5 | */ |
| 6 | |
| 7 | |
Igor Sysoev | 7578ec9 | 2003-06-02 15:24:30 +0000 | [diff] [blame] | 8 | #ifndef _NGX_HTTP_SCRIPT_H_INCLUDED_ |
| 9 | #define _NGX_HTTP_SCRIPT_H_INCLUDED_ |
| 10 | |
| 11 | |
Igor Sysoev | 02025fd | 2005-01-18 13:03:58 +0000 | [diff] [blame] | 12 | #include <ngx_config.h> |
| 13 | #include <ngx_core.h> |
| 14 | #include <ngx_http.h> |
| 15 | |
| 16 | |
Igor Sysoev | 02f742b | 2005-04-08 15:18:55 +0000 | [diff] [blame] | 17 | typedef struct { |
Igor Sysoev | 09c684b | 2005-11-09 17:25:55 +0000 | [diff] [blame] | 18 | u_char *ip; |
| 19 | u_char *pos; |
| 20 | ngx_http_variable_value_t *sp; |
Igor Sysoev | 899b44e | 2005-05-12 14:58:06 +0000 | [diff] [blame] | 21 | |
Igor Sysoev | 09c684b | 2005-11-09 17:25:55 +0000 | [diff] [blame] | 22 | ngx_str_t buf; |
| 23 | ngx_str_t line; |
Igor Sysoev | 899b44e | 2005-05-12 14:58:06 +0000 | [diff] [blame] | 24 | |
| 25 | /* the start of the rewritten arguments */ |
Igor Sysoev | 09c684b | 2005-11-09 17:25:55 +0000 | [diff] [blame] | 26 | u_char *args; |
Igor Sysoev | 899b44e | 2005-05-12 14:58:06 +0000 | [diff] [blame] | 27 | |
Igor Sysoev | 09c684b | 2005-11-09 17:25:55 +0000 | [diff] [blame] | 28 | unsigned flushed:1; |
| 29 | unsigned skip:1; |
| 30 | unsigned quote:1; |
Igor Sysoev | 04610ea | 2008-02-12 18:05:32 +0000 | [diff] [blame] | 31 | unsigned is_args:1; |
Igor Sysoev | 09c684b | 2005-11-09 17:25:55 +0000 | [diff] [blame] | 32 | unsigned log:1; |
Igor Sysoev | 899b44e | 2005-05-12 14:58:06 +0000 | [diff] [blame] | 33 | |
Igor Sysoev | 09c684b | 2005-11-09 17:25:55 +0000 | [diff] [blame] | 34 | ngx_int_t status; |
| 35 | ngx_http_request_t *request; |
Igor Sysoev | 02f742b | 2005-04-08 15:18:55 +0000 | [diff] [blame] | 36 | } ngx_http_script_engine_t; |
| 37 | |
| 38 | |
Igor Sysoev | 899b44e | 2005-05-12 14:58:06 +0000 | [diff] [blame] | 39 | typedef struct { |
Igor Sysoev | 09c684b | 2005-11-09 17:25:55 +0000 | [diff] [blame] | 40 | ngx_conf_t *cf; |
| 41 | ngx_str_t *source; |
Igor Sysoev | 02f742b | 2005-04-08 15:18:55 +0000 | [diff] [blame] | 42 | |
Igor Sysoev | 09c684b | 2005-11-09 17:25:55 +0000 | [diff] [blame] | 43 | ngx_array_t **flushes; |
| 44 | ngx_array_t **lengths; |
| 45 | ngx_array_t **values; |
Igor Sysoev | 899b44e | 2005-05-12 14:58:06 +0000 | [diff] [blame] | 46 | |
Igor Sysoev | 09c684b | 2005-11-09 17:25:55 +0000 | [diff] [blame] | 47 | ngx_uint_t variables; |
| 48 | ngx_uint_t ncaptures; |
Igor Sysoev | 7f7846d | 2006-04-26 09:52:47 +0000 | [diff] [blame] | 49 | ngx_uint_t captures_mask; |
Igor Sysoev | 09c684b | 2005-11-09 17:25:55 +0000 | [diff] [blame] | 50 | ngx_uint_t size; |
Igor Sysoev | 899b44e | 2005-05-12 14:58:06 +0000 | [diff] [blame] | 51 | |
Igor Sysoev | 09c684b | 2005-11-09 17:25:55 +0000 | [diff] [blame] | 52 | void *main; |
Igor Sysoev | 899b44e | 2005-05-12 14:58:06 +0000 | [diff] [blame] | 53 | |
Igor Sysoev | 09c684b | 2005-11-09 17:25:55 +0000 | [diff] [blame] | 54 | unsigned compile_args:1; |
Igor Sysoev | 09c684b | 2005-11-09 17:25:55 +0000 | [diff] [blame] | 55 | unsigned complete_lengths:1; |
| 56 | unsigned complete_values:1; |
Igor Sysoev | 8508c10 | 2009-03-22 09:36:51 +0000 | [diff] [blame] | 57 | unsigned zero:1; |
| 58 | unsigned conf_prefix:1; |
| 59 | unsigned root_prefix:1; |
Igor Sysoev | 09c684b | 2005-11-09 17:25:55 +0000 | [diff] [blame] | 60 | |
Igor Sysoev | 8508c10 | 2009-03-22 09:36:51 +0000 | [diff] [blame] | 61 | unsigned dup_capture:1; |
Igor Sysoev | 09c684b | 2005-11-09 17:25:55 +0000 | [diff] [blame] | 62 | unsigned args:1; |
Igor Sysoev | 899b44e | 2005-05-12 14:58:06 +0000 | [diff] [blame] | 63 | } ngx_http_script_compile_t; |
| 64 | |
| 65 | |
Igor Sysoev | 8508c10 | 2009-03-22 09:36:51 +0000 | [diff] [blame] | 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 | |
Igor Sysoev | 899b44e | 2005-05-12 14:58:06 +0000 | [diff] [blame] | 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); |
Igor Sysoev | 02f742b | 2005-04-08 15:18:55 +0000 | [diff] [blame] | 87 | |
| 88 | |
| 89 | typedef struct { |
Igor Sysoev | 8508c10 | 2009-03-22 09:36:51 +0000 | [diff] [blame] | 90 | ngx_http_script_code_pt code; |
| 91 | uintptr_t len; |
Igor Sysoev | 02f742b | 2005-04-08 15:18:55 +0000 | [diff] [blame] | 92 | } ngx_http_script_copy_code_t; |
| 93 | |
| 94 | |
| 95 | typedef struct { |
Igor Sysoev | 8508c10 | 2009-03-22 09:36:51 +0000 | [diff] [blame] | 96 | ngx_http_script_code_pt code; |
| 97 | uintptr_t index; |
Igor Sysoev | 02f742b | 2005-04-08 15:18:55 +0000 | [diff] [blame] | 98 | } ngx_http_script_var_code_t; |
| 99 | |
| 100 | |
Igor Sysoev | 899b44e | 2005-05-12 14:58:06 +0000 | [diff] [blame] | 101 | typedef struct { |
Igor Sysoev | 8508c10 | 2009-03-22 09:36:51 +0000 | [diff] [blame] | 102 | ngx_http_script_code_pt code; |
| 103 | ngx_http_set_variable_pt handler; |
| 104 | uintptr_t data; |
Igor Sysoev | 7bdb720 | 2006-04-19 15:30:56 +0000 | [diff] [blame] | 105 | } ngx_http_script_var_handler_code_t; |
| 106 | |
| 107 | |
| 108 | typedef struct { |
Igor Sysoev | 8508c10 | 2009-03-22 09:36:51 +0000 | [diff] [blame] | 109 | ngx_http_script_code_pt code; |
| 110 | uintptr_t n; |
Igor Sysoev | 899b44e | 2005-05-12 14:58:06 +0000 | [diff] [blame] | 111 | } ngx_http_script_copy_capture_code_t; |
Igor Sysoev | 02f742b | 2005-04-08 15:18:55 +0000 | [diff] [blame] | 112 | |
| 113 | |
Igor Sysoev | 4959ec4 | 2005-05-23 12:07:45 +0000 | [diff] [blame] | 114 | #if (NGX_PCRE) |
| 115 | |
Igor Sysoev | 899b44e | 2005-05-12 14:58:06 +0000 | [diff] [blame] | 116 | typedef struct { |
Igor Sysoev | 8508c10 | 2009-03-22 09:36:51 +0000 | [diff] [blame] | 117 | ngx_http_script_code_pt code; |
Igor Sysoev | c05f20e | 2009-11-16 12:19:02 +0000 | [diff] [blame] | 118 | ngx_http_regex_t *regex; |
Igor Sysoev | 8508c10 | 2009-03-22 09:36:51 +0000 | [diff] [blame] | 119 | ngx_array_t *lengths; |
| 120 | uintptr_t size; |
Igor Sysoev | 8508c10 | 2009-03-22 09:36:51 +0000 | [diff] [blame] | 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; |
Igor Sysoev | 5ef370d | 2009-04-27 11:32:33 +0000 | [diff] [blame] | 156 | uintptr_t conf_prefix; |
Igor Sysoev | 8508c10 | 2009-03-22 09:36:51 +0000 | [diff] [blame] | 157 | } ngx_http_script_full_name_code_t; |
| 158 | |
| 159 | |
| 160 | typedef struct { |
| 161 | ngx_http_script_code_pt code; |
| 162 | uintptr_t status; |
Igor Sysoev | 4c1b077 | 2010-06-18 15:15:20 +0000 | [diff] [blame] | 163 | ngx_http_complex_value_t text; |
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 | 766f3a9 | 2009-03-27 14:59:47 +0000 | [diff] [blame] | 206 | void ngx_http_script_flush_complex_value(ngx_http_request_t *r, |
Igor Sysoev | 8508c10 | 2009-03-22 09:36:51 +0000 | [diff] [blame] | 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); |
Igor Sysoev | 9a62648 | 2010-09-13 12:44:43 +0000 | [diff] [blame] | 211 | char *ngx_http_set_complex_value_slot(ngx_conf_t *cf, ngx_command_t *cmd, |
Igor Sysoev | 94e9aaa | 2010-09-02 14:37:16 +0000 | [diff] [blame] | 212 | void *conf); |
| 213 | |
Igor Sysoev | 8508c10 | 2009-03-22 09:36:51 +0000 | [diff] [blame] | 214 | |
Igor Sysoev | 7fc2905 | 2010-07-14 11:13:59 +0000 | [diff] [blame] | 215 | ngx_int_t ngx_http_test_predicates(ngx_http_request_t *r, |
| 216 | ngx_array_t *predicates); |
| 217 | char *ngx_http_set_predicate_slot(ngx_conf_t *cf, ngx_command_t *cmd, |
| 218 | void *conf); |
| 219 | |
Igor Sysoev | 899b44e | 2005-05-12 14:58:06 +0000 | [diff] [blame] | 220 | ngx_uint_t ngx_http_script_variables_count(ngx_str_t *value); |
| 221 | 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] | 222 | u_char *ngx_http_script_run(ngx_http_request_t *r, ngx_str_t *value, |
| 223 | void *code_lengths, size_t reserved, void *code_values); |
Igor Sysoev | 2d3f3f6 | 2007-10-14 18:56:15 +0000 | [diff] [blame] | 224 | 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] | 225 | ngx_array_t *indices); |
Igor Sysoev | 899b44e | 2005-05-12 14:58:06 +0000 | [diff] [blame] | 226 | |
| 227 | 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] | 228 | size_t size); |
Igor Sysoev | 899b44e | 2005-05-12 14:58:06 +0000 | [diff] [blame] | 229 | 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] | 230 | |
Igor Sysoev | 899b44e | 2005-05-12 14:58:06 +0000 | [diff] [blame] | 231 | size_t ngx_http_script_copy_len_code(ngx_http_script_engine_t *e); |
| 232 | void ngx_http_script_copy_code(ngx_http_script_engine_t *e); |
| 233 | size_t ngx_http_script_copy_var_len_code(ngx_http_script_engine_t *e); |
| 234 | void ngx_http_script_copy_var_code(ngx_http_script_engine_t *e); |
| 235 | size_t ngx_http_script_copy_capture_len_code(ngx_http_script_engine_t *e); |
| 236 | 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] | 237 | 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] | 238 | void ngx_http_script_start_args_code(ngx_http_script_engine_t *e); |
| 239 | #if (NGX_PCRE) |
Igor Sysoev | 899b44e | 2005-05-12 14:58:06 +0000 | [diff] [blame] | 240 | void ngx_http_script_regex_start_code(ngx_http_script_engine_t *e); |
| 241 | 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] | 242 | #endif |
Igor Sysoev | 899b44e | 2005-05-12 14:58:06 +0000 | [diff] [blame] | 243 | void ngx_http_script_return_code(ngx_http_script_engine_t *e); |
Igor Sysoev | 5192b36 | 2005-07-08 14:34:20 +0000 | [diff] [blame] | 244 | void ngx_http_script_break_code(ngx_http_script_engine_t *e); |
Igor Sysoev | 899b44e | 2005-05-12 14:58:06 +0000 | [diff] [blame] | 245 | void ngx_http_script_if_code(ngx_http_script_engine_t *e); |
Igor Sysoev | 0e5dc5c | 2005-11-15 13:30:52 +0000 | [diff] [blame] | 246 | void ngx_http_script_equal_code(ngx_http_script_engine_t *e); |
| 247 | 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] | 248 | void ngx_http_script_file_code(ngx_http_script_engine_t *e); |
Igor Sysoev | e31e90b | 2005-05-19 13:25:22 +0000 | [diff] [blame] | 249 | 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] | 250 | void ngx_http_script_value_code(ngx_http_script_engine_t *e); |
| 251 | 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] | 252 | 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] | 253 | void ngx_http_script_var_code(ngx_http_script_engine_t *e); |
| 254 | void ngx_http_script_nop_code(ngx_http_script_engine_t *e); |
Igor Sysoev | 7578ec9 | 2003-06-02 15:24:30 +0000 | [diff] [blame] | 255 | |
| 256 | |
| 257 | #endif /* _NGX_HTTP_SCRIPT_H_INCLUDED_ */ |