mirror of https://github.com/openresty/openresty
feature: added the preserve_method_on_error_page patch.
parent
950bd4ec4d
commit
1dd22ac20f
@ -0,0 +1,93 @@
|
|||||||
|
# HG changeset patch
|
||||||
|
# User Thibault Charbonnier <thibaultcha@me.com>
|
||||||
|
# Date 1532789509 -7200
|
||||||
|
# Sat Jul 28 16:51:49 2018 +0200
|
||||||
|
# Node ID af4366d9fec2bc2ccce8fd03fc456621df13f673
|
||||||
|
# Parent f7e79596baf209151682f2f7d220161c034657ac
|
||||||
|
Implemented the 'preserve_method_on_error_page' directive.
|
||||||
|
|
||||||
|
By default, the internal redirect to non-named locations caused by the
|
||||||
|
'error_page' directive causes the HTTP method to be rewritten to GET (unless it
|
||||||
|
is HEAD).
|
||||||
|
|
||||||
|
This new directive allows one to disable this behavior, and ensure the HTTP
|
||||||
|
method is preserved through the internal redirect to the defined error_page.
|
||||||
|
|
||||||
|
diff -r f7e79596baf2 -r af4366d9fec2 src/http/ngx_http_core_module.c
|
||||||
|
--- a/src/http/ngx_http_core_module.c Tue Jul 24 18:46:54 2018 +0300
|
||||||
|
+++ b/src/http/ngx_http_core_module.c Sat Jul 28 16:51:49 2018 +0200
|
||||||
|
@@ -654,6 +654,13 @@
|
||||||
|
0,
|
||||||
|
NULL },
|
||||||
|
|
||||||
|
+ { ngx_string("preserve_method_on_error_page"),
|
||||||
|
+ NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
|
||||||
|
+ ngx_conf_set_flag_slot,
|
||||||
|
+ NGX_HTTP_LOC_CONF_OFFSET,
|
||||||
|
+ offsetof(ngx_http_core_loc_conf_t, preserve_method_on_error_page),
|
||||||
|
+ NULL },
|
||||||
|
+
|
||||||
|
{ ngx_string("post_action"),
|
||||||
|
NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF
|
||||||
|
|NGX_CONF_TAKE1,
|
||||||
|
@@ -3410,6 +3417,7 @@
|
||||||
|
clcf->log_not_found = NGX_CONF_UNSET;
|
||||||
|
clcf->log_subrequest = NGX_CONF_UNSET;
|
||||||
|
clcf->recursive_error_pages = NGX_CONF_UNSET;
|
||||||
|
+ clcf->preserve_method_on_error_page = NGX_CONF_UNSET;
|
||||||
|
clcf->chunked_transfer_encoding = NGX_CONF_UNSET;
|
||||||
|
clcf->etag = NGX_CONF_UNSET;
|
||||||
|
clcf->server_tokens = NGX_CONF_UNSET_UINT;
|
||||||
|
@@ -3679,6 +3687,8 @@
|
||||||
|
ngx_conf_merge_value(conf->log_subrequest, prev->log_subrequest, 0);
|
||||||
|
ngx_conf_merge_value(conf->recursive_error_pages,
|
||||||
|
prev->recursive_error_pages, 0);
|
||||||
|
+ ngx_conf_merge_value(conf->preserve_method_on_error_page,
|
||||||
|
+ prev->preserve_method_on_error_page, 0);
|
||||||
|
ngx_conf_merge_value(conf->chunked_transfer_encoding,
|
||||||
|
prev->chunked_transfer_encoding, 1);
|
||||||
|
ngx_conf_merge_value(conf->etag, prev->etag, 1);
|
||||||
|
diff -r f7e79596baf2 -r af4366d9fec2 src/http/ngx_http_core_module.h
|
||||||
|
--- a/src/http/ngx_http_core_module.h Tue Jul 24 18:46:54 2018 +0300
|
||||||
|
+++ b/src/http/ngx_http_core_module.h Sat Jul 28 16:51:49 2018 +0200
|
||||||
|
@@ -393,6 +393,8 @@
|
||||||
|
ngx_flag_t log_not_found; /* log_not_found */
|
||||||
|
ngx_flag_t log_subrequest; /* log_subrequest */
|
||||||
|
ngx_flag_t recursive_error_pages; /* recursive_error_pages */
|
||||||
|
+ ngx_flag_t preserve_method_on_error_page;
|
||||||
|
+ /* preserve_method_on_error_page */
|
||||||
|
ngx_uint_t server_tokens; /* server_tokens */
|
||||||
|
ngx_flag_t chunked_transfer_encoding; /* chunked_transfer_encoding */
|
||||||
|
ngx_flag_t etag; /* etag */
|
||||||
|
diff -r f7e79596baf2 -r af4366d9fec2 src/http/ngx_http_special_response.c
|
||||||
|
--- a/src/http/ngx_http_special_response.c Tue Jul 24 18:46:54 2018 +0300
|
||||||
|
+++ b/src/http/ngx_http_special_response.c Sat Jul 28 16:51:49 2018 +0200
|
||||||
|
@@ -602,6 +602,8 @@
|
||||||
|
return NGX_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
|
||||||
|
+
|
||||||
|
if (uri.len && uri.data[0] == '/') {
|
||||||
|
|
||||||
|
if (err_page->value.lengths) {
|
||||||
|
@@ -611,7 +613,9 @@
|
||||||
|
args = err_page->args;
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (r->method != NGX_HTTP_HEAD) {
|
||||||
|
+ if (r->method != NGX_HTTP_HEAD
|
||||||
|
+ && !clcf->preserve_method_on_error_page)
|
||||||
|
+ {
|
||||||
|
r->method = NGX_HTTP_GET;
|
||||||
|
r->method_name = ngx_http_core_get_method;
|
||||||
|
}
|
||||||
|
@@ -646,8 +650,6 @@
|
||||||
|
|
||||||
|
r->headers_out.location = location;
|
||||||
|
|
||||||
|
- clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
|
||||||
|
-
|
||||||
|
if (clcf->msie_refresh && r->headers_in.msie) {
|
||||||
|
return ngx_http_send_refresh(r);
|
||||||
|
}
|
@ -0,0 +1,54 @@
|
|||||||
|
# vim:set ft= ts=4 sw=4 et fdm=marker:
|
||||||
|
|
||||||
|
use Test::Nginx::Socket::Lua;
|
||||||
|
|
||||||
|
repeat_each(1);
|
||||||
|
|
||||||
|
plan tests => repeat_each() * (blocks() * 3);
|
||||||
|
|
||||||
|
no_long_string();
|
||||||
|
|
||||||
|
run_tests();
|
||||||
|
|
||||||
|
__DATA__
|
||||||
|
|
||||||
|
=== TEST 1: error_page overrides HTTP method if not HEAD
|
||||||
|
--- config
|
||||||
|
error_page 400 /err;
|
||||||
|
|
||||||
|
location /t {
|
||||||
|
return 400;
|
||||||
|
}
|
||||||
|
|
||||||
|
location /err {
|
||||||
|
return 200 '$request_method';
|
||||||
|
}
|
||||||
|
--- request
|
||||||
|
POST /t
|
||||||
|
--- error_code: 400
|
||||||
|
--- response_body chomp
|
||||||
|
GET
|
||||||
|
--- no_error_log
|
||||||
|
[error]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
=== TEST 2: error_page does not override HTTP method if preserve_method_on_error_page is on
|
||||||
|
--- config
|
||||||
|
error_page 400 /err;
|
||||||
|
preserve_method_on_error_page on;
|
||||||
|
|
||||||
|
location /t {
|
||||||
|
return 400;
|
||||||
|
}
|
||||||
|
|
||||||
|
location /err {
|
||||||
|
return 200 '$request_method';
|
||||||
|
}
|
||||||
|
--- request
|
||||||
|
POST /t
|
||||||
|
--- error_code: 400
|
||||||
|
--- response_body chomp
|
||||||
|
POST
|
||||||
|
--- no_error_log
|
||||||
|
[error]
|
Loading…
Reference in New Issue