Mercurial > hg > nginx-vendor-0-7
diff src/http/ngx_http_script.c @ 126:df17fbafec8f NGINX_0_3_10
nginx 0.3.10
*) Change: the "valid_referers" directive and the "$invalid_referer"
variable were moved to the new ngx_http_referer_module from the
ngx_http_rewrite_module.
*) Change: the "$apache_bytes_sent" variable name was changed to
"$body_bytes_sent".
*) Feature: the "$sent_http_..." variables.
*) Feature: the "if" directive supports the "=" and "!=" operations.
*) Feature: the "proxy_pass" directive supports the HTTPS protocol.
*) Feature: the "proxy_set_body" directive.
*) Feature: the "post_action" directive.
*) Feature: the ngx_http_empty_gif_module.
*) Feature: the "worker_cpu_affinity" directive for Linux.
*) Bugfix: the "rewrite" directive did not unescape URI part in
redirect, now it is unescaped except the %00-%25 and %7F-%FF
characters.
*) Bugfix: nginx could not be built by the icc 9.0 compiler.
*) Bugfix: if the SSI was enabled for zero size static file, then the
chunked response was encoded incorrectly.
author | Igor Sysoev <http://sysoev.ru> |
---|---|
date | Tue, 15 Nov 2005 00:00:00 +0300 |
parents | d25a1d6034f1 |
children | 50bd986c5d63 |
line wrap: on
line diff
--- a/src/http/ngx_http_script.c +++ b/src/http/ngx_http_script.c @@ -503,7 +503,7 @@ ngx_http_script_start_args_code(ngx_http { ngx_log_debug0(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0, "http script args"); - + e->args = e->pos; e->ip += sizeof(uintptr_t); } @@ -664,6 +664,7 @@ ngx_http_script_regex_start_code(ngx_htt void ngx_http_script_regex_end_code(ngx_http_script_engine_t *e) { + u_char *dst, *src; ngx_http_request_t *r; ngx_http_script_regex_end_code_t *code; @@ -678,7 +679,18 @@ ngx_http_script_regex_end_code(ngx_http_ if (code->redirect) { - if (code->add_args && r->args.len) { + dst = e->buf.data; + src = e->buf.data; + + ngx_unescape_uri(&dst, &src, e->pos - e->buf.data); + + if (src < e->pos) { + dst = ngx_copy(dst, src, e->pos - src); + } + + e->pos = dst; + + if (code->add_args && r->args.len) { *e->pos++ = (u_char) (code->args ? '&' : '?'); e->pos = ngx_copy(e->pos, r->args.data, r->args.len); } @@ -697,7 +709,7 @@ ngx_http_script_regex_end_code(ngx_http_ return; } - r->headers_out.location->hash = 1; + r->headers_out.location->hash = 1; r->headers_out.location->key.len = sizeof("Location") - 1; r->headers_out.location->key.data = (u_char *) "Location"; r->headers_out.location->value = e->buf; @@ -706,7 +718,7 @@ ngx_http_script_regex_end_code(ngx_http_ return; } - if (e->args) { + if (e->args) { e->buf.len = e->args - e->buf.data; if (code->add_args && r->args.len) { @@ -755,9 +767,9 @@ ngx_http_script_regex_end_code(ngx_http_ void ngx_http_script_return_code(ngx_http_script_engine_t *e) -{ +{ ngx_http_script_return_code_t *code; - + code = (ngx_http_script_return_code_t *) e->ip; e->status = code->status; @@ -798,13 +810,69 @@ ngx_http_script_if_code(ngx_http_script_ } ngx_log_debug0(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0, - "http script if false"); + "http script if: false"); e->ip += code->next; } void +ngx_http_script_equal_code(ngx_http_script_engine_t *e) +{ + ngx_http_variable_value_t *val, *res; + + ngx_log_debug0(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0, + "http script equal"); + + e->sp--; + val = e->sp; + res = e->sp - 1; + + e->ip += sizeof(uintptr_t); + + if (val->len == res->len && ngx_strncmp(val->data, res->data, res->len) + == 0) + { + *res = ngx_http_variable_true_value; + return; + } + + ngx_log_debug0(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0, + "http script equal: no"); + + *res = ngx_http_variable_null_value; +} + + +void +ngx_http_script_not_equal_code(ngx_http_script_engine_t *e) +{ + ngx_http_variable_value_t *val, *res; + + ngx_log_debug0(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0, + "http script not equal"); + + e->sp--; + val = e->sp; + res = e->sp - 1; + + e->ip += sizeof(uintptr_t); + + if (val->len == res->len && ngx_strncmp(val->data, res->data, res->len) + == 0) + { + ngx_log_debug0(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0, + "http script not equal: no"); + + *res = ngx_http_variable_null_value; + return; + } + + *res = ngx_http_variable_true_value; +} + + +void ngx_http_script_complex_value_code(ngx_http_script_engine_t *e) { size_t len; @@ -840,8 +908,8 @@ ngx_http_script_complex_value_code(ngx_h e->pos = e->buf.data; + e->sp->len = e->buf.len; e->sp->data = e->buf.data; - e->sp->len = e->buf.len; e->sp++; } @@ -855,11 +923,12 @@ ngx_http_script_value_code(ngx_http_scri e->ip += sizeof(ngx_http_script_value_code_t); - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0, - "http script value"); - e->sp->len = code->text_len; e->sp->data = (u_char *) code->text_data; + + ngx_log_debug1(NGX_LOG_DEBUG_HTTP, e->request->connection->log, 0, + "http script value: \"%V\"", e->sp); + e->sp++; } @@ -914,8 +983,7 @@ ngx_http_script_var_code(ngx_http_script return; } - e->sp->data = (u_char *) ""; - e->sp->len = 0; + *e->sp = ngx_http_variable_null_value; e->sp++; }