3 * Copyright (C) Igor Sysoev
7 #include <ngx_config.h>
12 #define ngx_http_script_exit (u_char *) &ngx_http_script_exit_code
14 static uintptr_t ngx_http_script_exit_code = (uintptr_t) NULL;
18 ngx_http_script_variables_count(ngx_str_t *value)
22 for (n = 0, i = 0; i < value->len; i++) {
23 if (value->data[i] == '$') {
33 ngx_http_script_compile(ngx_http_script_compile_t *sc)
40 ngx_uint_t i, n, bracket;
41 ngx_http_script_var_code_t *var_code;
42 ngx_http_script_copy_code_t *copy;
43 ngx_http_script_copy_capture_code_t *copy_capture;
45 if (sc->flushes && *sc->flushes == NULL) {
46 n = sc->variables ? sc->variables : 1;
47 *sc->flushes = ngx_array_create(sc->cf->pool, n, sizeof(ngx_uint_t));
48 if (*sc->flushes == NULL) {
54 if (*sc->lengths == NULL) {
55 n = sc->variables * (2 * sizeof(ngx_http_script_copy_code_t)
56 + sizeof(ngx_http_script_var_code_t))
59 *sc->lengths = ngx_array_create(sc->cf->pool, n, 1);
60 if (*sc->lengths == NULL) {
66 if (*sc->values == NULL) {
67 n = (sc->variables * (2 * sizeof(ngx_http_script_copy_code_t)
68 + sizeof(ngx_http_script_var_code_t))
71 + sizeof(uintptr_t) - 1)
72 & ~(sizeof(uintptr_t) - 1);
74 *sc->values = ngx_array_create(sc->cf->pool, n, 1);
75 if (*sc->values == NULL) {
82 for (i = 0; i < sc->source->len; /* void */ ) {
86 if (sc->source->data[i] == '$') {
88 if (++i == sc->source->len) {
89 goto invalid_variable;
92 if (sc->source->data[i] >= '1' && sc->source->data[i] <= '9') {
94 n = sc->source->data[i] - '0';
96 if (sc->captures_mask & (1 << n)) {
100 sc->captures_mask |= 1 << n;
102 copy_capture = ngx_http_script_add_code(*sc->lengths,
103 sizeof(ngx_http_script_copy_capture_code_t),
105 if (copy_capture == NULL) {
109 copy_capture->code = (ngx_http_script_code_pt)
110 ngx_http_script_copy_capture_len_code;
111 copy_capture->n = 2 * n;
114 copy_capture = ngx_http_script_add_code(*sc->values,
115 sizeof(ngx_http_script_copy_capture_code_t),
117 if (copy_capture == NULL) {
121 copy_capture->code = ngx_http_script_copy_capture_code;
122 copy_capture->n = 2 * n;
124 if (sc->ncaptures < n) {
133 if (sc->source->data[i] == '{') {
136 if (++i == sc->source->len) {
137 goto invalid_variable;
140 name.data = &sc->source->data[i];
144 name.data = &sc->source->data[i];
147 for ( /* void */ ; i < sc->source->len; i++, name.len++) {
148 ch = sc->source->data[i];
150 if (ch == '}' && bracket) {
156 if ((ch >= 'A' && ch <= 'Z')
157 || (ch >= 'a' && ch <= 'z')
158 || (ch >= '0' && ch <= '9')
168 ngx_conf_log_error(NGX_LOG_EMERG, sc->cf, 0,
169 "the closing bracket in \"%V\" "
170 "variable is missing", &name);
175 goto invalid_variable;
180 index = ngx_http_get_variable_index(sc->cf, &name);
182 if (index == NGX_ERROR) {
187 p = ngx_array_push(*sc->flushes);
195 var_code = ngx_http_script_add_code(*sc->lengths,
196 sizeof(ngx_http_script_var_code_t),
198 if (var_code == NULL) {
202 var_code->code = (ngx_http_script_code_pt)
203 ngx_http_script_copy_var_len_code;
204 var_code->index = (uintptr_t) index;
207 var_code = ngx_http_script_add_code(*sc->values,
208 sizeof(ngx_http_script_var_code_t),
210 if (var_code == NULL) {
214 var_code->code = ngx_http_script_copy_var_code;
215 var_code->index = (uintptr_t) index;
220 if (sc->source->data[i] == '?' && sc->compile_args) {
222 sc->compile_args = 0;
224 code = ngx_http_script_add_code(*sc->lengths, sizeof(uintptr_t),
230 *code = (uintptr_t) ngx_http_script_mark_args_code;
232 code = ngx_http_script_add_code(*sc->values, sizeof(uintptr_t),
238 *code = (uintptr_t) ngx_http_script_start_args_code;
245 name.data = &sc->source->data[i];
247 while (i < sc->source->len) {
249 if (sc->source->data[i] == '$') {
253 if (sc->source->data[i] == '?') {
257 if (sc->compile_args) {
266 sc->size += name.len;
268 copy = ngx_http_script_add_code(*sc->lengths,
269 sizeof(ngx_http_script_copy_code_t),
275 copy->code = (ngx_http_script_code_pt) ngx_http_script_copy_len_code;
276 copy->len = name.len;
278 size = (sizeof(ngx_http_script_copy_code_t) + name.len
279 + sizeof(uintptr_t) - 1)
280 & ~(sizeof(uintptr_t) - 1);
282 copy = ngx_http_script_add_code(*sc->values, size, &sc->main);
287 copy->code = ngx_http_script_copy_code;
288 copy->len = name.len;
290 ngx_memcpy((u_char *) copy + sizeof(ngx_http_script_copy_code_t),
291 name.data, name.len);
294 if (sc->complete_lengths) {
295 code = ngx_http_script_add_code(*sc->lengths, sizeof(uintptr_t), NULL);
300 *code = (uintptr_t) NULL;
303 if (sc->complete_values) {
304 code = ngx_http_script_add_code(*sc->values, sizeof(uintptr_t),
310 *code = (uintptr_t) NULL;
317 ngx_conf_log_error(NGX_LOG_EMERG, sc->cf, 0, "invalid variable name");
324 ngx_http_script_run(ngx_http_request_t *r, ngx_str_t *value,
325 void *code_lengths, size_t len, void *code_values)
328 ngx_http_script_code_pt code;
329 ngx_http_script_len_code_pt lcode;
330 ngx_http_script_engine_t e;
331 ngx_http_core_main_conf_t *cmcf;
333 cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);
335 for (i = 0; i < cmcf->variables.nelts; i++) {
336 if (r->variables[i].no_cacheable) {
337 r->variables[i].valid = 0;
338 r->variables[i].not_found = 0;
342 ngx_memzero(&e, sizeof(ngx_http_script_engine_t));
348 while (*(uintptr_t *) e.ip) {
349 lcode = *(ngx_http_script_len_code_pt *) e.ip;
355 value->data = ngx_pnalloc(r->pool, len);
356 if (value->data == NULL) {
363 while (*(uintptr_t *) e.ip) {
364 code = *(ngx_http_script_code_pt *) e.ip;
365 code((ngx_http_script_engine_t *) &e);
373 ngx_http_script_flush_no_cacheable_variables(ngx_http_request_t *r,
374 ngx_array_t *indices)
376 ngx_uint_t n, *index;
379 index = indices->elts;
380 for (n = 0; n < indices->nelts; n++) {
381 if (r->variables[index[n]].no_cacheable) {
382 r->variables[index[n]].valid = 0;
383 r->variables[index[n]].not_found = 0;
391 ngx_http_script_start_code(ngx_pool_t *pool, ngx_array_t **codes, size_t size)
393 if (*codes == NULL) {
394 *codes = ngx_array_create(pool, 256, 1);
395 if (*codes == NULL) {
400 return ngx_array_push_n(*codes, size);
405 ngx_http_script_add_code(ngx_array_t *codes, size_t size, void *code)
412 new = ngx_array_push_n(codes, size);
414 return NGX_CONF_ERROR;
418 if (elts != codes->elts) {
420 *p += (u_char *) codes->elts - elts;
429 ngx_http_script_copy_len_code(ngx_http_script_engine_t *e)
431 ngx_http_script_copy_code_t *code;
433 code = (ngx_http_script_copy_code_t *) e->ip;
435 e->ip += sizeof(ngx_http_script_copy_code_t);
442 ngx_http_script_copy_code(ngx_http_script_engine_t *e)
445 ngx_http_script_copy_code_t *code;
447 code = (ngx_http_script_copy_code_t *) e->ip;
452 e->pos = ngx_copy(p, e->ip + sizeof(ngx_http_script_copy_code_t),
456 e->ip += sizeof(ngx_http_script_copy_code_t)
457 + ((code->len + sizeof(uintptr_t) - 1) & ~(sizeof(uintptr_t) - 1));
459 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0,
460 "http script copy: \"%*s\"", e->pos - p, p);
465 ngx_http_script_copy_var_len_code(ngx_http_script_engine_t *e)
467 ngx_http_variable_value_t *value;
468 ngx_http_script_var_code_t *code;
470 code = (ngx_http_script_var_code_t *) e->ip;
472 e->ip += sizeof(ngx_http_script_var_code_t);
475 value = ngx_http_get_indexed_variable(e->request, code->index);
478 value = ngx_http_get_flushed_variable(e->request, code->index);
481 if (value && !value->not_found) {
490 ngx_http_script_copy_var_code(ngx_http_script_engine_t *e)
493 ngx_http_variable_value_t *value;
494 ngx_http_script_var_code_t *code;
496 code = (ngx_http_script_var_code_t *) e->ip;
498 e->ip += sizeof(ngx_http_script_var_code_t);
503 value = ngx_http_get_indexed_variable(e->request, code->index);
506 value = ngx_http_get_flushed_variable(e->request, code->index);
509 if (value && !value->not_found) {
511 e->pos = ngx_copy(p, value->data, value->len);
513 ngx_log_debug2(NGX_LOG_DEBUG_HTTP,
514 e->request->connection->log, 0,
515 "http script var: \"%*s\"", e->pos - p, p);
522 ngx_http_script_copy_capture_len_code(ngx_http_script_engine_t *e)
524 ngx_http_script_copy_capture_code_t *code;
526 code = (ngx_http_script_copy_capture_code_t *) e->ip;
528 e->ip += sizeof(ngx_http_script_copy_capture_code_t);
530 if (code->n < e->ncaptures) {
531 if ((e->is_args || e->quote)
532 && (e->request->quoted_uri || e->request->plus_in_uri))
534 return e->captures[code->n + 1] - e->captures[code->n]
535 + 2 * ngx_escape_uri(NULL,
536 &e->line.data[e->captures[code->n]],
537 e->captures[code->n + 1] - e->captures[code->n],
540 return e->captures[code->n + 1] - e->captures[code->n];
549 ngx_http_script_copy_capture_code(ngx_http_script_engine_t *e)
552 ngx_http_script_copy_capture_code_t *code;
554 code = (ngx_http_script_copy_capture_code_t *) e->ip;
556 e->ip += sizeof(ngx_http_script_copy_capture_code_t);
560 if (code->n < e->ncaptures) {
561 if ((e->is_args || e->quote)
562 && (e->request->quoted_uri || e->request->plus_in_uri))
564 e->pos = (u_char *) ngx_escape_uri(p,
565 &e->line.data[e->captures[code->n]],
566 e->captures[code->n + 1] - e->captures[code->n],
570 &e->line.data[e->captures[code->n]],
571 e->captures[code->n + 1] - e->captures[code->n]);
575 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0,
576 "http script capture: \"%*s\"", e->pos - p, p);
581 ngx_http_script_mark_args_code(ngx_http_script_engine_t *e)
584 e->ip += sizeof(uintptr_t);
591 ngx_http_script_start_args_code(ngx_http_script_engine_t *e)
593 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0,
598 e->ip += sizeof(uintptr_t);
606 ngx_http_script_regex_start_code(ngx_http_script_engine_t *e)
611 ngx_http_request_t *r;
612 ngx_http_script_engine_t le;
613 ngx_http_script_len_code_pt lcode;
614 ngx_http_script_regex_code_t *code;
616 code = (ngx_http_script_regex_code_t *) e->ip;
620 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
621 "http script regex: \"%V\"", &code->name);
627 e->line.len = e->sp->len;
628 e->line.data = e->sp->data;
631 rc = ngx_regex_exec(code->regex, &e->line, e->captures, code->ncaptures);
633 if (rc == NGX_REGEX_NO_MATCHED) {
634 if (e->log || (r->connection->log->log_level & NGX_LOG_DEBUG_HTTP)) {
635 ngx_log_error(NGX_LOG_NOTICE, r->connection->log, 0,
636 "\"%V\" does not match \"%V\"",
637 &code->name, &e->line);
643 if (code->negative_test) {
645 e->sp->data = (u_char *) "1";
649 e->sp->data = (u_char *) "";
654 e->ip += sizeof(ngx_http_script_regex_code_t);
663 ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,
664 ngx_regex_exec_n " failed: %d on \"%V\" using \"%V\"",
665 rc, &e->line, &code->name);
667 e->ip = ngx_http_script_exit;
668 e->status = NGX_HTTP_INTERNAL_SERVER_ERROR;
672 if (e->log || (r->connection->log->log_level & NGX_LOG_DEBUG_HTTP)) {
673 ngx_log_error(NGX_LOG_NOTICE, r->connection->log, 0,
674 "\"%V\" matches \"%V\"", &code->name, &e->line);
677 e->ncaptures = code->ncaptures;
680 if (code->negative_test) {
682 e->sp->data = (u_char *) "";
686 e->sp->data = (u_char *) "1";
691 e->ip += sizeof(ngx_http_script_regex_code_t);
696 e->status = code->status;
698 if (!code->redirect) {
699 e->ip = ngx_http_script_exit;
706 r->valid_unparsed_uri = 0;
708 if (code->break_cycle) {
709 r->valid_location = 0;
717 if (code->lengths == NULL) {
718 e->buf.len = code->size;
721 if (rc && (r->quoted_uri || r->plus_in_uri)) {
722 e->buf.len += 2 * ngx_escape_uri(NULL, r->uri.data, r->uri.len,
727 for (n = 1; n < (ngx_uint_t) rc; n++) {
728 e->buf.len += e->captures[2 * n + 1] - e->captures[2 * n];
732 ngx_memzero(&le, sizeof(ngx_http_script_engine_t));
734 le.ip = code->lengths->elts;
737 le.captures = e->captures;
738 le.ncaptures = e->ncaptures;
739 le.quote = code->redirect;
743 while (*(uintptr_t *) le.ip) {
744 lcode = *(ngx_http_script_len_code_pt *) le.ip;
749 e->is_args = le.is_args;
752 if (code->add_args && r->args.len) {
753 e->buf.len += r->args.len + 1;
756 e->buf.data = ngx_pnalloc(r->pool, e->buf.len);
757 if (e->buf.data == NULL) {
758 e->ip = ngx_http_script_exit;
759 e->status = NGX_HTTP_INTERNAL_SERVER_ERROR;
763 e->quote = code->redirect;
765 e->pos = e->buf.data;
767 e->ip += sizeof(ngx_http_script_regex_code_t);
772 ngx_http_script_regex_end_code(ngx_http_script_engine_t *e)
775 ngx_http_request_t *r;
776 ngx_http_script_regex_end_code_t *code;
778 code = (ngx_http_script_regex_end_code_t *) e->ip;
784 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
785 "http script regex end");
787 if (code->redirect) {
792 ngx_unescape_uri(&dst, &src, e->pos - e->buf.data,
793 NGX_UNESCAPE_REDIRECT);
796 dst = ngx_copy(dst, src, e->pos - src);
801 if (code->add_args && r->args.len) {
802 *e->pos++ = (u_char) (code->args ? '&' : '?');
803 e->pos = ngx_copy(e->pos, r->args.data, r->args.len);
806 e->buf.len = e->pos - e->buf.data;
808 if (e->log || (r->connection->log->log_level & NGX_LOG_DEBUG_HTTP)) {
809 ngx_log_error(NGX_LOG_NOTICE, r->connection->log, 0,
810 "rewritten redirect: \"%V\"", &e->buf);
813 r->headers_out.location = ngx_list_push(&r->headers_out.headers);
814 if (r->headers_out.location == NULL) {
815 e->ip = ngx_http_script_exit;
816 e->status = NGX_HTTP_INTERNAL_SERVER_ERROR;
820 r->headers_out.location->hash = 1;
821 r->headers_out.location->key.len = sizeof("Location") - 1;
822 r->headers_out.location->key.data = (u_char *) "Location";
823 r->headers_out.location->value = e->buf;
825 e->ip += sizeof(ngx_http_script_regex_end_code_t);
830 e->buf.len = e->args - e->buf.data;
832 if (code->add_args && r->args.len) {
834 e->pos = ngx_copy(e->pos, r->args.data, r->args.len);
837 r->args.len = e->pos - e->args;
838 r->args.data = e->args;
843 e->buf.len = e->pos - e->buf.data;
845 if (!code->add_args) {
850 if (e->log || (r->connection->log->log_level & NGX_LOG_DEBUG_HTTP)) {
851 ngx_log_error(NGX_LOG_NOTICE, r->connection->log, 0,
852 "rewritten data: \"%V\", args: \"%V\"",
859 if (r->uri.len == 0) {
860 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
861 "the rewritten URI has a zero length");
862 e->ip = ngx_http_script_exit;
863 e->status = NGX_HTTP_INTERNAL_SERVER_ERROR;
867 if (ngx_http_set_exten(r) != NGX_OK) {
868 e->ip = ngx_http_script_exit;
869 e->status = NGX_HTTP_INTERNAL_SERVER_ERROR;
874 e->ip += sizeof(ngx_http_script_regex_end_code_t);
881 ngx_http_script_return_code(ngx_http_script_engine_t *e)
883 ngx_http_script_return_code_t *code;
885 code = (ngx_http_script_return_code_t *) e->ip;
887 e->status = code->status;
889 if (code->status == NGX_HTTP_NO_CONTENT) {
890 e->request->header_only = 1;
891 e->request->zero_body = 1;
894 e->ip += sizeof(ngx_http_script_return_code_t) - sizeof(uintptr_t);
899 ngx_http_script_break_code(ngx_http_script_engine_t *e)
901 e->request->uri_changed = 0;
903 e->ip = ngx_http_script_exit;
908 ngx_http_script_if_code(ngx_http_script_engine_t *e)
910 ngx_http_script_if_code_t *code;
912 code = (ngx_http_script_if_code_t *) e->ip;
914 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0,
919 if (e->sp->len && e->sp->data[0] != '0') {
920 if (code->loc_conf) {
921 e->request->loc_conf = code->loc_conf;
922 ngx_http_update_location_config(e->request);
925 e->ip += sizeof(ngx_http_script_if_code_t);
929 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0,
930 "http script if: false");
937 ngx_http_script_equal_code(ngx_http_script_engine_t *e)
939 ngx_http_variable_value_t *val, *res;
941 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0,
942 "http script equal");
948 e->ip += sizeof(uintptr_t);
950 if (val->len == res->len
951 && ngx_strncmp(val->data, res->data, res->len) == 0)
953 *res = ngx_http_variable_true_value;
957 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0,
958 "http script equal: no");
960 *res = ngx_http_variable_null_value;
965 ngx_http_script_not_equal_code(ngx_http_script_engine_t *e)
967 ngx_http_variable_value_t *val, *res;
969 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0,
970 "http script not equal");
976 e->ip += sizeof(uintptr_t);
978 if (val->len == res->len
979 && ngx_strncmp(val->data, res->data, res->len) == 0)
981 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0,
982 "http script not equal: no");
984 *res = ngx_http_variable_null_value;
988 *res = ngx_http_variable_true_value;
993 ngx_http_script_file_code(ngx_http_script_engine_t *e)
996 ngx_http_request_t *r;
997 ngx_open_file_info_t of;
998 ngx_http_core_loc_conf_t *clcf;
999 ngx_http_variable_value_t *value;
1000 ngx_http_script_file_code_t *code;
1004 code = (ngx_http_script_file_code_t *) e->ip;
1005 e->ip += sizeof(ngx_http_script_file_code_t);
1007 path.len = value->len - 1;
1008 path.data = value->data;
1012 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
1013 "http script file op %p \"%V\"", code->op, &path);
1015 clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
1017 ngx_memzero(&of, sizeof(ngx_open_file_info_t));
1019 of.directio = clcf->directio;
1020 of.valid = clcf->open_file_cache_valid;
1021 of.min_uses = clcf->open_file_cache_min_uses;
1022 of.errors = clcf->open_file_cache_errors;
1023 of.events = clcf->open_file_cache_events;
1025 if (ngx_open_cached_file(clcf->open_file_cache, &path, &of, r->pool)
1028 if (of.err != NGX_ENOENT && of.err != NGX_ENOTDIR) {
1029 ngx_log_error(NGX_LOG_CRIT, r->connection->log, of.err,
1030 ngx_file_info_n " \"%s\" failed", value->data);
1035 case ngx_http_script_file_plain:
1036 case ngx_http_script_file_dir:
1037 case ngx_http_script_file_exists:
1038 case ngx_http_script_file_exec:
1041 case ngx_http_script_file_not_plain:
1042 case ngx_http_script_file_not_dir:
1043 case ngx_http_script_file_not_exists:
1044 case ngx_http_script_file_not_exec:
1052 case ngx_http_script_file_plain:
1058 case ngx_http_script_file_not_plain:
1064 case ngx_http_script_file_dir:
1070 case ngx_http_script_file_not_dir:
1076 case ngx_http_script_file_exists:
1077 if (of.is_file || of.is_dir || of.is_link) {
1082 case ngx_http_script_file_not_exists:
1083 if (of.is_file || of.is_dir || of.is_link) {
1088 case ngx_http_script_file_exec:
1094 case ngx_http_script_file_not_exec:
1103 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
1104 "http script file op false");
1106 *value = ngx_http_variable_null_value;
1111 *value = ngx_http_variable_true_value;
1117 ngx_http_script_complex_value_code(ngx_http_script_engine_t *e)
1120 ngx_http_script_engine_t le;
1121 ngx_http_script_len_code_pt lcode;
1122 ngx_http_script_complex_value_code_t *code;
1124 code = (ngx_http_script_complex_value_code_t *) e->ip;
1126 e->ip += sizeof(ngx_http_script_complex_value_code_t);
1128 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0,
1129 "http script complex value");
1131 ngx_memzero(&le, sizeof(ngx_http_script_engine_t));
1133 le.ip = code->lengths->elts;
1135 le.request = e->request;
1136 le.captures = e->captures;
1137 le.ncaptures = e->ncaptures;
1138 le.quote = e->quote;
1140 for (len = 0; *(uintptr_t *) le.ip; len += lcode(&le)) {
1141 lcode = *(ngx_http_script_len_code_pt *) le.ip;
1145 e->buf.data = ngx_pnalloc(e->request->pool, len);
1146 if (e->buf.data == NULL) {
1147 e->ip = ngx_http_script_exit;
1148 e->status = NGX_HTTP_INTERNAL_SERVER_ERROR;
1152 e->pos = e->buf.data;
1154 e->sp->len = e->buf.len;
1155 e->sp->data = e->buf.data;
1161 ngx_http_script_value_code(ngx_http_script_engine_t *e)
1163 ngx_http_script_value_code_t *code;
1165 code = (ngx_http_script_value_code_t *) e->ip;
1167 e->ip += sizeof(ngx_http_script_value_code_t);
1169 e->sp->len = code->text_len;
1170 e->sp->data = (u_char *) code->text_data;
1172 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0,
1173 "http script value: \"%v\"", e->sp);
1180 ngx_http_script_set_var_code(ngx_http_script_engine_t *e)
1182 ngx_http_request_t *r;
1183 ngx_http_script_var_code_t *code;
1185 code = (ngx_http_script_var_code_t *) e->ip;
1187 e->ip += sizeof(ngx_http_script_var_code_t);
1193 r->variables[code->index].len = e->sp->len;
1194 r->variables[code->index].valid = 1;
1195 r->variables[code->index].no_cacheable = 0;
1196 r->variables[code->index].not_found = 0;
1197 r->variables[code->index].data = e->sp->data;
1201 ngx_http_variable_t *v;
1202 ngx_http_core_main_conf_t *cmcf;
1204 cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);
1206 v = cmcf->variables.elts;
1208 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0,
1209 "http script set $%V", &v[code->index].name);
1216 ngx_http_script_var_set_handler_code(ngx_http_script_engine_t *e)
1218 ngx_http_script_var_handler_code_t *code;
1220 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0,
1221 "http script set var handler");
1223 code = (ngx_http_script_var_handler_code_t *) e->ip;
1225 e->ip += sizeof(ngx_http_script_var_handler_code_t);
1229 code->handler(e->request, e->sp, code->data);
1234 ngx_http_script_var_code(ngx_http_script_engine_t *e)
1236 ngx_http_variable_value_t *value;
1237 ngx_http_script_var_code_t *code;
1239 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0,
1242 code = (ngx_http_script_var_code_t *) e->ip;
1244 e->ip += sizeof(ngx_http_script_var_code_t);
1246 value = ngx_http_get_flushed_variable(e->request, code->index);
1248 if (value && !value->not_found) {
1249 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0,
1250 "http script var: \"%v\"", value);
1258 *e->sp = ngx_http_variable_null_value;
1264 ngx_http_script_nop_code(ngx_http_script_engine_t *e)
1266 e->ip += sizeof(uintptr_t);