Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nginx/nginx.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIgor Sysoev <igor@sysoev.ru>2010-06-18 19:15:20 +0400
committerIgor Sysoev <igor@sysoev.ru>2010-06-18 19:15:20 +0400
commit4c1b0770ca0944cbb81493333719284ea7d20b4b (patch)
tree4564bdce609fd955c32bc02aa3989d0a0c5de66b
parent01213e18a7a60d8e8baac41f0b1481ac8d6bfd43 (diff)
return code text
-rw-r--r--src/http/modules/ngx_http_rewrite_module.c46
-rw-r--r--src/http/ngx_http.c4
-rw-r--r--src/http/ngx_http_script.c15
-rw-r--r--src/http/ngx_http_script.h2
4 files changed, 53 insertions, 14 deletions
diff --git a/src/http/modules/ngx_http_rewrite_module.c b/src/http/modules/ngx_http_rewrite_module.c
index 1a474d9d2..44b5746ea 100644
--- a/src/http/modules/ngx_http_rewrite_module.c
+++ b/src/http/modules/ngx_http_rewrite_module.c
@@ -52,7 +52,7 @@ static ngx_command_t ngx_http_rewrite_commands[] = {
{ ngx_string("return"),
NGX_HTTP_SRV_CONF|NGX_HTTP_SIF_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF
- |NGX_CONF_TAKE1,
+ |NGX_CONF_TAKE12,
ngx_http_rewrite_return,
NGX_HTTP_LOC_CONF_OFFSET,
0,
@@ -433,8 +433,10 @@ ngx_http_rewrite_return(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
{
ngx_http_rewrite_loc_conf_t *lcf = conf;
- ngx_str_t *value;
- ngx_http_script_return_code_t *ret;
+ u_char *p;
+ ngx_str_t *value, *v;
+ ngx_http_script_return_code_t *ret;
+ ngx_http_compile_complex_value_t ccv;
ret = ngx_http_script_start_code(cf->pool, &lcf->codes,
sizeof(ngx_http_script_return_code_t));
@@ -444,12 +446,46 @@ ngx_http_rewrite_return(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
value = cf->args->elts;
+ ngx_memzero(ret, sizeof(ngx_http_script_return_code_t));
+
ret->code = ngx_http_script_return_code;
- ret->null = (uintptr_t) NULL;
- ret->status = ngx_atoi(value[1].data, value[1].len);
+ p = value[1].data;
+
+ ret->status = ngx_atoi(p, value[1].len);
if (ret->status == (uintptr_t) NGX_ERROR) {
+
+ if (cf->args->nelts == 2
+ && (ngx_strncmp(p, "http://", sizeof("http://") - 1) == 0
+ || ngx_strncmp(p, "https://", sizeof("https://") - 1) == 0
+ || ngx_strncmp(p, "$scheme", sizeof("$scheme") - 1) == 0))
+ {
+ ret->status = NGX_HTTP_MOVED_TEMPORARILY;
+ v = &value[1];
+
+ } else {
+ ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
+ "invalid return code \"%V\"", &value[1]);
+ return NGX_CONF_ERROR;
+ }
+
+ } else {
+
+ if (cf->args->nelts == 2) {
+ return NGX_CONF_OK;
+ }
+
+ v = &value[2];
+ }
+
+ ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));
+
+ ccv.cf = cf;
+ ccv.value = v;
+ ccv.complex_value = &ret->text;
+
+ if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {
return NGX_CONF_ERROR;
}
diff --git a/src/http/ngx_http.c b/src/http/ngx_http.c
index 4c856840b..84867887d 100644
--- a/src/http/ngx_http.c
+++ b/src/http/ngx_http.c
@@ -509,7 +509,7 @@ ngx_http_init_phase_handlers(ngx_conf_t *cf, ngx_http_core_main_conf_t *cmcf)
if (cmcf->phase_engine.server_rewrite_index == (ngx_uint_t) -1) {
cmcf->phase_engine.server_rewrite_index = n;
}
- checker = ngx_http_core_generic_phase;
+ checker = ngx_http_core_rewrite_phase;
break;
@@ -526,7 +526,7 @@ ngx_http_init_phase_handlers(ngx_conf_t *cf, ngx_http_core_main_conf_t *cmcf)
if (cmcf->phase_engine.location_rewrite_index == (ngx_uint_t) -1) {
cmcf->phase_engine.location_rewrite_index = n;
}
- checker = ngx_http_core_generic_phase;
+ checker = ngx_http_core_rewrite_phase;
break;
diff --git a/src/http/ngx_http_script.c b/src/http/ngx_http_script.c
index 5ccce003c..1f4288969 100644
--- a/src/http/ngx_http_script.c
+++ b/src/http/ngx_http_script.c
@@ -1254,14 +1254,17 @@ ngx_http_script_return_code(ngx_http_script_engine_t *e)
code = (ngx_http_script_return_code_t *) e->ip;
- e->status = code->status;
-
- if (code->status == NGX_HTTP_NO_CONTENT) {
- e->request->header_only = 1;
- e->request->zero_body = 1;
+ if (code->status < NGX_HTTP_BAD_REQUEST
+ || code->text.value.len
+ || code->text.lengths)
+ {
+ e->status = ngx_http_send_response(e->request, code->status, NULL,
+ &code->text);
+ } else {
+ e->status = code->status;
}
- e->ip += sizeof(ngx_http_script_return_code_t) - sizeof(uintptr_t);
+ e->ip = ngx_http_script_exit;
}
diff --git a/src/http/ngx_http_script.h b/src/http/ngx_http_script.h
index 90a4e1a06..f7943d37c 100644
--- a/src/http/ngx_http_script.h
+++ b/src/http/ngx_http_script.h
@@ -159,7 +159,7 @@ typedef struct {
typedef struct {
ngx_http_script_code_pt code;
uintptr_t status;
- uintptr_t null;
+ ngx_http_complex_value_t text;
} ngx_http_script_return_code_t;