From: William A. Rowe Jr Date: Wed, 11 Aug 2004 21:56:38 +0000 (+0000) Subject: Add pre_request and post_request proxy hooks. X-Git-Tag: post_ajp_proxy~54 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=01f7f51f5b81835b791438f492e923c11742161f;p=apache Add pre_request and post_request proxy hooks. They will be mainly used for loadbalancers for finding and maintaining workers. Submitted by: mturk git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@104576 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/modules/proxy/mod_proxy.c b/modules/proxy/mod_proxy.c index 2bc78c002f..d8401e4c79 100644 --- a/modules/proxy/mod_proxy.c +++ b/modules/proxy/mod_proxy.c @@ -473,6 +473,8 @@ static int proxy_handler(request_rec *r) int direct_connect = 0; const char *str; long maxfwd; + struct proxy_balancer *balancer = NULL; + proxy_worker *worker = NULL; /* is this for us? */ if (!r->proxyreq || !r->filename || strncmp(r->filename, "proxy:", 6) != 0) @@ -549,7 +551,12 @@ static int proxy_handler(request_rec *r) r->uri); #endif } - + /* Try to obtain the most suitable worker */ + access_status = proxy_run_pre_request(&worker, &balancer, r, conf, &url); + if (access_status != DECLINED && access_status != OK) { + return access_status; + } + /* firstly, try a proxy, unless a NoProxy directive is active */ if (!direct_connect) { for (i = 0; i < proxies->nelts; i++) { @@ -591,6 +598,11 @@ static int proxy_handler(request_rec *r) "using LoadModule.", r->uri); return HTTP_FORBIDDEN; } + access_status = proxy_run_post_request(worker, balancer, r, conf); + if (access_status == DECLINED) { + access_status = OK; /* no post_request handler available */ + /* TODO: reclycle direct worker */ + } return access_status; } @@ -1481,6 +1493,8 @@ module AP_MODULE_DECLARE_DATA proxy_module = APR_HOOK_STRUCT( APR_HOOK_LINK(scheme_handler) APR_HOOK_LINK(canon_handler) + APR_HOOK_LINK(pre_request) + APR_HOOK_LINK(post_request) ) APR_IMPLEMENT_EXTERNAL_HOOK_RUN_FIRST(proxy, PROXY, int, scheme_handler, @@ -1491,6 +1505,19 @@ APR_IMPLEMENT_EXTERNAL_HOOK_RUN_FIRST(proxy, PROXY, int, scheme_handler, APR_IMPLEMENT_EXTERNAL_HOOK_RUN_FIRST(proxy, PROXY, int, canon_handler, (request_rec *r, char *url),(r, url),DECLINED) +APR_IMPLEMENT_EXTERNAL_HOOK_RUN_FIRST(proxy, PROXY, int, pre_request, ( + proxy_worker **worker, + struct proxy_balancer **balancer, + request_rec *r, + proxy_server_conf *conf, + char **url),(worker,balancer, + r,conf,url),DECLINED) +APR_IMPLEMENT_EXTERNAL_HOOK_RUN_FIRST(proxy, PROXY, int, post_request, + (proxy_worker *worker, + struct proxy_balancer *balancer, + request_rec *r, + proxy_server_conf *conf),(worker, + balancer,r,conf),DECLINED) APR_IMPLEMENT_OPTIONAL_HOOK_RUN_ALL(proxy, PROXY, int, fixups, (request_rec *r), (r), OK, DECLINED) diff --git a/modules/proxy/mod_proxy.h b/modules/proxy/mod_proxy.h index 5fd8724559..7a617324b4 100644 --- a/modules/proxy/mod_proxy.h +++ b/modules/proxy/mod_proxy.h @@ -249,6 +249,14 @@ struct proxy_balancer { #endif }; +/* data structure for set/get module_config */ +typedef struct { + char *url; /* rewtitten url */ + struct proxy_balancer *balancer; /* load balancer to use */ + proxy_worker *worker; /* most suitable worker */ + void *opaque; /* module private data */ +} proxy_module_conf; + /* hooks */ /* Create a set of PROXY_DECLARE(type), PROXY_DECLARE_NONSTD(type) and @@ -288,6 +296,27 @@ APR_DECLARE_EXTERNAL_HOOK(proxy, PROXY, int, canon_handler, (request_rec *r, APR_DECLARE_EXTERNAL_HOOK(proxy, PROXY, int, create_req, (request_rec *r, request_rec *pr)) APR_DECLARE_EXTERNAL_HOOK(proxy, PROXY, int, fixups, (request_rec *r)) +/** + * pre request hook. + * It will return the most suitable worker at the moment + * and coresponding balancer. + * The url is rewritten from balancer://cluster/uri to scheme://host:port/uri + * and then the scheme_handler is called. + * + */ +APR_DECLARE_EXTERNAL_HOOK(proxy, PROXY, int, pre_request, (proxy_worker **worker, + struct proxy_balancer **balancer, + request_rec *r, + proxy_server_conf *conf, char **url)) +/** + * post request hook. + * It is called after request for updating runtime balancer status. + */ +APR_DECLARE_EXTERNAL_HOOK(proxy, PROXY, int, post_request, (proxy_worker *worker, + struct proxy_balancer *balancer, request_rec *r, + proxy_server_conf *conf)) + + /* proxy_util.c */ PROXY_DECLARE(request_rec *)ap_proxy_make_fake_req(conn_rec *c, request_rec *r);