Commit cae711ef authored by Ian Holsman's avatar Ian Holsman
Browse files

Added New Option 'HTTPProxyOverrideReturnedErrors' which lets the server override

the error pages returned from the proxied server and replace them with the standard
server error handling on the main server.

Reviewed by:	Graham, Chuck


git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@91092 13f79535-47bb-0310-9956-ffa450edef68
parent 16492e68
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
mod_proxy changes for httpd 2.0.26-dev
  *) Add New option 'HTTPProxyOverrideReturnedErrors'. By Turning the
     Flag on, you will mask the error pages returned by the proxied
     server, and will it will be handled as if your server generated
     the error. This change was put in so that a 404 on a included
     r-proxied component will act in the same manner as a 404 on a 
     included file. [Ian Holsman <ianh@cnet.com>]

mod_proxy changes for httpd 2.0.25-dev

  *) Split proxy: space using <Proxy[Match] > directive blocks from
+12 −1
Original line number Diff line number Diff line
@@ -482,7 +482,7 @@ static void * create_proxy_config(apr_pool_t *p, server_rec *s)
    ps->recv_buffer_size_set = 0;
    ps->maxfwd = DEFAULT_MAX_FORWARDS;
    ps->maxfwd_set = 0;

    ps->HTTPOverrideErrors=0; 
    return ps;
}

@@ -760,6 +760,15 @@ static const char *
    psf->req_set = 1;
    return NULL;
}
static const char *
    set_http_proxy_override_error(cmd_parms *parms, void *dummy, int flag)
{
    proxy_server_conf *psf =
    ap_get_module_config(parms->server->module_config, &proxy_module);

    psf->HTTPOverrideErrors  = flag;
    return NULL;
}

static const char *
    set_recv_buffer_size(cmd_parms *parms, void *dummy, const char *arg)
@@ -931,6 +940,8 @@ static const command_rec proxy_cmds[] =
     "A list of ports which CONNECT may connect to"),
    AP_INIT_TAKE1("ProxyVia", set_via_opt, NULL, RSRC_CONF,
     "Configure Via: proxy header header to one of: on | off | block | full"),
    AP_INIT_FLAG("HTTPProxyOverrideReturnedErrors", set_http_proxy_override_error, NULL, RSRC_CONF,
     "use our error handling pages instead of the servers we are proxying"),
    {NULL}
};

+10 −0
Original line number Diff line number Diff line
@@ -177,6 +177,16 @@ typedef struct {
    char recv_buffer_size_set;
    long maxfwd;
    char maxfwd_set;
    /** 
     * the following setting masks the error  page
     * returned from the 'proxied server' and just 
     * forwards the status code upwards.
     * This allows the main server (us) to generate
     * the error page, (so it will look like a error
     * returned from the rest of the system 
     */
    int HTTPOverrideErrors;

} proxy_server_conf;

typedef struct {
+29 −14
Original line number Diff line number Diff line
@@ -824,8 +824,16 @@ apr_status_t ap_proxy_http_process_response(apr_pool_t * p, request_rec *r,
            ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, 0, r->server,
                         "proxy: start body send");
    
            /*
             * if we are overriding the errors, we cant put the content of the
             * page into the brigade
             */
            if ( (conf->HTTPOverrideErrors ==0) || r->status < 400 ) {
            /* read the body, pass it to the output filters */
            while (ap_get_brigade(rp->input_filters, bb, AP_MODE_NONBLOCKING, &readbytes) == APR_SUCCESS) {
                while (ap_get_brigade(rp->input_filters, 
                                       bb, 
                                      AP_MODE_NONBLOCKING, 
                                      &readbytes) == APR_SUCCESS) {
#if DEBUGGING
                    ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, 0,
                                 r->server, "proxy (PID %d): readbytes: %#x",
@@ -843,6 +851,7 @@ apr_status_t ap_proxy_http_process_response(apr_pool_t * p, request_rec *r,
                    }
                    apr_brigade_cleanup(bb);
                }
            }
            ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, 0, r->server,
                         "proxy: end body send");
        } else {
@@ -850,6 +859,10 @@ apr_status_t ap_proxy_http_process_response(apr_pool_t * p, request_rec *r,
                         "proxy: header only");
        }
    }

    if ( conf->HTTPOverrideErrors )
        return r->status;
    else 
        return OK;
}

@@ -954,6 +967,8 @@ int ap_proxy_http_handler(request_rec *r, proxy_server_conf *conf,
    status = ap_proxy_http_process_response(p, r, p_conn, origin, backend, conf,
                                            bb, server_portstr);
    if ( status != OK ) {
        /* clean up even if there is an error */
        ap_proxy_http_cleanup(r, p_conn, backend);
        return status;
    }