Commit 9f86af19 authored by Jim Jagielski's avatar Jim Jagielski
Browse files

*) mod_proxy_ajp: Add support for 'ProxyErrorOverride on'. PR 50945.

     [Peter Pramberger <peter pramberger.at>, Jim Jagielski]

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1087864 13f79535-47bb-0310-9956-ffa450edef68
parent 3ccc71f4
Loading
Loading
Loading
Loading
+4 −1
Changes for CHANGES: 4 added lines, 1 removed line.
Original line number Diff line number Diff line
@@ -2,7 +2,10 @@

Changes with Apache 2.3.12

  *) mod_proxy_fcgi: Add support for 'ProxyErrorOverride on' PR 50913.
  *) mod_proxy_ajp: Add support for 'ProxyErrorOverride on'. PR 50945.
     [Peter Pramberger <peter pramberger.at>, Jim Jagielski]

  *) mod_proxy_fcgi: Add support for 'ProxyErrorOverride on'. PR 50913.
     [Mark Montague <mark catseye.org>, Jim Jagielski]

  *) core: Change the APIs of ap_cfg_getline() and ap_cfg_getc() to return an
+46 −0
Changes for modules/proxy/mod_proxy_ajp.c: 46 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -190,6 +190,8 @@ static int ap_proxy_ajp_request(apr_pool_t *p, request_rec *r,
    apr_size_t maxsize = AJP_MSG_BUFFER_SZ;
    int send_body = 0;
    apr_off_t content_length = 0;
    int original_status = r->status;
    const char *original_status_line = r->status_line;

    if (psf->io_buffer_size_set)
       maxsize = psf->io_buffer_size;
@@ -430,12 +432,27 @@ static int ap_proxy_ajp_request(apr_pool_t *p, request_rec *r,
                if (status != APR_SUCCESS) {
                    backend_failed = 1;
                }
                else if ((r->status == 401) && conf->error_override) {
                    const char *buf;
                    const char *wa = "WWW-Authenticate";
                    if ((buf = apr_table_get(r->headers_out, wa))) {
                        apr_table_set(r->err_headers_out, wa, buf);
                    } else {
                        ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server,
                                     "ap_proxy_ajp_request: origin server "
                                     "sent 401 without WWW-Authenticate header");
                    }
                }
                headers_sent = 1;
                break;
            case CMD_AJP13_SEND_BODY_CHUNK:
                /* AJP13_SEND_BODY_CHUNK: piece of data */
                status = ajp_parse_data(r, conn->data, &size, &send_body_chunk_buff);
                if (status == APR_SUCCESS) {
                    /* If we are overriding the errors, we can't put the content
                     * of the page into the brigade.
                     */
                    if (!conf->error_override || !ap_is_HTTP_ERROR(r->status)) {
                        /* AJP13_SEND_BODY_CHUNK with zero length
                         * is explicit flush message
                         */
@@ -452,6 +469,17 @@ static int ap_proxy_ajp_request(apr_pool_t *p, request_rec *r,
                        else {
                            apr_status_t rv;
    
                            /* Handle the case where the error document is itself reverse
                             * proxied and was successful. We must maintain any previous
                             * error status so that an underlying error (eg HTTP_NOT_FOUND)
                             * doesn't become an HTTP_OK.
                             */
                            if (conf->error_override && !ap_is_HTTP_ERROR(r->status)
                                    && ap_is_HTTP_ERROR(original_status)) {
                                r->status = original_status;
                                r->status_line = original_status_line;
                            }
    
                            e = apr_bucket_transient_create(send_body_chunk_buff, size,
                                                        r->connection->bucket_alloc);
                            APR_BRIGADE_INSERT_TAIL(output_brigade, e);
@@ -480,11 +508,17 @@ static int ap_proxy_ajp_request(apr_pool_t *p, request_rec *r,
                        data_sent = 1;
                        apr_brigade_cleanup(output_brigade);
                    }
                }
                else {
                    backend_failed = 1;
                }
                break;
            case CMD_AJP13_END_RESPONSE:
                /* If we are overriding the errors, we must not send anything to
                 * the client, especially as the brigade already contains headers.
                 * So do nothing here, and it will be cleaned up below.
                 */
                if (!conf->error_override || !ap_is_HTTP_ERROR(r->status)) {
                    e = apr_bucket_eos_create(r->connection->bucket_alloc);
                    APR_BRIGADE_INSERT_TAIL(output_brigade, e);
                    if (ap_pass_brigade(r->output_filters,
@@ -495,6 +529,7 @@ static int ap_proxy_ajp_request(apr_pool_t *p, request_rec *r,
                    }
                    /* XXX: what about flush here? See mod_jk */
                    data_sent = 1;
                }
                request_ended = 1;
                break;
            default:
@@ -569,8 +604,19 @@ static int ap_proxy_ajp_request(apr_pool_t *p, request_rec *r,
                     "proxy: got response from %pI (%s)",
                     conn->worker->cp->addr,
                     conn->worker->s->hostname);

        if (conf->error_override && ap_is_HTTP_ERROR(r->status)) {
            /* clear r->status for override error, otherwise ErrorDocument
             * thinks that this is a recursive error, and doesn't find the
             * custom error page
             */
            rv = r->status;
            r->status = HTTP_OK;
        }
        else {
            rv = OK;
        }
    }

    if (backend_failed) {
        ap_log_error(APLOG_MARK, APLOG_ERR, status, r->server,