From: Ruediger Pluem Date: Sat, 24 May 2014 20:55:52 +0000 (+0000) Subject: * Give ap_proxy_post_request as chance to act correctly on the status code X-Git-Tag: 2.5.0-alpha~4143 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=a902bda00305697d3bea379db7aa0894de8e5a1e;p=apache * Give ap_proxy_post_request as chance to act correctly on the status code by setting r->status temporarily to access_status. r->status might be different than access_status e.g. r->status could be HTTP_OK if e.g. we override the error page on the proxy or if the error was not generated by the backend itself but by the proxy e.g. a bad gateway. git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1597352 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/modules/proxy/mod_proxy.c b/modules/proxy/mod_proxy.c index 2c16318f79..559c5c767c 100644 --- a/modules/proxy/mod_proxy.c +++ b/modules/proxy/mod_proxy.c @@ -925,6 +925,7 @@ static int proxy_handler(request_rec *r) proxy_worker *worker = NULL; int attempts = 0, max_attempts = 0; struct dirconn_entry *list = (struct dirconn_entry *)conf->dirconn->elts; + int saved_status; /* is this for us? */ if (!r->filename) { @@ -1200,7 +1201,23 @@ static int proxy_handler(request_rec *r) goto cleanup; } cleanup: + /* + * Save current r->status and set it to the value of access_status which + * might be different (e.g. r->status could be HTTP_OK if e.g. we override + * the error page on the proxy or if the error was not generated by the + * backend itself but by the proxy e.g. a bad gateway) in order to give + * ap_proxy_post_request a chance to act correctly on the status code. + */ + saved_status = r->status; + r->status = access_status; ap_proxy_post_request(worker, balancer, r, conf); + /* + * Only restore r->status if it has not been changed by + * ap_proxy_post_request as we assume that this change was intentional. + */ + if (r->status == access_status) { + r->status = saved_status; + } proxy_run_request_status(&access_status, r); AP_PROXY_RUN_FINISHED(r, attempts, access_status);