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