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

This patch adds a new hook (request_status) that gets ran in proxy_handler

just before the final return.  This gives modules an opportunity to do
something based on the proxy status.

A couple of examples where this is useful:

-You are using a caching module and would rather return stale content rather
than an error to the client if the origin is down.

-you proxy some subrequests (using SSI - mod_include) and do not want SSI
errors when the backend is down. If you would normally return
HTTP_BAD_GATEWAY, you may have a module that serves some other content.


new hook -- so mmn bump.. i made it a major one, hope thats ok 

Patch From Brian Akins <Brian.Akins turner.com>




git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@219372 13f79535-47bb-0310-9956-ffa450edef68
parent 2552ba63
Loading
Loading
Loading
Loading
+5 −0
Changes for CHANGES: 5 added lines, 0 removed lines.
Original line number Diff line number Diff line
Changes with Apache 2.1.7
  [Remove entries to the current 2.0 section below, when backported]
  
  *)  new hook (request_status) that gets ran in proxy_handler just before 
      the final return.  This gives modules an opportunity to do something 
      based on the proxy status. (major MMN bump)
      [Brian Akins <bakins turner.com>, Ian Holsman]
  *) SECURITY: CAN-2005-2088
     proxy: Correctly handle the Transfer-Encoding and Content-Length
     headers.  Discard the request Content-Length whenever T-E: chunked
+2 −1
Changes for include/ap_mmn.h: 2 added lines, 1 removed line.
Original line number Diff line number Diff line
@@ -99,12 +99,13 @@
 * 20050701.0 (2.1.7-dev) Bump MODULE_MAGIC_COOKIE to "AP21"!
 * 20050701.1 (2.1.7-dev) trace_enable member added to core server_config
 * 20050708.0 (2.1.7-dev) Bump MODULE_MAGIC_COOKIE to "AP22"!
 * 20050717.0 (2.1.7-dev) add proxy request_status hook
  */

#define MODULE_MAGIC_COOKIE 0x41503232UL /* "AP22" */

#ifndef MODULE_MAGIC_NUMBER_MAJOR
#define MODULE_MAGIC_NUMBER_MAJOR 20050708
#define MODULE_MAGIC_NUMBER_MAJOR 20050717
#endif
#define MODULE_MAGIC_NUMBER_MINOR 0                     /* 0...n */

+9 −1
Changes for modules/proxy/mod_proxy.c: 9 added lines, 1 removed line.
Original line number Diff line number Diff line
@@ -732,9 +732,12 @@ cleanup:
        int post_status = proxy_run_post_request(worker, balancer, r, conf);
        if (post_status == DECLINED) {
            post_status = OK; /* no post_request handler available */
            /* TODO: reclycle direct worker */
            /* TODO: recycle direct worker */
        }
    }

    proxy_run_request_status(&access_status, r);

    return access_status;
}

@@ -1881,6 +1884,7 @@ APR_HOOK_STRUCT(
    APR_HOOK_LINK(canon_handler)
    APR_HOOK_LINK(pre_request)
    APR_HOOK_LINK(post_request)
    APR_HOOK_LINK(request_status)
)

APR_IMPLEMENT_EXTERNAL_HOOK_RUN_FIRST(proxy, PROXY, int, scheme_handler, 
@@ -1908,3 +1912,7 @@ APR_IMPLEMENT_EXTERNAL_HOOK_RUN_FIRST(proxy, PROXY, int, post_request,
APR_IMPLEMENT_OPTIONAL_HOOK_RUN_ALL(proxy, PROXY, int, fixups,
                                    (request_rec *r), (r),
                                    OK, DECLINED)
APR_IMPLEMENT_OPTIONAL_HOOK_RUN_ALL(proxy, PROXY, int, request_status,
                                    (int *status, request_rec *r), 
                                    (status, r),
                                    OK, DECLINED)
+15 −0
Changes for modules/proxy/mod_proxy.h: 15 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -375,6 +375,13 @@ APR_DECLARE_EXTERNAL_HOOK(proxy, PROXY, int, post_request, (proxy_worker *worker
                          proxy_balancer *balancer, request_rec *r,
                          proxy_server_conf *conf))

/**
 * request status hook
 * It is called after all proxy processing has been done.  This gives other
 * modules a chance to create default content on failure, for example
 */
APR_DECLARE_EXTERNAL_HOOK(proxy, PROXY, int, request_status,
                          (int *status, request_rec *r))

/* proxy_util.c */

@@ -541,6 +548,14 @@ PROXY_DECLARE(int) ap_proxy_post_request(proxy_worker *worker,
                                         proxy_balancer *balancer,
                                         request_rec *r,
                                         proxy_server_conf *conf);

/**
 * Request status function
 * @param status   status of proxy request
 * @return         OK or DECLINED
 */
 PROXY_DECLARE(int) ap_proxy_request_status(int *status, request_rec *r);

/**
 * Deternime backend hostname and port
 * @param p       memory pool used for processing