You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by rj...@apache.org on 2008/01/18 22:14:25 UTC

svn commit: r613274 - in /tomcat/connectors/trunk/jk/native: apache-1.3/ apache-2.0/ common/ iis/

Author: rjung
Date: Fri Jan 18 13:14:24 2008
New Revision: 613274

URL: http://svn.apache.org/viewvc?rev=613274&view=rev
Log:
Add extension attribute parsing to uri worker map.
First uses are reply_timeout and activation status per mount.
Usage currently only implemented for httpd, IIS to follow.

Modified:
    tomcat/connectors/trunk/jk/native/apache-1.3/mod_jk.c
    tomcat/connectors/trunk/jk/native/apache-2.0/mod_jk.c
    tomcat/connectors/trunk/jk/native/common/jk_ajp_common.c
    tomcat/connectors/trunk/jk/native/common/jk_lb_worker.h
    tomcat/connectors/trunk/jk/native/common/jk_service.h
    tomcat/connectors/trunk/jk/native/common/jk_uri_worker_map.c
    tomcat/connectors/trunk/jk/native/common/jk_uri_worker_map.h
    tomcat/connectors/trunk/jk/native/common/jk_util.c
    tomcat/connectors/trunk/jk/native/iis/jk_isapi_plugin.c

Modified: tomcat/connectors/trunk/jk/native/apache-1.3/mod_jk.c
URL: http://svn.apache.org/viewvc/tomcat/connectors/trunk/jk/native/apache-1.3/mod_jk.c?rev=613274&r1=613273&r2=613274&view=diff
==============================================================================
--- tomcat/connectors/trunk/jk/native/apache-1.3/mod_jk.c (original)
+++ tomcat/connectors/trunk/jk/native/apache-1.3/mod_jk.c Fri Jan 18 13:14:24 2008
@@ -612,6 +612,7 @@
     request_rec *r = private_data->r;
     char *ssl_temp = NULL;
     const char *reply_timeout = NULL;
+    rule_extension_t *e;
 
     /* Copy in function pointers (which are really methods) */
     s->start_response = ws_start_response;
@@ -642,9 +643,20 @@
     if (conf->options & JK_OPT_FLUSHEADER)
         s->flush_header = 1;
 
+    e = (rule_extension_t *)ap_get_module_config(r->request_config, &jk_module);
+    if (e) {
+        s->extension.reply_timeout = e->reply_timeout;
+        if (e->activation) {
+            s->extension.activation = ap_palloc(r->pool, e->size * sizeof(int));
+            memcpy(s->extension.activation, e->activation, e->size * sizeof(int));
+        }
+    }
     reply_timeout = ap_table_get(r->subprocess_env, "JK_REPLY_TIMEOUT");
-    if (reply_timeout)
-        s->reply_timeout = atoi(reply_timeout);
+    if (reply_timeout) {
+        int r = atoi(reply_timeout);
+        if (r >= 0)
+            s->extension.reply_timeout = r;
+    }
 
     if (conf->options & JK_OPT_DISABLEREUSE)
         s->disable_reuse = 1;
@@ -2712,6 +2724,13 @@
                       "Error in creating the workers."
                       " Please consult your mod_jk log file '%s'.", conf->log_file);
     }
+    uri_worker_map_ext(conf->uw_map, conf->log);
+    for (srv = s; srv; srv = srv->next) {
+        jk_server_conf_t *sconf = (jk_server_conf_t *)ap_get_module_config(srv->module_config,
+                                                                           &jk_module);
+        if (conf->uw_map != sconf->uw_map)
+            uri_worker_map_ext(sconf->uw_map, sconf->log);
+    }
 
 }
 
@@ -2722,6 +2741,10 @@
  */
 static int jk_translate(request_rec * r)
 {
+    rule_extension_t **ext = ap_palloc(r->pool, sizeof(rule_extension_t *));
+    *ext = NULL;
+    ap_set_module_config(r->request_config, &jk_module, ext);
+
     if (!r->proxyreq) {
         jk_server_conf_t *conf =
             (jk_server_conf_t *) ap_get_module_config(r->server->
@@ -2749,9 +2772,12 @@
                            r->uri);
                 return DECLINED;
             }
-            else
-                worker = map_uri_to_worker(conf->uw_map, clean_uri,
-                                           NULL, conf->log);
+            else {
+                rule_extension_t *e;
+                worker = map_uri_to_worker_ext(conf->uw_map, clean_uri,
+                                               NULL, &e, conf->log);
+                ap_set_module_config(r->request_config, &jk_module, e);
+            }
 
             /* Don't know the worker, ForwardDirectories is set, there is a
              * previous request for which the handler is JK_HANDLER (as set by

Modified: tomcat/connectors/trunk/jk/native/apache-2.0/mod_jk.c
URL: http://svn.apache.org/viewvc/tomcat/connectors/trunk/jk/native/apache-2.0/mod_jk.c?rev=613274&r1=613273&r2=613274&view=diff
==============================================================================
--- tomcat/connectors/trunk/jk/native/apache-2.0/mod_jk.c (original)
+++ tomcat/connectors/trunk/jk/native/apache-2.0/mod_jk.c Fri Jan 18 13:14:24 2008
@@ -626,6 +626,7 @@
     request_rec *r = private_data->r;
     char *ssl_temp = NULL;
     const char *reply_timeout = NULL;
+    rule_extension_t *e;
 
     /* Copy in function pointers (which are really methods) */
     s->start_response = ws_start_response;
@@ -654,9 +655,20 @@
     if (conf->options & JK_OPT_FLUSHEADER)
         s->flush_header = 1;
 
+    e = (rule_extension_t *)ap_get_module_config(r->request_config, &jk_module);
+    if (e) {
+        s->extension.reply_timeout = e->reply_timeout;
+        if (e->activation) {
+            s->extension.activation = apr_palloc(r->pool, e->size * sizeof(int));
+            memcpy(s->extension.activation, e->activation, e->size * sizeof(int));
+        }
+    }
     reply_timeout = apr_table_get(r->subprocess_env, "JK_REPLY_TIMEOUT");
-    if (reply_timeout)
-        s->reply_timeout = atoi(reply_timeout);
+    if (reply_timeout) {
+        int r = atoi(reply_timeout);
+        if (r >= 0)
+            s->extension.reply_timeout = r;
+    }
 
     if (conf->options & JK_OPT_DISABLEREUSE)
         s->disable_reuse = 1;
@@ -2196,9 +2208,12 @@
                            xconf->s->server_hostname ? xconf->s->server_hostname : "_default_",
                            r->uri);
             }
-            else
-                worker_name = map_uri_to_worker(xconf->uw_map, r->uri,
-                                                NULL, xconf->log);
+            else {
+                rule_extension_t *e;
+                worker_name = map_uri_to_worker_ext(xconf->uw_map, r->uri,
+                                                    NULL, &e, xconf->log);
+                ap_set_module_config(r->request_config, &jk_module, e);
+            }
 
             if (worker_name == NULL && worker_env.num_of_workers) {
                 worker_name = worker_env.worker_list[0];
@@ -2951,6 +2966,14 @@
             conf->was_initialized = JK_TRUE;
             if (init_jk(pconf, conf, s) == JK_FALSE)
                 return HTTP_INTERNAL_SERVER_ERROR;
+            uri_worker_map_ext(conf->uw_map, conf->log);
+            for (srv = s; srv; srv = srv->next) {
+                jk_server_conf_t *sconf = (jk_server_conf_t *)ap_get_module_config(srv->module_config,
+                                                                                   &jk_module);
+                if (conf->uw_map != sconf->uw_map)
+                    uri_worker_map_ext(sconf->uw_map, sconf->log);
+            }
+
         }
     }
 
@@ -2962,6 +2985,10 @@
  */
 static int jk_translate(request_rec * r)
 {
+    rule_extension_t **ext = apr_palloc(r->pool, sizeof(rule_extension_t *));
+    *ext = NULL;
+    ap_set_module_config(r->request_config, &jk_module, ext);
+
     if (!r->proxyreq) {
         jk_server_conf_t *conf =
             (jk_server_conf_t *) ap_get_module_config(r->server->
@@ -3032,9 +3059,12 @@
                            r->uri);
                 return DECLINED;
             }
-            else
-                worker = map_uri_to_worker(conf->uw_map, r->uri,
-                                           NULL, conf->log);
+            else {
+                rule_extension_t *e;
+                worker = map_uri_to_worker_ext(conf->uw_map, r->uri,
+                                               NULL, &e, conf->log);
+                ap_set_module_config(r->request_config, &jk_module, e);
+            }
 
             if (worker) {
                 r->handler = apr_pstrdup(r->pool, JK_HANDLER);
@@ -3189,9 +3219,12 @@
                            r->uri);
                 return DECLINED;
             }
-            else
-                worker = map_uri_to_worker(conf->uw_map, r->uri,
-                                           NULL, conf->log);
+            else {
+                rule_extension_t *e;
+                worker = map_uri_to_worker_ext(conf->uw_map, r->uri,
+                                               NULL, &e, conf->log);
+                ap_set_module_config(r->request_config, &jk_module, e);
+            }
 
             if (worker) {
                 r->handler = apr_pstrdup(r->pool, JK_HANDLER);

Modified: tomcat/connectors/trunk/jk/native/common/jk_ajp_common.c
URL: http://svn.apache.org/viewvc/tomcat/connectors/trunk/jk/native/common/jk_ajp_common.c?rev=613274&r1=613273&r2=613274&view=diff
==============================================================================
--- tomcat/connectors/trunk/jk/native/common/jk_ajp_common.c (original)
+++ tomcat/connectors/trunk/jk/native/common/jk_ajp_common.c Fri Jan 18 13:14:24 2008
@@ -1816,8 +1816,7 @@
     while (1) {
         int rc = 0;
         /* Allow to overwrite reply_timeout on a per URL basis via service struct */
-        int reply_timeout = s->reply_timeout;
-
+        int reply_timeout = s->extension.reply_timeout;
         if (reply_timeout < 0)
             reply_timeout = p->worker->reply_timeout;
         /* If we set a reply timeout, check if something is available */

Modified: tomcat/connectors/trunk/jk/native/common/jk_lb_worker.h
URL: http://svn.apache.org/viewvc/tomcat/connectors/trunk/jk/native/common/jk_lb_worker.h?rev=613274&r1=613273&r2=613274&view=diff
==============================================================================
--- tomcat/connectors/trunk/jk/native/common/jk_lb_worker.h (original)
+++ tomcat/connectors/trunk/jk/native/common/jk_lb_worker.h Fri Jan 18 13:14:24 2008
@@ -82,6 +82,11 @@
 #define JK_LB_STATE_TEXT_PROBE         ("ERR/PRB")
 #define JK_LB_STATE_TEXT_MAX           (JK_LB_STATE_PROBE)
 #define JK_LB_STATE_TEXT_DEF           (JK_LB_STATE_TEXT_IDLE)
+/* JK_LB_ACTIVATION_UNSET is not allowed as an actual worker state. */
+/* It will not work e.g. when the status worker tries to show the state. */
+/* It is only used in rule extension data to indicate, that the */
+/* activation state should not be overwritten. */
+#define JK_LB_ACTIVATION_UNSET         (-1)
 #define JK_LB_ACTIVATION_ACTIVE        (0)
 #define JK_LB_ACTIVATION_DISABLED      (1)
 #define JK_LB_ACTIVATION_STOPPED       (2)

Modified: tomcat/connectors/trunk/jk/native/common/jk_service.h
URL: http://svn.apache.org/viewvc/tomcat/connectors/trunk/jk/native/common/jk_service.h?rev=613274&r1=613273&r2=613274&view=diff
==============================================================================
--- tomcat/connectors/trunk/jk/native/common/jk_service.h (original)
+++ tomcat/connectors/trunk/jk/native/common/jk_service.h Fri Jan 18 13:14:24 2008
@@ -75,6 +75,16 @@
 typedef struct jk_endpoint jk_endpoint_t;
 typedef struct jk_worker jk_worker_t;
 
+struct svc_extension
+{
+    /* reply_timeout overwrite */
+    int reply_timeout;
+    /* activation state overwrites for load balancers */
+    /* Dynamically allocated array with one entry per lb member. */
+    int *activation;
+};
+typedef struct svc_extension svc_extension_t;
+
 /*
  * The web server service 'class'.  An instance of this class is created
  * for each request which is forwarded from the web server to the servlet
@@ -222,9 +232,9 @@
     int flush_header;
 
     /*
-     * If >= 0, overwrite the worker reply_timeout
+     * service extensions
      */
-    int reply_timeout;
+    svc_extension_t extension;
 
     /*
      * JK_TRUE if response headers have been sent back

Modified: tomcat/connectors/trunk/jk/native/common/jk_uri_worker_map.c
URL: http://svn.apache.org/viewvc/tomcat/connectors/trunk/jk/native/common/jk_uri_worker_map.c?rev=613274&r1=613273&r2=613274&view=diff
==============================================================================
--- tomcat/connectors/trunk/jk/native/common/jk_uri_worker_map.c (original)
+++ tomcat/connectors/trunk/jk/native/common/jk_uri_worker_map.c Fri Jan 18 13:14:24 2008
@@ -28,6 +28,8 @@
 #include "jk_map.h"
 #include "jk_mt.h"
 #include "jk_uri_worker_map.h"
+#include "jk_worker.h"
+#include "jk_lb_worker.h"
 
 #ifdef WIN32
 #define JK_STRCMP   strcasecmp
@@ -37,6 +39,11 @@
 #define JK_STRNCMP  strncmp
 #endif
 
+#define JK_UWMAP_EXTENSION_REPLY_TIMEOUT "reply_timeout="
+#define JK_UWMAP_EXTENSION_ACTIVE        "active="
+#define JK_UWMAP_EXTENSION_DISABLE       "disable="
+#define JK_UWMAP_EXTENSION_STOP          "stop="
+
 #define IND_THIS(x)                        ((x)[uw_map->index])
 #define IND_NEXT(x)                        ((x)[(uw_map->index+1) % 2])
 
@@ -341,6 +348,112 @@
     return JK_TRUE;
 }
 
+static void extract_activation(lb_worker_t *lb,
+                               int *activations,
+                               char *workers,
+                               int activation,
+                               jk_logger_t *l)
+{
+    int i;
+    char *worker;
+#ifdef _MT_CODE_PTHREAD
+    char *lasts;
+#endif
+
+    JK_TRACE_ENTER(l);
+
+#ifdef _MT_CODE_PTHREAD
+    for (worker = strtok_r(workers, ",", &lasts);
+         worker; worker = strtok_r(NULL, "&", &lasts)) {
+#else
+    for (worker = strtok(workers, ","); worker; worker = strtok(NULL, ",")) {
+#endif
+        for (i=0; i<lb->num_of_workers; i++) {
+            if (!strcmp(worker, lb->lb_workers[i].name))
+                activations[i] = activation;
+        }
+    }
+
+    JK_TRACE_EXIT(l);
+
+}
+
+void uri_worker_map_ext(jk_uri_worker_map_t *uw_map, jk_logger_t *l)
+{
+    unsigned int i;
+
+    JK_TRACE_ENTER(l);
+
+    for (i = 0; i < IND_NEXT(uw_map->size); i++) {
+        uri_worker_record_t *uwr = IND_NEXT(uw_map->maps)[i];
+        jk_worker_t *jw = wc_get_worker_for_name(uwr->worker_name, l);
+        if (JK_IS_DEBUG_LEVEL(l))
+            jk_log(l, JK_LOG_DEBUG,
+                   "Checking extension for worker %d: %s of type %s (%d)",
+                   i, uwr->worker_name, wc_get_name_for_type(jw->type,l), jw->type);
+
+        if (jw->type == JK_LB_WORKER_TYPE &&
+            (uwr->extensions.active || uwr->extensions.disable || uwr->extensions.stop)) {
+            int j;
+            lb_worker_t *lb = (lb_worker_t *)jw->worker_private;
+            jk_pool_t *p;
+            if (!uwr->extensions.activation) {
+                uwr->extensions.size = lb->num_of_workers;
+                if (uwr->source_type == SOURCE_TYPE_URIMAP)
+                    p = &IND_NEXT(uw_map->p_dyn);
+                else
+                    p = &uw_map->p;
+                uwr->extensions.activation = (int *)jk_pool_alloc(p,
+                                                        uwr->extensions.size * sizeof(int));
+                if (!uwr->extensions.activation) {
+                    jk_log(l, JK_LOG_ERROR,
+                           "can't alloc extensions activation list");
+                    continue;
+                } else if (JK_IS_DEBUG_LEVEL(l))
+                    jk_log(l, JK_LOG_DEBUG,
+                           "Allocated activations array of size %d for lb worker %s",
+                           uwr->extensions.size, uwr->worker_name);
+                for (j=0; j<uwr->extensions.size; j++) {
+                    uwr->extensions.activation[j] = JK_LB_ACTIVATION_UNSET;
+                }
+            }
+            if (uwr->extensions.active)
+                extract_activation(lb, uwr->extensions.activation,
+                                   uwr->extensions.active, JK_LB_ACTIVATION_ACTIVE, l);
+            if (uwr->extensions.disable)
+                extract_activation(lb, uwr->extensions.activation,
+                                   uwr->extensions.disable, JK_LB_ACTIVATION_DISABLED, l);
+            if (uwr->extensions.stop)
+                extract_activation(lb, uwr->extensions.activation,
+                                   uwr->extensions.stop, JK_LB_ACTIVATION_STOPPED, l);
+        }
+        else if (uwr->extensions.active) {
+            jk_log(l, JK_LOG_WARNING,
+                   "Worker %s is not of type lb, activation extension "
+                   JK_UWMAP_EXTENSION_ACTIVE " for %s ignored",
+                   uwr->worker_name, uwr->extensions.active);
+        }
+        else if (uwr->extensions.disable) {
+            jk_log(l, JK_LOG_WARNING,
+                   "Worker %s is not of type lb, activation extension "
+                   JK_UWMAP_EXTENSION_DISABLE " for %s ignored",
+                   uwr->worker_name, uwr->extensions.disable);
+        }
+        else if (uwr->extensions.stop) {
+            jk_log(l, JK_LOG_WARNING,
+                   "Worker %s is not of type lb, activation extension "
+                   JK_UWMAP_EXTENSION_STOP " for %s ignored",
+                   uwr->worker_name, uwr->extensions.stop);
+        }
+    }
+    uw_map->index = (uw_map->index + 1) % 2;
+    jk_reset_pool(&(IND_NEXT(uw_map->p_dyn)));
+
+    JK_TRACE_EXIT(l);
+    return;
+
+}
+
 int uri_worker_map_add(jk_uri_worker_map_t *uw_map,
                        const char *puri, const char *worker,
                        unsigned int source_type, jk_logger_t *l)
@@ -391,11 +504,63 @@
     }
 
     if (*uri == '/') {
+        char *w;
+        char *param;
+#ifdef _MT_CODE_PTHREAD
+        char *lasts;
+#endif
+
+        w = jk_pool_strdup(p, worker);
+        uwr->extensions.reply_timeout = -1;
+        uwr->extensions.active = NULL;
+        uwr->extensions.disable = NULL;
+        uwr->extensions.stop = NULL;
+        uwr->extensions.size = 0;
+        uwr->extensions.activation = NULL;
+
+#ifdef _MT_CODE_PTHREAD
+        param = strtok_r(w, ";", &lasts);
+#else
+        param = strtok(w, ";");
+#endif
+        if (param) {
+#ifdef _MT_CODE_PTHREAD
+            for (; param; param = strtok_r(NULL, ";", &lasts)) {
+#else
+            for (; param; param = strtok(NULL, ";")) {
+#endif
+                if (!strncmp(param, JK_UWMAP_EXTENSION_REPLY_TIMEOUT, strlen(JK_UWMAP_EXTENSION_REPLY_TIMEOUT))) {
+                    uwr->extensions.reply_timeout = atoi(param + strlen(JK_UWMAP_EXTENSION_REPLY_TIMEOUT));
+                }
+                else if (!strncmp(param, JK_UWMAP_EXTENSION_ACTIVE, strlen(JK_UWMAP_EXTENSION_ACTIVE))) {
+                    if (uwr->extensions.active)
+                        jk_log(l, JK_LOG_WARNING,
+                               "active extension in uriworker map only allowed once");
+                    else
+                        uwr->extensions.active = param + strlen(JK_UWMAP_EXTENSION_ACTIVE);
+                }
+                else if (!strncmp(param, JK_UWMAP_EXTENSION_DISABLE, strlen(JK_UWMAP_EXTENSION_DISABLE))) {
+                    if (uwr->extensions.disable)
+                        jk_log(l, JK_LOG_WARNING,
+                               "disable extension in uriworker map only allowed once");
+                    else
+                        uwr->extensions.disable = param + strlen(JK_UWMAP_EXTENSION_DISABLE);
+                }
+                else if (!strncmp(param, JK_UWMAP_EXTENSION_STOP, strlen(JK_UWMAP_EXTENSION_STOP))) {
+                    if (uwr->extensions.stop)
+                        jk_log(l, JK_LOG_WARNING,
+                               "stop extension in uriworker map only allowed once");
+                    else
+                        uwr->extensions.stop = param + strlen(JK_UWMAP_EXTENSION_STOP);
+                }
+            }
+        }
+
+        uwr->source_type = source_type;
+        uwr->worker_name = w;
         uwr->uri = uri;
         uwr->context = uri;
-        uwr->worker_name = jk_pool_strdup(p, worker);
         uwr->context_len = strlen(uwr->context);
-        uwr->source_type = source_type;
         if (strchr(uri, '*') ||
             strchr(uri, '?')) {
             /* Something like
@@ -620,9 +785,10 @@
     return JK_FALSE;
 }
 
-const char *map_uri_to_worker(jk_uri_worker_map_t *uw_map,
-                              const char *uri, const char *vhost,
-                              jk_logger_t *l)
+const char *map_uri_to_worker_ext(jk_uri_worker_map_t *uw_map,
+                                  const char *uri, const char *vhost,
+                                  rule_extension_t **extensions,
+                                  jk_logger_t *l)
 {
     unsigned int i;
     unsigned int vhost_len;
@@ -632,11 +798,12 @@
 
     JK_TRACE_ENTER(l);
 
-    if (!uw_map || !uri) {
+    if (!uw_map || !uri || !extensions) {
         JK_LOG_NULL_PARAMS(l);
         JK_TRACE_EXIT(l);
         return NULL;
     }
+    *extensions = NULL;
     if (*uri != '/') {
         jk_log(l, JK_LOG_WARNING,
                 "Uri %s is invalid. Uri must start with /", uri);
@@ -738,6 +905,7 @@
     }
 
     if (rv >= 0) {
+        *extensions = &(IND_THIS(uw_map->maps)[rv]->extensions);
         JK_TRACE_EXIT(l);
         return IND_THIS(uw_map->maps)[rv]->worker_name;
     }
@@ -745,6 +913,14 @@
     return NULL;
 }
 
+const char *map_uri_to_worker(jk_uri_worker_map_t *uw_map,
+                              const char *uri, const char *vhost,
+                              jk_logger_t *l)
+{
+    rule_extension_t *ext;
+    return map_uri_to_worker_ext(uw_map, uri, vhost, &ext, l);
+}
+
 int uri_worker_map_load(jk_uri_worker_map_t *uw_map,
                         jk_logger_t *l)
 {
@@ -799,8 +975,6 @@
         rc = JK_TRUE;
     }
     jk_map_free(&map);
-    uw_map->index = (uw_map->index + 1) % 2;
-    jk_reset_pool(&(IND_NEXT(uw_map->p_dyn)));
     return rc;
 }
 
@@ -838,6 +1012,7 @@
             return JK_TRUE;
         }
         rc = uri_worker_map_load(uw_map, l);
+        uri_worker_map_ext(uw_map, l);
         JK_LEAVE_CS(&(uw_map->cs), rc);
         jk_log(l, JK_LOG_INFO,
                "Reloaded urimaps from %s", uw_map->fname);

Modified: tomcat/connectors/trunk/jk/native/common/jk_uri_worker_map.h
URL: http://svn.apache.org/viewvc/tomcat/connectors/trunk/jk/native/common/jk_uri_worker_map.h?rev=613274&r1=613273&r2=613274&view=diff
==============================================================================
--- tomcat/connectors/trunk/jk/native/common/jk_uri_worker_map.h (original)
+++ tomcat/connectors/trunk/jk/native/common/jk_uri_worker_map.h Fri Jan 18 13:14:24 2008
@@ -68,6 +68,23 @@
 #define SOURCE_TYPE_TEXT_DISCOVER   ("ajp14")
 
 #define JK_MAX_URI_LEN              4095
+
+struct rule_extension
+{
+    /* reply_timeout overwrite */
+    int reply_timeout;
+    /* activation state overwrites for load balancers */
+    /* Number of elements in the array activations. */
+    int size;
+    /* Dynamically allocated array with one entry per lb member. */
+    int *activation;
+    /* Temporary storage for the original extension strings. */
+    char *active;
+    char *disable;
+    char *stop;
+};
+typedef struct rule_extension rule_extension_t;
+
 struct uri_worker_record
 {
     /* Original uri for logging */
@@ -87,6 +104,9 @@
 
     /* char length of the context */
     size_t context_len;
+
+    /* extended mapping properties */
+    rule_extension_t extensions;
 };
 typedef struct uri_worker_record uri_worker_record_t;
 
@@ -146,6 +166,8 @@
 int uri_worker_map_open(jk_uri_worker_map_t *uw_map,
                         jk_map_t *init_data, jk_logger_t *l);
 
+void uri_worker_map_ext(jk_uri_worker_map_t *uw_map, jk_logger_t *l);
+
 int uri_worker_map_add(jk_uri_worker_map_t *uw_map,
                        const char *puri, const char *worker,
                        unsigned int source_type, jk_logger_t *l);
@@ -153,6 +175,11 @@
 const char *map_uri_to_worker(jk_uri_worker_map_t *uw_map,
                               const char *uri, const char *vhost,
                               jk_logger_t *l);
+
+const char *map_uri_to_worker_ext(jk_uri_worker_map_t *uw_map,
+                                  const char *uri, const char *vhost,
+                                  rule_extension_t **extensions,
+                                  jk_logger_t *l);
 
 int uri_worker_map_load(jk_uri_worker_map_t *uw_map,
                         jk_logger_t *l);

Modified: tomcat/connectors/trunk/jk/native/common/jk_util.c
URL: http://svn.apache.org/viewvc/tomcat/connectors/trunk/jk/native/common/jk_util.c?rev=613274&r1=613273&r2=613274&view=diff
==============================================================================
--- tomcat/connectors/trunk/jk/native/common/jk_util.c (original)
+++ tomcat/connectors/trunk/jk/native/common/jk_util.c Fri Jan 18 13:14:24 2008
@@ -1867,7 +1867,8 @@
     s->reco_status = RECO_NONE;
     s->flush_packets = JK_FALSE;
     s->flush_header = JK_FALSE;
-    s->reply_timeout = -1;
+    s->extension.reply_timeout = -1;
+    s->extension.activation = NULL;
     s->response_started = JK_FALSE;
     s->http_response_status = JK_HTTP_OK;
     s->uw_map = NULL;

Modified: tomcat/connectors/trunk/jk/native/iis/jk_isapi_plugin.c
URL: http://svn.apache.org/viewvc/tomcat/connectors/trunk/jk/native/iis/jk_isapi_plugin.c?rev=613274&r1=613273&r2=613274&view=diff
==============================================================================
--- tomcat/connectors/trunk/jk/native/iis/jk_isapi_plugin.c (original)
+++ tomcat/connectors/trunk/jk/native/iis/jk_isapi_plugin.c Fri Jan 18 13:14:24 2008
@@ -1779,6 +1779,7 @@
                 if (wc_open(workers_map, &worker_env, logger)) {
                     rc = JK_TRUE;
                 }
+                uri_worker_map_ext(uw_map, logger);
             }
             else
                 jk_log(logger, JK_LOG_EMERG,



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org