andya       01/06/24 08:37:44

  Modified:    jk/native/iis jk_isapi_plugin.c
  Log:
  Defer jk initialisation until server name is known (which means when the filter or 
extension proc has been called). Builds, loads but not extensively tested.
  
  Revision  Changes    Path
  1.6       +152 -106  jakarta-tomcat-connectors/jk/native/iis/jk_isapi_plugin.c
  
  Index: jk_isapi_plugin.c
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native/iis/jk_isapi_plugin.c,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- jk_isapi_plugin.c 2001/06/23 15:56:55     1.5
  +++ jk_isapi_plugin.c 2001/06/24 15:37:43     1.6
  @@ -58,7 +58,7 @@
   /***************************************************************************
    * Description: ISAPI plugin for IIS/PWS                                   *
    * Author:      Gal Shachor <[EMAIL PROTECTED]>                           *
  - * Version:     $Revision: 1.5 $                                           *
  + * Version:     $Revision: 1.6 $                                           *
    ***************************************************************************/
   
   #include <httpext.h>
  @@ -92,11 +92,13 @@
   
   #define REGISTRY_LOCATION       ("Software\\Apache Software Foundation\\Jakarta 
Isapi Redirector\\1.0")
   #define EXTENSION_URI_TAG       ("extension_uri")
  +
  +#define MAX_SERVERNAME                       128
   
   #define GET_SERVER_VARIABLE_VALUE(name, place) {    \
       (place) = NULL;                                   \
       huge_buf_sz = sizeof(huge_buf);                 \
  -    if(get_server_value(private_data->lpEcb,        \
  +    if (get_server_value(private_data->lpEcb,        \
                           (name),                     \
                           huge_buf,                   \
                           huge_buf_sz,                \
  @@ -107,23 +109,26 @@
   
   #define GET_SERVER_VARIABLE_VALUE_INT(name, place, def) {   \
       huge_buf_sz = sizeof(huge_buf);                 \
  -    if(get_server_value(private_data->lpEcb,        \
  +    if (get_server_value(private_data->lpEcb,        \
                           (name),                     \
                           huge_buf,                   \
                           huge_buf_sz,                \
                           "")) {                      \
           (place) = atoi(huge_buf);                   \
  -        if(0 == (place)) {                          \
  +        if (0 == (place)) {                          \
               (place) = def;                          \
           }                                           \
       } else {    \
           (place) = def;  \
       }           \
   }\
  +
  +static char *SERVER_NAME = "SERVER_NAME";
   
  -static int   is_inited = JK_FALSE;
  -static jk_uri_worker_map_t *uw_map = NULL; 
  -static jk_logger_t *logger = NULL; 
  +static int                                   is_inited       = JK_FALSE;
  +static int                                   is_mapread      = JK_FALSE;
  +static jk_uri_worker_map_t   *uw_map         = NULL; 
  +static jk_logger_t                   *logger         = NULL; 
   
   static char extension_uri[INTERNET_MAX_URL_LENGTH] = "/jakarta/isapi_redirect.dll";
   static char log_file[MAX_PATH * 2];
  @@ -163,6 +168,8 @@
                              jk_ws_service_t *s,
                              char **worker_name);
   
  +static int init_jk(char *serverName);
  +
   static int initialize_extension(void);
   
   static int read_registry_init_data(void);
  @@ -186,7 +193,7 @@
           *c = tolower(*c);
           c++;
       }                    
  -    if(strstr(uri, "web-inf")) {
  +    if (strstr(uri, "web-inf")) {
           return JK_TRUE;
       }
   
  @@ -205,15 +212,15 @@
       jk_log(logger, JK_LOG_DEBUG, 
              "Into jk_ws_service_t::start_response\n");
   
  -    if(status < 100 || status > 1000) {
  +    if (status < 100 || status > 1000) {
           jk_log(logger, JK_LOG_ERROR, 
                  "jk_ws_service_t::start_response, invalid status %d\n", status);
           return JK_FALSE;
       }
   
  -    if(s && s->ws_private) {
  +    if (s && s->ws_private) {
           isapi_private_data_t *p = s->ws_private;
  -        if(!p->request_started) {
  +        if (!p->request_started) {
               DWORD len_of_status;
               char *status_str;
               char *headers_str;
  @@ -223,7 +230,7 @@
               /*
                * Create the status line
                */
  -            if(!reason) {
  +            if (!reason) {
                   reason = "";
               }
               status_str = (char *)_alloca((6 + strlen(reason)) * sizeof(char));
  @@ -233,7 +240,7 @@
               /*
                * Create response headers string
                */
  -            if(num_of_headers) {
  +            if (num_of_headers) {
                   unsigned i;
                   unsigned len_of_headers;
                   for(i = 0 , len_of_headers = 0 ; i < num_of_headers ; i++) {
  @@ -257,7 +264,7 @@
                   headers_str = crlf;
               }
   
  -            if(!p->lpEcb->ServerSupportFunction(p->lpEcb->ConnID, 
  +            if (!p->lpEcb->ServerSupportFunction(p->lpEcb->ConnID, 
                                                   HSE_REQ_SEND_RESPONSE_HEADER,
                                                   status_str,
                                                   (LPDWORD)&len_of_status,
  @@ -287,15 +294,15 @@
       jk_log(logger, JK_LOG_DEBUG, 
              "Into jk_ws_service_t::read\n");
   
  -    if(s && s->ws_private && b && a) {
  +    if (s && s->ws_private && b && a) {
           isapi_private_data_t *p = s->ws_private;
           
           *a = 0;
  -        if(l) {
  +        if (l) {
               char *buf = b;
               DWORD already_read = p->lpEcb->cbAvailable - p->bytes_read_so_far;
               
  -            if(already_read >= l) {
  +            if (already_read >= l) {
                   memcpy(buf, p->lpEcb->lpbData + p->bytes_read_so_far, l);
                   p->bytes_read_so_far += l;
                   *a = l;
  @@ -303,7 +310,7 @@
                   /*
                    * Try to copy what we already have 
                    */
  -                if(already_read > 0) {
  +                if (already_read > 0) {
                       memcpy(buf, p->lpEcb->lpbData + p->bytes_read_so_far, 
already_read);
                       buf += already_read;
                       l   -= already_read;
  @@ -315,7 +322,7 @@
                   /*
                    * Now try to read from the client ...
                    */
  -                if(p->lpEcb->ReadClient(p->lpEcb->ConnID, buf, &l)) {
  +                if (p->lpEcb->ReadClient(p->lpEcb->ConnID, buf, &l)) {
                       *a += l;            
                   } else {
                       jk_log(logger, JK_LOG_ERROR, 
  @@ -339,20 +346,20 @@
       jk_log(logger, JK_LOG_DEBUG, 
              "Into jk_ws_service_t::write\n");
   
  -    if(s && s->ws_private && b) {
  +    if (s && s->ws_private && b) {
           isapi_private_data_t *p = s->ws_private;
   
  -        if(l) {
  +        if (l) {
               unsigned written = 0;           
               char *buf = (char *)b;
   
  -            if(!p->request_started) {
  +            if (!p->request_started) {
                   start_response(s, 200, NULL, NULL, NULL, 0);
               }
   
               while(written < l) {
                   DWORD try_to_write = l - written;
  -                if(!p->lpEcb->WriteClient(p->lpEcb->ConnID, 
  +                if (!p->lpEcb->WriteClient(p->lpEcb->ConnID, 
                                             buf + written, 
                                             &try_to_write, 
                                             0)) {
  @@ -380,7 +387,7 @@
   
       pVer->dwFilterVersion = pVer->dwServerFilterVersion;
                           
  -    if(pVer->dwFilterVersion > http_filter_revision) {
  +    if (pVer->dwFilterVersion > http_filter_revision) {
           pVer->dwFilterVersion = http_filter_revision;
       }
   
  @@ -391,7 +398,7 @@
                       
       strcpy(pVer->lpszFilterDesc, VERSION_STRING);
   
  -    if(!is_inited) {
  +    if (!is_inited) {
           return initialize_extension();
       }
   
  @@ -402,7 +409,23 @@
                               DWORD dwNotificationType, 
                               LPVOID pvNotification)
   {
  -    if(is_inited &&
  +     /* Initialise jk */
  +     if (is_inited && !is_mapread) {
  +             char serverName[MAX_SERVERNAME];
  +             DWORD dwLen = sizeof(serverName);
  +
  +             if (pfc->GetServerVariable(pfc, SERVER_NAME, serverName, &dwLen))
  +             {
  +                     if (dwLen > 0) serverName[dwLen-1] = '\0';
  +                     if (init_jk(serverName))
  +                             is_mapread = JK_TRUE;
  +             }
  +             /* If we can't read the map we become dormant */
  +             if (!is_mapread)
  +                     is_inited = JK_FALSE;
  +     }
  +
  +    if (is_inited &&
          (SF_NOTIFY_PREPROC_HEADERS == dwNotificationType)) { 
           PHTTP_FILTER_PREPROC_HEADERS p = 
(PHTTP_FILTER_PREPROC_HEADERS)pvNotification;
           char uri[INTERNET_MAX_URL_LENGTH]; 
  @@ -411,6 +434,7 @@
   
           jk_log(logger, JK_LOG_DEBUG, 
                  "HttpFilterProc started\n");
  +
   
           /*
            * Just in case somebody set these headers in the request!
  @@ -418,34 +442,34 @@
           p->SetHeader(pfc, URI_HEADER_NAME, NULL);
            p->SetHeader(pfc, WORKER_HEADER_NAME, NULL);
           
  -        if(!p->GetHeader(pfc, "url", (LPVOID)uri, (LPDWORD)&sz)) {
  +        if (!p->GetHeader(pfc, "url", (LPVOID)uri, (LPDWORD)&sz)) {
               jk_log(logger, JK_LOG_ERROR, 
                      "HttpFilterProc error while getting the url\n");
               return SF_STATUS_REQ_ERROR;
           }
   
  -        if(strlen(uri)) {
  +        if (strlen(uri)) {
               char *worker;
               query = strchr(uri, '?');
  -            if(query) {
  +            if (query) {
                   *query = '\0';
               }
               jk_log(logger, JK_LOG_DEBUG, 
                      "In HttpFilterProc test redirection of %s\n", 
                      uri);
               worker = map_uri_to_worker(uw_map, uri, logger);                
  -            if(query) {
  +            if (query) {
                   *query = '?';
               }
   
  -            if(worker) {
  +            if (worker) {
                   /* This is a servlet, should redirect ... */
                   jk_log(logger, JK_LOG_DEBUG, 
                          "HttpFilterProc [%s] is a servlet url - should redirect to 
%s\n", 
                          uri, worker);
   
                   
  -                             if(!p->AddHeader(pfc, URI_HEADER_NAME, uri) || 
  +                             if (!p->AddHeader(pfc, URI_HEADER_NAME, uri) || 
                      !p->AddHeader(pfc, WORKER_HEADER_NAME, worker) ||
                      !p->SetHeader(pfc, "url", extension_uri)) {
                       jk_log(logger, JK_LOG_ERROR, 
  @@ -466,7 +490,7 @@
                      "HttpFilterProc check if [%s] is points to the web-inf 
directory\n", 
                      uri);
   
  -            if(uri_is_web_inf(uri)) {
  +            if (uri_is_web_inf(uri)) {
                   char crlf[3] = { (char)13, (char)10, '\0' };
                   char ctype[30];
                   char *msg = "<HTML><BODY><H1>Access is 
Forbidden</H1></BODY></HTML>";
  @@ -505,7 +529,7 @@
       strcpy(pVer->lpszExtensionDesc, VERSION_STRING);
   
   
  -    if(!is_inited) {
  +    if (!is_inited) {
           return initialize_extension();
       }
   
  @@ -521,11 +545,26 @@
       jk_log(logger, JK_LOG_DEBUG, 
              "HttpExtensionProc started\n");
   
  -    if(is_inited) {
  +     /* Initialise jk */
  +     if (is_inited && !is_mapread) {
  +             char serverName[MAX_SERVERNAME];
  +             DWORD dwLen = sizeof(serverName);
  +             if (lpEcb->GetServerVariable(lpEcb->ConnID, SERVER_NAME, serverName, 
&dwLen))
  +             {
  +                     if (dwLen > 0) serverName[dwLen-1] = '\0';
  +                     if (init_jk(serverName))
  +                             is_mapread = JK_TRUE;
  +             }
  +             if (!is_mapread)
  +                     is_inited = JK_FALSE;
  +     }
  +
  +     if (is_inited) {
           isapi_private_data_t private_data;
           jk_ws_service_t s;
           jk_pool_atom_t buf[SMALL_POOL_SIZE];
           char *worker_name;
  +
   
           jk_init_ws_service(&s);
           jk_open_pool(&private_data.p, buf, sizeof(buf));
  @@ -537,7 +576,7 @@
           s.ws_private = &private_data;
           s.pool = &private_data.p;
   
  -        if(init_ws_service(&private_data, &s, &worker_name)) {
  +        if (init_ws_service(&private_data, &s, &worker_name)) {
               jk_worker_t *worker = wc_get_worker_for_name(worker_name, logger);
   
               jk_log(logger, JK_LOG_DEBUG, 
  @@ -545,11 +584,11 @@
                      worker ? "got" : "could not get",
                      worker_name);
   
  -            if(worker) {
  +            if (worker) {
                   jk_endpoint_t *e = NULL;
  -                if(worker->get_endpoint(worker, &e, logger)) {
  +                if (worker->get_endpoint(worker, &e, logger)) {
                       int recover = JK_FALSE;
  -                    if(e->service(e, &s, logger, &recover)) {
  +                    if (e->service(e, &s, logger, &recover)) {
                           rc = HSE_STATUS_SUCCESS_AND_KEEP_CONN;
                           lpEcb->dwHttpStatusCode = HTTP_STATUS_OK;
                           jk_log(logger, JK_LOG_DEBUG, 
  @@ -584,12 +623,15 @@
   
   BOOL WINAPI TerminateFilter(DWORD dwFlags) 
   {
  -    if(is_inited) {
  +    if (is_inited) {
           is_inited = JK_FALSE;
  -
  -        uri_worker_map_free(&uw_map, logger);
  +
  +             if (is_mapread) {
  +                     uri_worker_map_free(&uw_map, logger);
  +                     is_mapread = JK_FALSE;
  +             }
           wc_close(logger);
  -        if(logger) {
  +        if (logger) {
               jk_close_file_logger(&logger);
           }
       }
  @@ -617,49 +659,53 @@
       } 
   
       return fReturn;
  +}
  +
  +static int init_jk(char *serverName)
  +{
  +    int rc = JK_FALSE;  
  +    jk_map_t *map;
  +
  +    if (!jk_open_file_logger(&logger, log_file, log_level)) {
  +        logger = NULL;
  +    }
  +    
  +    if (map_alloc(&map)) {
  +        if (map_read_properties(map, worker_mount_file)) {
  +            if (uri_worker_map_alloc(&uw_map, map, logger)) {
  +                rc = JK_TRUE;
  +            }
  +        }
  +        map_free(&map);
  +    }
  +
  +    if (rc) {
  +        rc = JK_FALSE;
  +        if (map_alloc(&map)) {
  +            if (map_read_properties(map, worker_file)) {
  +                             /* we add the URI->WORKER MAP since workers using 
AJP14 will feed it */
  +
  +                             worker_env.uri_to_worker = uw_map;
  +                             worker_env.server_name = serverName;
  +
  +                if (wc_open(map, &worker_env, logger)) {
  +                    rc = JK_TRUE;
  +                }
  +            }
  +            map_free(&map);
  +        }
  +    }
  +
  +     return rc;
   }
   
   static int initialize_extension(void)
   {
  -    int rc = JK_FALSE;  
  -
  -    if(read_registry_init_data()) {
  -        jk_map_t *map;
  -
  -        if(!jk_open_file_logger(&logger, log_file, log_level)) {
  -            logger = NULL;
  -        }
  -        
  -        if(map_alloc(&map)) {
  -            if(map_read_properties(map, worker_mount_file)) {
  -                if(uri_worker_map_alloc(&uw_map, map, logger)) {
  -                    rc = JK_TRUE;
  -                }
  -            }
  -            map_free(&map);
  -        }
  -
  -        if(rc) {
  -            rc = JK_FALSE;
  -            if(map_alloc(&map)) {
  -                if(map_read_properties(map, worker_file)) {
  -                                     /* we add the URI->WORKER MAP since workers 
using AJP14 will feed it */
  -                                     /*worker_env.uri_to_worker = uw_map;
  -                                     GET_SERVER_VARIABLE_VALUE("SERVER_SOFTWARE", 
worker_env.server_name);*/
  -                    if(wc_open(map, &worker_env, logger)) {
  -                        rc = JK_TRUE;
  -                    }
  -                }
  -                map_free(&map);
  -            }
  -        }
  -
  +
  +    if (read_registry_init_data()) {
  +        is_inited = JK_TRUE;
       }
  -
  -    if(rc) {
  -        is_inited = JK_TRUE;
  -    }
  -    return rc;
  +    return is_inited;
   }
   
   static int read_registry_init_data(void)
  @@ -673,11 +719,11 @@
                         (DWORD)0,         
                         KEY_READ,         
                         &hkey);            
  -    if(ERROR_SUCCESS != rc) {
  +    if (ERROR_SUCCESS != rc) {
           return JK_FALSE;
       } 
   
  -    if(get_registry_config_parameter(hkey,
  +    if (get_registry_config_parameter(hkey,
                                        JK_LOG_FILE_TAG, 
                                        tmpbuf,
                                        sizeof(log_file))) {
  @@ -686,7 +732,7 @@
           ok = JK_FALSE;
       }
       
  -    if(get_registry_config_parameter(hkey,
  +    if (get_registry_config_parameter(hkey,
                                        JK_LOG_LEVEL_TAG, 
                                        tmpbuf,
                                        sizeof(tmpbuf))) {
  @@ -695,7 +741,7 @@
           ok = JK_FALSE;
       }
   
  -    if(get_registry_config_parameter(hkey,
  +    if (get_registry_config_parameter(hkey,
                                        EXTENSION_URI_TAG, 
                                        tmpbuf,
                                        sizeof(extension_uri))) {
  @@ -704,7 +750,7 @@
           ok = JK_FALSE;
       }
   
  -    if(get_registry_config_parameter(hkey,
  +    if (get_registry_config_parameter(hkey,
                                        JK_WORKER_FILE_TAG, 
                                        tmpbuf,
                                        sizeof(worker_file))) {
  @@ -713,7 +759,7 @@
           ok = JK_FALSE;
       }
   
  -    if(get_registry_config_parameter(hkey,
  +    if (get_registry_config_parameter(hkey,
                                        JK_MOUNT_FILE_TAG, 
                                        tmpbuf,
                                        sizeof(worker_mount_file))) {
  @@ -741,7 +787,7 @@
                             &type,    
                             (LPBYTE)b,
                             &sz); 
  -    if((ERROR_SUCCESS != lrc) || (type != REG_SZ)) {
  +    if ((ERROR_SUCCESS != lrc) || (type != REG_SZ)) {
           return JK_FALSE;        
       }
       
  @@ -767,12 +813,12 @@
       GET_SERVER_VARIABLE_VALUE(HTTP_WORKER_HEADER_NAME, (*worker_name));           
       GET_SERVER_VARIABLE_VALUE(HTTP_URI_HEADER_NAME, s->req_uri);     
   
  -    if(s->req_uri) {
  +    if (s->req_uri) {
           char *t = strchr(s->req_uri, '?');
  -        if(t) {
  +        if (t) {
               *t = '\0';
               t++;
  -            if(!strlen(t)) {
  +            if (!strlen(t)) {
                   t = NULL;
               }
           }
  @@ -788,7 +834,7 @@
       GET_SERVER_VARIABLE_VALUE("SERVER_PROTOCOL", s->protocol);
       GET_SERVER_VARIABLE_VALUE("REMOTE_HOST", s->remote_host);
       GET_SERVER_VARIABLE_VALUE("REMOTE_ADDR", s->remote_addr);
  -    GET_SERVER_VARIABLE_VALUE("SERVER_NAME", s->server_name);
  +    GET_SERVER_VARIABLE_VALUE(SERVER_NAME, s->server_name);
       GET_SERVER_VARIABLE_VALUE_INT("SERVER_PORT", s->server_port, 80)
       GET_SERVER_VARIABLE_VALUE("SERVER_SOFTWARE", s->server_software);
       GET_SERVER_VARIABLE_VALUE_INT("SERVER_PORT_SECURE", s->is_ssl, 0);
  @@ -809,7 +855,7 @@
       /*
        * Add SSL IIS environment
        */
  -    if(s->is_ssl) {         
  +    if (s->is_ssl) {         
           char *ssl_env_names[9] = {
               "CERT_ISSUER", 
               "CERT_SUBJECT", 
  @@ -837,11 +883,11 @@
   
           for(i = 0 ; i < 9 ; i++) {
               GET_SERVER_VARIABLE_VALUE(ssl_env_names[i], ssl_env_values[i]);
  -            if(ssl_env_values[i]) {
  +            if (ssl_env_values[i]) {
                   num_of_vars++;
               }
           }
  -        if(num_of_vars) {
  +        if (num_of_vars) {
               unsigned j;
   
               s->attributes_names = 
  @@ -851,7 +897,7 @@
   
               j = 0;
               for(i = 0 ; i < 9 ; i++) {                
  -                if(ssl_env_values[i]) {
  +                if (ssl_env_values[i]) {
                       s->attributes_names[j] = ssl_env_names[i];
                       s->attributes_values[j] = ssl_env_values[i];
                       j++;
  @@ -862,7 +908,7 @@
       }
   
       huge_buf_sz = sizeof(huge_buf);         
  -    if(get_server_value(private_data->lpEcb,
  +    if (get_server_value(private_data->lpEcb,
                           "ALL_HTTP",             
                           huge_buf,           
                           huge_buf_sz,        
  @@ -871,12 +917,12 @@
           char *tmp;
   
           for(tmp = huge_buf ; *tmp ; tmp++) {
  -            if(*tmp == '\n'){
  +            if (*tmp == '\n'){
                   cnt++;
               }
           }
   
  -        if(cnt) {
  +        if (cnt) {
               char *headers_buf = jk_pool_strdup(&private_data->p, huge_buf);
               unsigned i;
               unsigned len_of_http_prefix = strlen("HTTP_");
  @@ -885,7 +931,7 @@
               s->headers_names  = jk_pool_alloc(&private_data->p, cnt * sizeof(char 
*));
               s->headers_values = jk_pool_alloc(&private_data->p, cnt * sizeof(char 
*));
   
  -            if(!s->headers_names || !s->headers_values || !headers_buf) {
  +            if (!s->headers_names || !s->headers_values || !headers_buf) {
                   return JK_FALSE;
               }
   
  @@ -895,7 +941,7 @@
                   /* Skipp the HTTP_ prefix to the beginning of th header name */
                   tmp += len_of_http_prefix;
   
  -                if(!strnicmp(tmp, URI_HEADER_NAME, strlen(URI_HEADER_NAME)) ||
  +                if (!strnicmp(tmp, URI_HEADER_NAME, strlen(URI_HEADER_NAME)) ||
                      !strnicmp(tmp, WORKER_HEADER_NAME, strlen(WORKER_HEADER_NAME))) {
                       real_header = JK_FALSE;
                   } else {
  @@ -903,7 +949,7 @@
                   }
   
                   while(':' != *tmp && *tmp) {
  -                    if('_' == *tmp) {
  +                    if ('_' == *tmp) {
                           *tmp = '-';
                       } else {
                           *tmp = tolower(*tmp);
  @@ -918,7 +964,7 @@
                       tmp++;
                   }
   
  -                if(real_header) {
  +                if (real_header) {
                       s->headers_values[i]  = tmp;
                   }
                   
  @@ -933,7 +979,7 @@
                       tmp++;
                   }
   
  -                if(real_header) {
  +                if (real_header) {
                       i++;
                   }
               }
  @@ -955,7 +1001,7 @@
                               DWORD bufsz,
                               char  *def_val)
   {
  -    if(!lpEcb->GetServerVariable(lpEcb->ConnID, 
  +    if (!lpEcb->GetServerVariable(lpEcb->ConnID, 
                                    name,
                                    buf,
                                    (LPDWORD)&bufsz)) {
  @@ -963,7 +1009,7 @@
           return JK_FALSE;
       }
   
  -    if(bufsz > 0) {
  +    if (bufsz > 0) {
           buf[bufsz - 1] = '\0';
       }
   
  
  
  

Reply via email to