summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYann Ylavic <ylavic@apache.org>2020-06-24 09:47:58 +0200
committerYann Ylavic <ylavic@apache.org>2020-06-24 09:47:58 +0200
commit6defe5493dfa8f713a69f6cc56623ad70373ad6a (patch)
tree80ba6e3d1c0d74a3f116f9c9d31bfd4a448d8374
parent* modules/generators/mod_cgid.c (get_req): Add basic sanity (diff)
downloadapache2-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.h5
-rw-r--r--modules/proxy/mod_proxy.c5
-rw-r--r--server/request.c8
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) {