Author: mturk
Date: Thu Oct  2 06:33:49 2008
New Revision: 701126

URL: http://svn.apache.org/viewvc?rev=701126&view=rev
Log:
Implement service extensions to the IIS

Modified:
    tomcat/connectors/trunk/jk/native/iis/jk_isapi_plugin.c

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=701126&r1=701125&r2=701126&view=diff
==============================================================================
--- tomcat/connectors/trunk/jk/native/iis/jk_isapi_plugin.c (original)
+++ tomcat/connectors/trunk/jk/native/iis/jk_isapi_plugin.c Thu Oct  2 06:33:49 
2008
@@ -79,6 +79,7 @@
 #define URI_HEADER_NAME_BASE              ("TOMCATURI")
 #define QUERY_HEADER_NAME_BASE            ("TOMCATQUERY")
 #define WORKER_HEADER_NAME_BASE           ("TOMCATWORKER")
+#define WORKER_HEADER_INDEX_BASE          ("TOMCATWORKERIDX")
 #define TOMCAT_TRANSLATE_HEADER_NAME_BASE ("TOMCATTRANSLATE")
 #define CONTENT_LENGTH                    ("CONTENT_LENGTH:")
 
@@ -96,6 +97,7 @@
 static char QUERY_HEADER_NAME[MAX_PATH];
 static char WORKER_HEADER_NAME[MAX_PATH];
 static char TOMCAT_TRANSLATE_HEADER_NAME[MAX_PATH];
+static char WORKER_HEADER_INDEX[MAX_PATH];
 
 /* The variants of the special headers after IIS adds
  * "HTTP_" to the front of them
@@ -103,6 +105,7 @@
 static char HTTP_URI_HEADER_NAME[MAX_PATH];
 static char HTTP_QUERY_HEADER_NAME[MAX_PATH];
 static char HTTP_WORKER_HEADER_NAME[MAX_PATH];
+static char HTTP_WORKER_HEADER_INDEX[MAX_PATH];
 
 #define REGISTRY_LOCATION       ("Software\\Apache Software 
Foundation\\Jakarta Isapi Redirector\\1.0")
 #define W3SVC_REGISTRY_KEY      
("SYSTEM\\CurrentControlSet\\Services\\W3SVC\\Parameters")
@@ -210,7 +213,8 @@
                         huge_buf,                           \
                         huge_buf_sz)) {                     \
         (place) = atoi(huge_buf);                           \
-        if (0 == (place)) {                                 \
+        if (((place) == 0) && (errno == EINVAL ||           \
+                               errno == ERANGE)) {          \
             (place) = def;                                  \
         }                                                   \
     } else {                                                \
@@ -1512,6 +1516,7 @@
         char Port[INTERNET_MAX_URL_LENGTH] = "";
         char Translate[INTERNET_MAX_URL_LENGTH];
         char squery[INTERNET_MAX_URL_LENGTH] = "";
+        char swindex[MAX_INSTANCEID] = "";
         BOOL(WINAPI * GetHeader)
             (struct _HTTP_FILTER_CONTEXT * pfc, LPSTR lpszName,
              LPVOID lpvBuffer, LPDWORD lpdwSize);
@@ -1553,6 +1558,7 @@
         SetHeader(pfc, URI_HEADER_NAME, NULL);
         SetHeader(pfc, QUERY_HEADER_NAME, NULL);
         SetHeader(pfc, WORKER_HEADER_NAME, NULL);
+        SetHeader(pfc, WORKER_HEADER_INDEX, NULL);
         SetHeader(pfc, TOMCAT_TRANSLATE_HEADER_NAME, NULL);
 
         if (!GetHeader(pfc, "url", (LPVOID) uri, (LPDWORD) & sz)) {
@@ -1564,6 +1570,8 @@
         if (strlen(uri)) {
             int rc;
             const char *worker = NULL;
+            rule_extension_t *extensions;
+            int worker_index = -1;
             query = strchr(uri, '?');
             if (query) {
                 *query++ = '\0';
@@ -1610,10 +1618,12 @@
             }
             if (szHost > 0) {
                 StringCbCat(snuri, INTERNET_MAX_URL_LENGTH, Host);
-                worker = map_uri_to_worker(uw_map, uri, snuri, logger);
+                worker = map_uri_to_worker_ext(uw_map, uri, snuri,
+                                               &extensions, &worker_index, 
logger);
             }
             else {
-                worker = map_uri_to_worker(uw_map, uri, NULL, logger);
+                worker = map_uri_to_worker_ext(uw_map, uri, NULL,
+                                               &extensions, &worker_index, 
logger);
             }
             /*
              * Check if somebody is feading us with his own TOMCAT data 
headers.
@@ -1715,10 +1725,12 @@
                         rregex_rewrite(forwardURI);
                 }
 
+                itoa(worker_index, swindex, 10);
                 if (!AddHeader(pfc, URI_HEADER_NAME, forwardURI) ||
                     ((strlen(squery) > 0)
                      ? !AddHeader(pfc, QUERY_HEADER_NAME, squery) : FALSE) ||
                     !AddHeader(pfc, WORKER_HEADER_NAME, (LPSTR)worker) ||
+                    !AddHeader(pfc, WORKER_HEADER_INDEX, swindex) ||
                     !SetHeader(pfc, "url", extension_uri)) {
                     jk_log(logger, JK_LOG_ERROR,
                            "error while adding request headers");
@@ -2004,12 +2016,14 @@
         StringCbPrintf(URI_HEADER_NAME, MAX_PATH, HEADER_TEMPLATE, 
URI_HEADER_NAME_BASE, hInst);
         StringCbPrintf(QUERY_HEADER_NAME, MAX_PATH, HEADER_TEMPLATE, 
QUERY_HEADER_NAME_BASE, hInst);
         StringCbPrintf(WORKER_HEADER_NAME, MAX_PATH, HEADER_TEMPLATE, 
WORKER_HEADER_NAME_BASE, hInst);
+        StringCbPrintf(WORKER_HEADER_INDEX, MAX_PATH, HEADER_TEMPLATE, 
WORKER_HEADER_INDEX_BASE, hInst);
         StringCbPrintf(TOMCAT_TRANSLATE_HEADER_NAME, MAX_PATH, 
HEADER_TEMPLATE, TOMCAT_TRANSLATE_HEADER_NAME_BASE, hInst);
 
         /* Construct the HTTP_ headers that will be seen in ExtensionProc */
         StringCbPrintf(HTTP_URI_HEADER_NAME, MAX_PATH, HTTP_HEADER_TEMPLATE, 
URI_HEADER_NAME_BASE, hInst);
         StringCbPrintf(HTTP_QUERY_HEADER_NAME, MAX_PATH, HTTP_HEADER_TEMPLATE, 
QUERY_HEADER_NAME_BASE, hInst);
         StringCbPrintf(HTTP_WORKER_HEADER_NAME, MAX_PATH, 
HTTP_HEADER_TEMPLATE, WORKER_HEADER_NAME_BASE, hInst);
+        StringCbPrintf(HTTP_WORKER_HEADER_INDEX, MAX_PATH, 
HTTP_HEADER_TEMPLATE, WORKER_HEADER_INDEX_BASE, hInst);
 
     break;
     case DLL_PROCESS_DETACH:
@@ -2116,6 +2130,7 @@
         jk_log(logger, JK_LOG_DEBUG, "Using uri header %s.", URI_HEADER_NAME);
         jk_log(logger, JK_LOG_DEBUG, "Using query header %s.", 
QUERY_HEADER_NAME);
         jk_log(logger, JK_LOG_DEBUG, "Using worker header %s.", 
WORKER_HEADER_NAME);
+        jk_log(logger, JK_LOG_DEBUG, "Using worker index %s.", 
WORKER_HEADER_INDEX);
         jk_log(logger, JK_LOG_DEBUG, "Using translate header %s.", 
TOMCAT_TRANSLATE_HEADER_NAME);
         jk_log(logger, JK_LOG_DEBUG, "Using a default of %d connections per 
pool.",
                                      DEFAULT_WORKER_THREADS);
@@ -2423,6 +2438,8 @@
                            jk_ws_service_t *s, char **worker_name)
 {
     char *huge_buf = NULL;   /* should be enough for all */
+    int worker_index = -1;
+    rule_extension_t *e;
 
     DWORD huge_buf_sz;
 
@@ -2441,9 +2458,11 @@
     GET_SERVER_VARIABLE_VALUE(HTTP_WORKER_HEADER_NAME, (*worker_name));
     GET_SERVER_VARIABLE_VALUE(HTTP_URI_HEADER_NAME, s->req_uri);
     GET_SERVER_VARIABLE_VALUE(HTTP_QUERY_HEADER_NAME, s->query_string);
+    GET_SERVER_VARIABLE_VALUE_INT(HTTP_WORKER_HEADER_INDEX, worker_index, -1);
 
     if (JK_IS_DEBUG_LEVEL(logger)) {
-        jk_log(logger, JK_LOG_DEBUG, "Reading extension header %s: %s", 
HTTP_WORKER_HEADER_NAME, (*worker_name) );
+        jk_log(logger, JK_LOG_DEBUG, "Reading extension header %s: %s", 
HTTP_WORKER_HEADER_NAME, (*worker_name));
+        jk_log(logger, JK_LOG_DEBUG, "Reading extension header %s: %d", 
HTTP_WORKER_HEADER_INDEX, worker_index);
         jk_log(logger, JK_LOG_DEBUG, "Reading extension header %s: %s", 
HTTP_URI_HEADER_NAME, s->req_uri);
         jk_log(logger, JK_LOG_DEBUG, "Reading extension header %s: %s", 
HTTP_QUERY_HEADER_NAME, s->query_string);
     }
@@ -2474,6 +2493,23 @@
     s->method = private_data->lpEcb->lpszMethod;
     s->content_length = (jk_uint64_t)private_data->lpEcb->cbTotalBytes;
 
+    e = get_uri_to_worker_ext(uw_map, worker_index);
+    if (e) {
+        if (JK_IS_DEBUG_LEVEL(logger))
+            jk_log(logger, JK_LOG_DEBUG, "Applying service extensions" );
+        s->extension.reply_timeout = e->reply_timeout;
+        s->extension.use_server_error_pages = e->use_server_error_pages;
+        if (e->activation) {
+            s->extension.activation = jk_pool_alloc(s->pool, 
e->activation_size * sizeof(int));
+            memcpy(s->extension.activation, e->activation, e->activation_size 
* sizeof(int));
+        }
+        if (e->fail_on_status_size > 0) {
+            s->extension.fail_on_status_size = e->fail_on_status_size;
+            s->extension.fail_on_status = jk_pool_alloc(s->pool, 
e->fail_on_status_size * sizeof(int));
+            memcpy(s->extension.fail_on_status, e->fail_on_status, 
e->fail_on_status_size * sizeof(int));
+        }
+    }
+
     s->uw_map = uw_map;
     /*
      * Add SSL IIS environment



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to