diff options
author | Yann Ylavic <ylavic@apache.org> | 2020-06-24 09:47:58 +0200 |
---|---|---|
committer | Yann Ylavic <ylavic@apache.org> | 2020-06-24 09:47:58 +0200 |
commit | 6defe5493dfa8f713a69f6cc56623ad70373ad6a (patch) | |
tree | 80ba6e3d1c0d74a3f116f9c9d31bfd4a448d8374 | |
parent | * modules/generators/mod_cgid.c (get_req): Add basic sanity (diff) | |
download | apache2-6defe5493dfa8f713a69f6cc56623ad70373ad6a.tar.xz apache2-6defe5493dfa8f713a69f6cc56623ad70373ad6a.zip |
Follow up to r1879079, r1879080: change to DONE semantics for pre_trans hooks.
Don't decode r->uri when pre_trans returns DONE instead of OK, which allows to
preserve previous behaviour where decoding was avoided for "ProxyRequests on"
or post_read_request RewriteRule [P] only, but not ProxyPass'ed requests.
This also preserves decoded location walk in most/same cases.
git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1879137 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r-- | include/http_request.h | 5 | ||||
-rw-r--r-- | modules/proxy/mod_proxy.c | 5 | ||||
-rw-r--r-- | server/request.c | 8 |
3 files changed, 11 insertions, 7 deletions
diff --git a/include/http_request.h b/include/http_request.h index 8f283975ea..93defac285 100644 --- a/include/http_request.h +++ b/include/http_request.h @@ -366,7 +366,10 @@ AP_DECLARE_HOOK(int,create_request,(request_rec *r)) * This hook allow modules an opportunity to translate the URI into an * actual filename, before URL decoding happens. * @param r The current request - * @return OK, DECLINED, or HTTP_... + * @return DECLINED to let other modules handle the pre-translation, + * OK if it was handled and no other module should process it, + * DONE if no further transformation should happen on the URI, + * HTTP_... in case of error. * @ingroup hooks */ AP_DECLARE_HOOK(int,pre_translate_name,(request_rec *r)) diff --git a/modules/proxy/mod_proxy.c b/modules/proxy/mod_proxy.c index 19628ac0b8..2d32b6db2c 100644 --- a/modules/proxy/mod_proxy.c +++ b/modules/proxy/mod_proxy.c @@ -1007,9 +1007,10 @@ static int proxy_trans(request_rec *r, int pre_trans) if (r->proxyreq) { /* someone has already set up the proxy, it was possibly ourselves - * in proxy_detect + * in proxy_detect (DONE will prevent further decoding of r->uri, + * only if proxyreq is set before pre_trans already). */ - return OK; + return pre_trans ? DONE : OK; } /* In early pre_trans hook, r->uri was not manipulated yet so we are diff --git a/server/request.c b/server/request.c index 258b853633..4ba347ae40 100644 --- a/server/request.c +++ b/server/request.c @@ -227,11 +227,11 @@ AP_DECLARE(int) ap_process_request_internal(request_rec *r) return access_status; } - /* Let pre_translate_name hooks work with non-decoded URIs, - * and eventually apply their own transformations (return OK). + /* Let pre_translate_name hooks work with non-decoded URIs, and + * eventually prevent further URI transformations (return DONE). */ access_status = ap_run_pre_translate_name(r); - if (access_status != OK && access_status != DECLINED) { + if (ap_is_HTTP_ERROR(access_status)) { return access_status; } @@ -240,7 +240,7 @@ AP_DECLARE(int) ap_process_request_internal(request_rec *r) } /* Ignore URL unescaping for translated URIs already */ - if (access_status == DECLINED && r->parsed_uri.path) { + if (access_status != DONE && r->parsed_uri.path) { core_dir_config *d = ap_get_core_module_config(r->per_dir_config); if (d->allow_encoded_slashes) { |