From: Yann Ylavic Date: Wed, 24 Jun 2020 07:47:58 +0000 (+0000) Subject: Follow up to r1879079, r1879080: change to DONE semantics for pre_trans hooks. X-Git-Tag: 2.5.0-alpha2-ci-test-only~1339 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6defe5493dfa8f713a69f6cc56623ad70373ad6a;p=thirdparty%2Fapache%2Fhttpd.git 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 --- diff --git a/include/http_request.h b/include/http_request.h index 8f283975eac..93defac2854 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 19628ac0b86..2d32b6db2cd 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 258b853633c..4ba347ae40c 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) {