]> granicus.if.org Git - apache/commitdiff
Change the scheme handler hook to include worker.
authorWilliam A. Rowe Jr <wrowe@apache.org>
Wed, 11 Aug 2004 22:41:02 +0000 (22:41 +0000)
committerWilliam A. Rowe Jr <wrowe@apache.org>
Wed, 11 Aug 2004 22:41:02 +0000 (22:41 +0000)
We will probably need the balancer too, but that can wait for now.
Other undocumented changes (shame,shame) in proxy_util.c

Submitted by: mturk

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@104600 13f79535-47bb-0310-9956-ffa450edef68

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

index 99181a01cac9f52a1a39b0b7c60acae728ba0247..8b13df36233117c032ef1bb269dcd2ca0ed87ea4 100644 (file)
@@ -619,7 +619,7 @@ static int proxy_handler(request_rec *r)
                 /* handle the scheme */
                 ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server,
                              "Trying to run scheme_handler against proxy");
-                access_status = proxy_run_scheme_handler(r, conf, url, ents[i].hostname, ents[i].port);
+                access_status = proxy_run_scheme_handler(r, worker, conf, url, ents[i].hostname, ents[i].port);
 
                 /* an error or success */
                 if (access_status != DECLINED && access_status != HTTP_BAD_GATEWAY) {
@@ -638,7 +638,7 @@ static int proxy_handler(request_rec *r)
     /* handle the scheme */
     ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server,
                  "Trying to run scheme_handler");
-    access_status = proxy_run_scheme_handler(r, conf, url, NULL, 0);
+    access_status = proxy_run_scheme_handler(r, worker, conf, url, NULL, 0);
     if (DECLINED == access_status) {
         ap_log_error(APLOG_MARK, APLOG_WARNING, 0, r->server,
                     "proxy: No protocol handler was valid for the URL %s. "
@@ -892,7 +892,7 @@ static const char *
         }
     }
     else {
-        proxy_worker *worker = ap_proxy_get_worker(cmd->pool, conf, r);
+        proxy_worker *worker = ap_proxy_get_worker(cmd->temp_pool, conf, r);
         if (!worker) {
             const char *err = ap_proxy_add_worker(&worker, cmd->pool, conf, r);
             if (err)
@@ -1552,13 +1552,14 @@ APR_HOOK_STRUCT(
 )
 
 APR_IMPLEMENT_EXTERNAL_HOOK_RUN_FIRST(proxy, PROXY, int, scheme_handler, 
-                                     (request_rec *r, proxy_server_conf *conf, 
-                                     char *url, const char *proxyhost, 
-                                     apr_port_t proxyport),(r,conf,url,
-                                     proxyhost,proxyport),DECLINED)
+                                     (request_rec *r, proxy_worker *worker,
+                                      proxy_server_conf *conf, 
+                                      char *url, const char *proxyhost, 
+                                      apr_port_t proxyport),(r,worker,conf,
+                                      url,proxyhost,proxyport),DECLINED)
 APR_IMPLEMENT_EXTERNAL_HOOK_RUN_FIRST(proxy, PROXY, int, canon_handler, 
-                                     (request_rec *r, char *url),(r,
-                                     url),DECLINED)
+                                      (request_rec *r, char *url),(r,
+                                      url),DECLINED)
 APR_IMPLEMENT_EXTERNAL_HOOK_RUN_FIRST(proxy, PROXY, int, pre_request, (
                                       proxy_worker **worker,
                                       proxy_balancer **balancer,
index 52d8e8d16d4c2b860dca4104520f3e012bbc4ce8..ddc237c39229fe4f648021b6ebf9da341cdd57db 100644 (file)
@@ -294,7 +294,7 @@ struct proxy_balancer {
         APR_OPTIONAL_HOOK(proxy,name,fn,pre,succ,order)
 
 APR_DECLARE_EXTERNAL_HOOK(proxy, PROXY, int, scheme_handler, (request_rec *r, 
-                          proxy_server_conf *conf, char *url, 
+                          proxy_worker *worker, proxy_server_conf *conf, char *url, 
                           const char *proxyhost, apr_port_t proxyport))
 APR_DECLARE_EXTERNAL_HOOK(proxy, PROXY, int, canon_handler, (request_rec *r, 
                           char *url))
@@ -358,14 +358,14 @@ PROXY_DECLARE(struct proxy_balancer *) ap_proxy_get_balancer(apr_pool_t *p, prox
 PROXY_DECLARE(const char *) ap_proxy_add_balancer(proxy_balancer **balancer, apr_pool_t *p, proxy_server_conf *conf, const char *url);
 PROXY_DECLARE(void) ap_proxy_add_worker_to_balancer(proxy_balancer *balancer, proxy_worker *worker);
 PROXY_DECLARE(int) ap_proxy_pre_request(proxy_worker **worker, proxy_balancer **balancer, request_rec *r, proxy_server_conf *conf, char **url);
-PROXY_DECLARE(apr_status_t) ap_proxy_determine_connection(apr_pool_t *p, request_rec *r, proxy_server_conf *conf, proxy_worker *worker, proxy_conn_rec *conn,
-                                                          apr_pool_t *ppool, apr_uri_t *uri, char **url, const char *proxyname, apr_port_t proxyport,
-                                                          char *server_portstr, int server_portstr_size);
+PROXY_DECLARE(int) ap_proxy_determine_connection(apr_pool_t *p, request_rec *r, proxy_server_conf *conf, proxy_worker *worker, proxy_conn_rec *conn,
+                                                 apr_pool_t *ppool, apr_uri_t *uri, char **url, const char *proxyname, apr_port_t proxyport,
+                                                 char *server_portstr, int server_portstr_size);
 PROXY_DECLARE(int) ap_proxy_acquire_connection(const char *proxy_function, proxy_conn_rec **conn, proxy_worker *worker, server_rec *s);
 PROXY_DECLARE(int) ap_proxy_release_connection(const char *proxy_function, proxy_conn_rec *conn, server_rec *s);
 PROXY_DECLARE(apr_status_t) ap_proxy_close_connection(proxy_conn_rec *conn);
 PROXY_DECLARE(int) ap_proxy_connect_backend(const char *proxy_function, proxy_conn_rec *conn, proxy_worker *worker, server_rec *s);
-PROXY_DECLARE(int) ap_proxy_connection_create(const char *proxy_function, proxy_conn_rec *conn, int close_on_recycle, conn_rec *c, server_rec *s);
+PROXY_DECLARE(int) ap_proxy_connection_create(const char *proxy_function, proxy_conn_rec *conn, conn_rec *c, server_rec *s);
 
 /* For proxy_util */
 extern module PROXY_DECLARE_DATA proxy_module;
index e861053cc7ca1068e759e21d5b3a7c64164846db..4e74e229aea644875b560d0e75cb5f705bc1436f 100644 (file)
@@ -996,7 +996,7 @@ PROXY_DECLARE(proxy_balancer *) ap_proxy_get_balancer(apr_pool_t *p,
     char *c, *uri = apr_pstrdup(p, url);
     int i;
     
-    c = strchr(url, ':');   
+    c = strchr(uri, ':');   
     if (c == NULL || c[1] != '/' || c[2] != '/' || c[3] == '\0')
        return NULL;
     /* remove path from uri */
@@ -1020,7 +1020,7 @@ PROXY_DECLARE(const char *) ap_proxy_add_balancer(proxy_balancer **balancer,
     int port;
     apr_status_t rc = 0;
 
-    c = strchr(url, ':');   
+    c = strchr(uri, ':');   
     if (c == NULL || c[1] != '/' || c[2] != '/' || c[3] == '\0')
        return "Bad syntax for a remote proxy server";
     /* remove path from uri */
@@ -1032,14 +1032,12 @@ PROXY_DECLARE(const char *) ap_proxy_add_balancer(proxy_balancer **balancer,
         if (sscanf(q + 1, "%u", &port) != 1 || port > 65535) {
             return "Bad syntax for a remote proxy server (bad port number)";
         }
-        *q = '\0';
     }
     else
         port = -1;
     ap_str_tolower(uri);
     *balancer = apr_array_push(conf->balancers);
-    (*balancer)->name = apr_pstrdup(p, uri);
-    *c = '\0';
+    (*balancer)->name = uri;
     (*balancer)->workers = apr_array_make(p, 5, sizeof(proxy_runtime_worker));
     /* XXX Is this a right place to create mutex */
 #if APR_HAS_THREADS
@@ -1061,21 +1059,31 @@ PROXY_DECLARE(proxy_worker *) ap_proxy_get_worker(apr_pool_t *p,
     char *c, *uri = apr_pstrdup(p, url);
     int i;
     
-    c = strchr(url, ':');   
+    c = strchr(uri, ':');   
     if (c == NULL || c[1] != '/' || c[2] != '/' || c[3] == '\0')
        return NULL;
     /* remove path from uri */
     if ((c = strchr(c + 3, '/')))
         *c = '\0';
+
     worker = (proxy_worker *)conf->workers->elts;
     for (i = 0; i < conf->workers->nelts; i++) {
-        if (strcasecmp(worker->name, uri) == 0)
+        if (strcasecmp(worker->name, uri) == 0) {
             return worker;
+        }
         worker++;
     }
     return NULL;
 }
 
+static apr_status_t conn_pool_cleanup(void *thepool)
+{
+    proxy_conn_pool *cp = (proxy_conn_pool *)thepool;
+    /* Close the socket */
+    cp->addr = NULL;
+    return APR_SUCCESS;
+}
+
 static void init_conn_pool(apr_pool_t *p, proxy_worker *worker)
 {
     apr_pool_t *pool;
@@ -1091,29 +1099,12 @@ static void init_conn_pool(apr_pool_t *p, proxy_worker *worker)
      * proxy_conn_pool is permanently attached to the worker. 
      */
     cp = (proxy_conn_pool *)apr_pcalloc(p, sizeof(proxy_conn_pool));
-    cp->pool = pool;
-#if APR_HAS_THREADS
-    {
-        int mpm_threads;
-        ap_mpm_query(AP_MPMQ_MAX_THREADS, &mpm_threads);
-        if (mpm_threads > 1) {
-            /* Set hard max to no more then mpm_threads */
-            if (worker->hmax == 0 || worker->hmax > mpm_threads)
-                 worker->hmax = mpm_threads;
-            if (worker->smax == 0 || worker->smax > worker->hmax)
-                 worker->smax = worker->hmax;
-            /* Set min to be lower then smax */
-            if (worker->min > worker->smax)
-                 worker->min = worker->smax; 
-        }
-        else {
-            /* This will supress the apr_reslist creation */
-            worker->min = worker->smax = worker->hmax = 0;
-        }
-    }
-#endif
-    
+    cp->pool = pool;    
     worker->cp = cp;
+    apr_pool_cleanup_register(p, (void *)cp,
+                              conn_pool_cleanup,
+                              apr_pool_cleanup_null);      
+
 }
 
 PROXY_DECLARE(const char *) ap_proxy_add_worker(proxy_worker **worker,
@@ -1136,13 +1127,13 @@ PROXY_DECLARE(const char *) ap_proxy_add_worker(proxy_worker **worker,
         if (sscanf(q + 1, "%u", &port) != 1 || port > 65535) {
             return "Bad syntax for a remote proxy server (bad port number)";
         }
-        *q = '\0';
     }
     else
         port = -1;
     ap_str_tolower(uri);
     *worker = apr_array_push(conf->workers);
-    (*worker)->name = apr_pstrdup(p, url);
+    memset(*worker, 0, sizeof(proxy_worker));
+    (*worker)->name = (*worker)->hostname = apr_pstrdup(p, uri);
     *c = '\0';
     (*worker)->scheme = uri;
     if (port == -1)
@@ -1321,6 +1312,7 @@ static apr_status_t proxy_conn_cleanup(void *theconn)
     if (conn->sock)
         apr_socket_close(conn->sock);
     conn->sock = NULL;
+    conn->pool = NULL;
     return APR_SUCCESS;
 }
 
@@ -1332,7 +1324,6 @@ static apr_status_t connection_cleanup(void *theconn)
         if (conn->sock)
             apr_socket_close(conn->sock);
         conn->sock = NULL;
-
     }
     conn->connection = NULL;
     ap_proxy_release_connection(NULL, conn, NULL);
@@ -1359,7 +1350,8 @@ static apr_status_t connection_constructor(void **resource, void *params,
     *resource = conn;
     /* register the pool cleanup */
     apr_pool_cleanup_register(ctx, (void *)conn,
-                              proxy_conn_cleanup, apr_pool_cleanup_null);      
+                              proxy_conn_cleanup,
+                              apr_pool_cleanup_null);      
 
     ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s,
                  "proxy: socket is constructed");
@@ -1374,11 +1366,20 @@ static apr_status_t connection_destructor(void *resource, void *params,
     proxy_conn_rec *conn = (proxy_conn_rec *)resource;
     server_rec *s = (server_rec *)params;
     
-    apr_pool_destroy(conn->pool);
+#if 0
+    if (conn->sock)
+        apr_socket_close(conn->sock);
+    conn->sock = NULL;
+    apr_pool_cleanup_kill(conn->pool, conn, proxy_conn_cleanup);
+#endif
+    if (conn->pool)
+        apr_pool_destroy(conn->pool);
+    conn->pool = NULL;
+#if 0
     if (s != NULL)
         ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s,
                      "proxy: socket is destructed");
-
+#endif
     return APR_SUCCESS;
 }
 
@@ -1387,6 +1388,7 @@ static apr_status_t connection_destructor(void *resource, void *params,
  */
 PROXY_DECLARE(apr_status_t) ap_proxy_close_connection(proxy_conn_rec *conn)
 {
+
     if (conn->worker && conn->worker->cp)
         conn->worker->cp->conn = NULL;
     return connection_destructor(conn, NULL, NULL);
@@ -1395,7 +1397,25 @@ PROXY_DECLARE(apr_status_t) ap_proxy_close_connection(proxy_conn_rec *conn)
 static apr_status_t init_conn_worker(proxy_worker *worker, server_rec *s)
 {
     apr_status_t rv;
+
 #if APR_HAS_THREADS
+    int mpm_threads;
+
+    ap_mpm_query(AP_MPMQ_MAX_THREADS, &mpm_threads);
+    if (mpm_threads > 1) {
+        /* Set hard max to no more then mpm_threads */
+        if (worker->hmax == 0 || worker->hmax > mpm_threads)
+            worker->hmax = mpm_threads;
+        if (worker->smax == 0 || worker->smax > worker->hmax)
+            worker->smax = worker->hmax;
+        /* Set min to be lower then smax */
+        if (worker->min > worker->smax)
+            worker->min = worker->smax; 
+    }
+    else {
+        /* This will supress the apr_reslist creation */
+        worker->min = worker->smax = worker->hmax = 0;
+    }
     if (worker->hmax) {
         rv = apr_reslist_create(&(worker->cp->res),
                                 worker->min, worker->smax,
@@ -1424,6 +1444,17 @@ PROXY_DECLARE(int) ap_proxy_acquire_connection(const char *proxy_function,
                                                server_rec *s)
 {
     apr_status_t rv;
+
+    if (!worker->status) {
+        if ((rv = init_conn_worker(worker, s)) != APR_SUCCESS) {
+            ap_log_error(APLOG_MARK, APLOG_ERR, rv, s,
+                         "proxy: %s: failed to initialize worker for (%s)",
+                         proxy_function, worker->hostname);
+            return DECLINED;
+        }
+        /* TODO: make worker status codes */
+        worker->status = 1;
+    }
 #if APR_HAS_THREADS
     if (worker->hmax) {
         rv = apr_reslist_acquire(worker->cp->res, (void **)conn);
@@ -1474,7 +1505,7 @@ PROXY_DECLARE(int) ap_proxy_release_connection(const char *proxy_function,
         apr_pool_cleanup_kill(conn->connection->pool, conn, connection_cleanup);
 
 #if APR_HAS_THREADS
-    if (worker->hmax) {
+    if (worker->hmax && worker->cp->res) {
         rv = apr_reslist_release(worker->cp->res, (void *)conn);
     }
     else
@@ -1491,7 +1522,7 @@ PROXY_DECLARE(int) ap_proxy_release_connection(const char *proxy_function,
     return OK;
 }
 
-PROXY_DECLARE(apr_status_t)
+PROXY_DECLARE(int)
 ap_proxy_determine_connection(apr_pool_t *p, request_rec *r,
                               proxy_server_conf *conf,
                               proxy_worker *worker,
@@ -1691,7 +1722,6 @@ PROXY_DECLARE(int) ap_proxy_connect_backend(const char *proxy_function,
 
 PROXY_DECLARE(int) ap_proxy_connection_create(const char *proxy_function,
                                               proxy_conn_rec *conn,
-                                              int close_on_recycle,
                                               conn_rec *c,
                                               server_rec *s)
 {
@@ -1733,7 +1763,6 @@ PROXY_DECLARE(int) ap_proxy_connection_create(const char *proxy_function,
         /* TODO: See if this will break FTP */
         ap_proxy_ssl_disable(conn->connection);
     }
-    conn->close_on_recycle = close_on_recycle;
 
     ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s,
                  "proxy: %s: connection complete to %pI (%s)",
@@ -1745,7 +1774,8 @@ PROXY_DECLARE(int) ap_proxy_connection_create(const char *proxy_function,
     /* register the connection cleanup to client connection
      * so that the connection can be closed or reused
      */
-    apr_pool_cleanup_register(c->pool, (void *)conn, connection_cleanup,
+    apr_pool_cleanup_register(conn->connection->pool, (void *)conn,
+                              connection_cleanup,
                               apr_pool_cleanup_null);      
 
     return OK;