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