]> granicus.if.org Git - apache/commitdiff
Add pre_request and post_request proxy hooks.
authorWilliam A. Rowe Jr <wrowe@apache.org>
Wed, 11 Aug 2004 21:56:38 +0000 (21:56 +0000)
committerWilliam A. Rowe Jr <wrowe@apache.org>
Wed, 11 Aug 2004 21:56:38 +0000 (21:56 +0000)
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

modules/proxy/mod_proxy.c
modules/proxy/mod_proxy.h

index 2bc78c002f0024ce0a35433275b1ef5742104b0d..d8401e4c79278951e8ea021a8c0688a6641cf864 100644 (file)
@@ -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)
index 5fd872455979348c1c2255a97bbbe676a4d8c2df..7a617324b492b7ce5c1f7d2a0ab82634be25ca1e 100644 (file)
@@ -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);