costin      01/12/31 12:03:15

  Modified:    jk/native2/server/apache2 mod_jk.c
  Log:
  Some more changes in mod_jk configuration, to provide a more 'natural'
  style for apache users.
  
  As previously, worker.properties is no longer needed ( but can be used ),
  all settings can be done in httpd.conf ( or generated include file )
  using "JkSet name value"
  
  Adding 'mounts' is done using <Locations> - and the mapping is done
  by mod_core only once. I changed the command ( it was added few weeks
  ago ) to "JkWebapp worker ajp13" ( other options besides 'worker' will
  be available ).
  
  The JkWebapp should be specified for <Locations> coresponding the
  the root of the webapp. Autoconf will get the other mappings, or
  generated config.
  
  I added a different "JkServlet" command to be used for all servlet
  mappings inside a webapp, it'll eventually allow jk to do the
  corect mapping and pass the processed info to tomcat, to avoid duplicating
  it.
  
  Still to do - remove the need to declare WEB-INF/META-INF constraints
  ( we can code this instead of requiring the user to do it ).
  
  ( old config should still work )
  
  Revision  Changes    Path
  1.16      +287 -591  jakarta-tomcat-connectors/jk/native2/server/apache2/mod_jk.c
  
  Index: mod_jk.c
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native2/server/apache2/mod_jk.c,v
  retrieving revision 1.15
  retrieving revision 1.16
  diff -u -r1.15 -r1.16
  --- mod_jk.c  18 Dec 2001 22:51:55 -0000      1.15
  +++ mod_jk.c  31 Dec 2001 20:03:15 -0000      1.16
  @@ -59,7 +59,7 @@
    * Description: Apache 2 plugin for Jakarta/Tomcat                         *
    * Author:      Gal Shachor <[EMAIL PROTECTED]>                           *
    *                 Henri Gomez <[EMAIL PROTECTED]>                               *
  - * Version:     $Revision: 1.15 $                                           *
  + * Version:     $Revision: 1.16 $                                           *
    ***************************************************************************/
   
   /*
  @@ -100,157 +100,185 @@
   
   module AP_MODULE_DECLARE_DATA jk_module;
   
  -/* ==================== Options setters ==================== */
  +static jk_workerEnv_t *workerEnv;
   
  -/*
  - * The JK module command processors
  - *
  - * The below are all installed so that Apache calls them while it is
  - * processing its config files.  This allows configuration info to be
  - * copied into a jk_server_conf_t object, which is then used for request
  - * filtering/processing.
  - *
  - * See jk_cmds definition below for explanations of these options.
  - */
   
  +/* ==================== Options setters ==================== */
   
   /*
  - * JkMountCopy directive handling
  + * The JK2 module command processors. The options can be specified
  + * in a properties file or in httpd.conf, depending on user's taste.
    *
  - * JkMountCopy On/Off
  + * There is absolutely no difference from the point of view of jk,
  + * but apache config tools might prefer httpd.conf and the extra
  + * information included in the command descriptor. It also have
  + * a 'natural' feel, and is consistent with all other apache
  + * settings and modules. 
  + *
  + * Properties file are easier to parse/generate from java, and
  + * allow identical configuration for all servers. We should have
  + * code to generate the properties file or use the wire protocol,
  + * and make all those properties part of server.xml or jk's
  + * java-side configuration. This will give a 'natural' feel for
  + * those comfortable with the java side.
  + *
  + * The only exception is webapp definition, where in the near
  + * future you can expect a scalability difference between the
  + * 2 choices. If you have a large number of apps/vhosts you
  + * _should_ use the apache style, that makes use of the
  + * internal apache mapper ( known to scale to very large number
  + * of hosts ). The internal jk mapper uses linear search, ( will
  + * eventually use hash tables, when we add support for apr_hash ),
  + * and is nowhere near the apache mapper.
  + */
  +
  +/**
  + * In order to define a webapp you must add "JkWebapp" directive
  + * in a Location. 
  + *
  + * Example:
  + *   <VirtualHost foo.com>
  + *      <Location /examples>
  + *         JkWebapp worker ajp13
  + *      </Location>
  + *   </VirtualHost>
  + *
  + * This is the best way to define a webapplication in apache. It is
  + * scalable ( using apache native optimizations, you can have hundreds
  + * of hosts and thousands of webapplications ), 'natural' to any
  + * apache user.
    */
  -static const char *jk_set_mountcopy(cmd_parms *cmd, 
  -                                    void *dummy, 
  -                                    int flag) 
  +static const char *jk_setWebapp(cmd_parms *cmd, void *per_dir, 
  +                                const char *name, const char *val)
   {
  -    server_rec *s = cmd->server;
  -    jk_workerEnv_t *workerEnv =
  -        (jk_workerEnv_t *)ap_get_module_config(s->module_config, &jk_module);
  -    
  -    /* Set up our value */
  -    workerEnv->mountcopy = flag ? JK_TRUE : JK_FALSE;
  +    jk_uriEnv_t *uriEnv=(jk_uriEnv_t *)per_dir;
   
  -    return NULL;
  -}
  +    if( uriEnv->webapp == NULL ) {
  +        /* Do we know the url ? */
  +        uriEnv->webapp=workerEnv->createWebapp( workerEnv->globalEnv, workerEnv,
  +                                                NULL, cmd->path, NULL );
   
  -/*
  - * JkMount directive handling
  - *
  - * JkMount URI(context) worker
  - */
  -static const char *jk_mount_context(cmd_parms *cmd, void *dummy, 
  -                                    const char *context,
  -                                    const char *worker,
  -                                    const char *maybe_cookie)
  -{
  -    server_rec *s = cmd->server;
  -    jk_workerEnv_t *workerEnv =
  -        (jk_workerEnv_t *)ap_get_module_config(s->module_config, &jk_module);
  -    
  -    if (context[0]!='/') return "Context must start with /";
  +        fprintf(stderr, "New webapp %p %p\n",uriEnv, uriEnv->webapp);
  +    } else {
  +        fprintf(stderr, "Existing webapp %p\n",uriEnv->webapp);
  +    }
   
  -    workerEnv->init_data->put( NULL, workerEnv->init_data,
  -                               ap_pstrdup(cmd->pool,context),
  -                               ap_pstrdup(cmd->pool,worker),
  -                               NULL );
  +    if( strcmp( name, "worker") == 0 ) {
  +        uriEnv->webapp->workerName=ap_pstrdup(cmd->pool, val);
  +    } else {
  +        /* Generic properties */
  +        uriEnv->webapp->properties->add( workerEnv->globalEnv,
  +                                         uriEnv->webapp->properties,
  +                                         ap_pstrdup(cmd->pool, name),
  +                                         ap_pstrdup(cmd->pool, val));
  +    }
  +    
  +    fprintf(stderr, "XXX Set worker %p %s %s dir=%s args=%s\n",
  +            uriEnv, uriEnv->webapp->workerName, cmd->path,
  +            cmd->directive->directive,
  +            cmd->directive->args);
   
       return NULL;
   }
   
  -/** XXX This should be JkWebapp, it 'defines' the app 
  +/**
  + * Associate a servlet to a <Location>. 
  + *
  + * Example:
  + *   <VirtualHost foo.com>
  + *      <Location /examples/servlet>
  + *         JkServlet name servlet
  + *      </Location>
  + *   </VirtualHost>
    */
  -static const char *jk_set_worker(cmd_parms *cmd, void *per_dir, 
  -                                 const char *workerName)
  +static const char *jk_setServlet(cmd_parms *cmd, void *per_dir, 
  +                                const char *name, const char *val)
   {
       jk_uriEnv_t *uriEnv=(jk_uriEnv_t *)per_dir;
  -    jk_webapp_t *webapp;
   
  -    server_rec *s = cmd->server;
  -    
  -    jk_workerEnv_t *workerEnv =
  -        (jk_workerEnv_t *)ap_get_module_config(s->module_config, &jk_module);
  -
  -    /* Do we know the url ? */
  -    webapp=workerEnv->createWebapp( workerEnv->globalEnv, workerEnv,
  -                                    NULL, NULL, NULL );
  -    uriEnv->webapp=webapp;
  -    webapp->workerName=ap_pstrdup(cmd->pool, workerName);
  -    
  -    uriEnv->workerEnv=workerEnv;
  +    if( strcmp( name, "name") == 0 ) {
  +        uriEnv->servlet=ap_pstrdup(cmd->pool, val);
  +    } else {
  +        /* Generic properties */
  +        uriEnv->properties->add( workerEnv->globalEnv, uriEnv->properties,
  +                                 ap_pstrdup(cmd->pool, name),
  +                                 ap_pstrdup(cmd->pool, val));
  +    }
       
  -    fprintf(stderr, "XXX Set worker %p %s %s dir=%s args=%s\n",
  -            uriEnv, workerName, cmd->path, cmd->directive->directive,
  +    fprintf(stderr, "XXX SetServlet %p %p %s %s dir=%s args=%s\n",
  +            uriEnv, uriEnv->webapp, name, val,
  +            cmd->directive->directive,
               cmd->directive->args);
   
       return NULL;
   }
   
  -
  -/*
  - * JkWorkersFile Directive Handling
  +/** 
  + * Set jk options.
  + *
  + * "JkFoo value" is equivalent with a "foo=value" setting in
  + * workers.properties. ( XXX rename workers.properties to jk.properties)
    *
  - * JkWorkersFile file
  + * We are using a small trick to avoid duplicating the code ( the 'dummy'
  + * parm ). The values are validated and initalized in jk_init.
    */
  -static const char *jk_set_worker_file(cmd_parms *cmd, void *dummy, 
  -                                      const char *worker_file)
  +static const char *jk_set1(cmd_parms *cmd, void *per_dir,
  +                           const char *value)
   {
       server_rec *s = cmd->server;
       struct stat statbuf;
  +    char *oldv;
  +    int rc;
       jk_env_t *env;
   
  -    jk_workerEnv_t *workerEnv =
  -        (jk_workerEnv_t *)ap_get_module_config(s->module_config, &jk_module);
  +    jk_uriEnv_t *serverEnv=(jk_uriEnv_t *)
  +        ap_get_module_config(s->module_config, &jk_module);
  +    jk_workerEnv_t *workerEnv = serverEnv->workerEnv;
       
  -    /* we need an absolut path (ap_server_root_relative does the ap_pstrdup) */
  -    workerEnv->worker_file = ap_server_root_relative(cmd->pool,worker_file);
  -
  -    env=workerEnv->globalEnv;
  +    jk_map_t *m=workerEnv->init_data;
       
  -    if (workerEnv->worker_file == NULL)
  -        return "JkWorkersFile file_name invalid";
  +    env=workerEnv->globalEnv;
   
  -    if (stat(workerEnv->worker_file, &statbuf) == -1)
  -        return "Can't find the workers file specified";
  +    value = jk_map_replaceProperties(env, m, m->pool, value);
   
  -    /** Read worker files
  -     */
  -    env->l->jkLog(env, env->l, JK_LOG_DEBUG, "Reading map %s %d\n",
  -                  workerEnv->worker_file,
  -                  workerEnv->init_data->size(env, workerEnv->init_data) );
  -    
  -    if( workerEnv->worker_file != NULL ) {
  -        int err=jk_map_readFileProperties(env, workerEnv->init_data,
  -                                          workerEnv->worker_file);
  -        if( err==JK_TRUE ) {
  -            env->l->jkLog(env, env->l, JK_LOG_DEBUG, 
  -                          "Read map %s %d\n", workerEnv->worker_file,
  -                          workerEnv->init_data->size( env, workerEnv->init_data ) );
  -        } else {
  -            env->l->jkLog(env, env->l, JK_LOG_ERROR, "Error reading map %s %d\n",
  -                          workerEnv->worker_file,
  -                          workerEnv->init_data->size( env, workerEnv->init_data ) );
  -        }
  +    if( cmd->info != NULL ) {
  +        /* Multi-option config. */
  +        m->add(env, m, (char *)cmd->info, (char *)value );
  +
  +    } else {
  +        /* ??? Maybe this is a single-option */
  +        m->add(env, m, value, "On" );
       }
   
       return NULL;
   }
   
  +
   /*
    * JkSet name value
  + * JkEnv envvar envvalue
  + * JkMount /context worker
  + *
  + * Special options. First is equivalent with "name=value" in workers.properties.
  + * ( you should use the specialized directive, as it provides more info ).
  + * The other 2 are defining special maps.
  + *
  + * We use a small trick ( dummy param ) to avoid duplicated code and keep it
  + * simple.
    */
  -static const char *jk_worker_property(cmd_parms *cmd,
  -                                      void *dummy,
  -                                      const char *name,
  -                                      const char *value)
  +static const char *jk_set2(cmd_parms *cmd,void *per_dir,
  +                           const char *name, const char *value)
   {
       server_rec *s = cmd->server;
       struct stat statbuf;
       char *oldv;
       int rc;
       jk_env_t *env;
  +    char *type=(char *)cmd->info;
   
  -    jk_workerEnv_t *workerEnv =
  -        (jk_workerEnv_t *)ap_get_module_config(s->module_config, &jk_module);
  +    jk_uriEnv_t *serverEnv=(jk_uriEnv_t *)
  +        ap_get_module_config(s->module_config, &jk_module);
  +    jk_workerEnv_t *workerEnv = serverEnv->workerEnv;
       
       jk_map_t *m=workerEnv->init_data;
       
  @@ -258,446 +286,155 @@
       
       value = jk_map_replaceProperties(env, m, m->pool, value);
   
  -    oldv = jk_map_getString(env, m, name, NULL);
  +    if(value==NULL)
  +        return NULL;
   
  -    if(oldv) {
  -        char *tmpv = apr_palloc( cmd->pool,
  -                                strlen(value) + strlen(oldv) + 3);
  -        if(tmpv) {
  -            char sep = '*';
  -            if(jk_is_some_property(env, name, "path")) {
  -                sep = PATH_SEPERATOR;
  -            } else if(jk_is_some_property(env, name, "cmd_line")) {
  -                sep = ' ';
  -            }
  -            
  -            sprintf(tmpv, "%s%c%s", 
  -                    oldv, sep, value);
  -        }                                
  -        value = tmpv;
  +    if( type==NULL || type[0]=='\0') {
  +        /* Generic JkSet foo bar */
  +        m->add(env, m, ap_pstrdup( cmd->pool, name),
  +               ap_pstrdup( cmd->pool, value));
  +        fprintf( stderr, "set2.init_data: %s %s\n", name, value );
  +    } else if( strcmp(type, "env")==0) {
  +        workerEnv->envvars_in_use = JK_TRUE;
  +        workerEnv->envvars->put(env, workerEnv->envvars,
  +                                ap_pstrdup(cmd->pool,name),
  +                                ap_pstrdup(cmd->pool,value),
  +                                NULL);
  +        fprintf( stderr, "set2.env %s %s\n", name, value );
  +    } else if( strcmp(type, "mount")==0) {
  +        if (name[0] !='/') return "Context must start with /";
  +        workerEnv->init_data->put(  env, workerEnv->init_data,
  +                                    ap_pstrdup(cmd->pool,name),
  +                                    ap_pstrdup(cmd->pool,value),
  +                                    NULL );
  +        fprintf( stderr, "set2.mount %s %s\n", name, value );
       } else {
  -        value = ap_pstrdup( cmd->pool, value);
  +        fprintf( stderr, "set2 error %s %s %s ", type, name, value );
       }
  -    
  -    if(value) {
  -        m->put(env, m,
  -               ap_pstrdup( cmd->pool, name),
  -               ap_pstrdup( cmd->pool, value),
  -               NULL);
  -        /*printf("Setting %s %s\n", name, value);*/
  -    } 
  -    return NULL;
  -}
  -
  -
  -/*
  - * JkLogFile Directive Handling
  - *
  - * JkLogFile file
  - */
  -static const char *jk_set_log_file(cmd_parms *cmd, 
  -                                   void *dummy, 
  -                                   const char *log_file)
  -{
  -    server_rec *s = cmd->server;
  -    jk_workerEnv_t *workerEnv =
  -        (jk_workerEnv_t *)ap_get_module_config(s->module_config, &jk_module);
  -    char *logFileA;
  -
  -    /* we need an absolut path */
  -    logFileA = ap_server_root_relative(cmd->pool,log_file);
   
  -    if (logFileA == NULL)
  -        return "JkLogFile file_name invalid";
  -
  -    workerEnv->init_data->put( NULL, workerEnv->init_data, "logger.file.name", 
logFileA, NULL);
  - 
       return NULL;
   }
   
   /*
  - * JkLogLevel Directive Handling
  + * JkWorker workerName workerProperty value
    *
  - * JkLogLevel debug/info/error/emerg
  + * Equivalent with "worker.workerName.workerProperty=value" in
  + * workers.properties.
    */
  -
  -static const char *jk_set_log_level(cmd_parms *cmd, 
  -                                    void *dummy, 
  -                                    const char *log_level)
  +static const char *jk_setWorker(cmd_parms *cmd,void *per_dir,
  +                                const char *wname, const char *wparam, const char 
*value)
   {
       server_rec *s = cmd->server;
  +    struct stat statbuf;
  +    char *oldv;
  +    int rc;
       jk_env_t *env;
  -    jk_workerEnv_t *workerEnv =
  -        (jk_workerEnv_t *)ap_get_module_config(s->module_config, &jk_module);
  +    char *type=(char *)cmd->info;
   
  -    env=workerEnv->globalEnv;
  +    jk_uriEnv_t *serverEnv=(jk_uriEnv_t *)
  +        ap_get_module_config(s->module_config, &jk_module);
  +    jk_workerEnv_t *workerEnv = serverEnv->workerEnv;
       
  -    workerEnv->init_data->put( env, workerEnv->init_data, "logger.file.level",
  -                               ap_pstrdup(cmd->pool, log_level), NULL);
  -
  -    if(0 == strcasecmp(log_level, JK_LOG_INFO_VERB)) {
  -        env->l->level=JK_LOG_INFO_LEVEL;
  -    }
  -    if(0 == strcasecmp(log_level, JK_LOG_DEBUG_VERB)) {
  -        env->l->level=JK_LOG_DEBUG_LEVEL;
  -    }
  +    jk_map_t *m=workerEnv->init_data;
       
  -    return NULL;
  -}
  -
  -/*
  - * JkLogStampFormat Directive Handling
  - *
  - * JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
  - */
  -static const char * jk_set_log_fmt(cmd_parms *cmd,
  -                      void *dummy,
  -                      const char * log_format)
  -{
  -    server_rec *s = cmd->server;
  -    jk_workerEnv_t *workerEnv =
  -        (jk_workerEnv_t *)ap_get_module_config(s->module_config, &jk_module);
  -
  -    workerEnv->init_data->put( NULL, workerEnv->init_data, "logger.file.timeFormat",
  -                               ap_pstrdup(cmd->pool,log_format), NULL);
  -    return NULL;
  -}
  -
  -/*
  - * JkExtractSSL Directive Handling
  - *
  - * JkExtractSSL On/Off
  - */
  -
  -static const char *jk_set_enable_ssl(cmd_parms *cmd,
  -                                     void *dummy,
  -                                     int flag)
  -{
  -    server_rec *s = cmd->server;
  -    jk_workerEnv_t *workerEnv =
  -        (jk_workerEnv_t *)ap_get_module_config(s->module_config, &jk_module);
  -   
  -    /* Set up our value */
  -    workerEnv->ssl_enable = flag ? JK_TRUE : JK_FALSE;
  -
  -    return NULL;
  -}
  -
  -/*
  - * JkHTTPSIndicator Directive Handling
  - *
  - * JkHTTPSIndicator HTTPS
  - */
  -
  -static const char *jk_set_https_indicator(cmd_parms *cmd,
  -                                          void *dummy,
  -                                          const char *indicator)
  -{
  -    server_rec *s = cmd->server;
  -    jk_workerEnv_t *workerEnv =
  -        (jk_workerEnv_t *)ap_get_module_config(s->module_config, &jk_module);
  -
  -    workerEnv->https_indicator = ap_pstrdup(cmd->pool,indicator);
  -
  -    return NULL;
  -}
  -
  -/*
  - * JkCERTSIndicator Directive Handling
  - *
  - * JkCERTSIndicator SSL_CLIENT_CERT
  - */
  -
  -static const char *jk_set_certs_indicator(cmd_parms *cmd,
  -                                          void *dummy,
  -                                          const char *indicator)
  -{
  -    server_rec *s = cmd->server;
  -    jk_workerEnv_t *workerEnv =
  -        (jk_workerEnv_t *)ap_get_module_config(s->module_config, &jk_module);
  -
  -    workerEnv->certs_indicator = ap_pstrdup(cmd->pool,indicator);
  -
  -    return NULL;
  -}
  -
  -/*
  - * JkCIPHERIndicator Directive Handling
  - *
  - * JkCIPHERIndicator SSL_CIPHER
  - */
  -
  -static const char *jk_set_cipher_indicator(cmd_parms *cmd,
  -                                           void *dummy,
  -                                           const char *indicator)
  -{
  -    server_rec *s = cmd->server;
  -    jk_workerEnv_t *workerEnv =
  -        (jk_workerEnv_t *)ap_get_module_config(s->module_config, &jk_module);
  -
  -    workerEnv->cipher_indicator = ap_pstrdup(cmd->pool,indicator);
  -
  -    return NULL;
  -}
  -
  -/*
  - * JkSESSIONIndicator Directive Handling
  - *
  - * JkSESSIONIndicator SSL_SESSION_ID
  - */
  -
  -static const char *jk_set_session_indicator(cmd_parms *cmd,
  -                                           void *dummy,
  -                                           const char *indicator)
  -{
  -    server_rec *s = cmd->server;
  -    jk_workerEnv_t *workerEnv =
  -        (jk_workerEnv_t *)ap_get_module_config(s->module_config, &jk_module);
  -
  -    workerEnv->session_indicator = ap_pstrdup(cmd->pool,indicator);
  -
  -    return NULL;
  -}
  -
  -/*
  - * JkKEYSIZEIndicator Directive Handling
  - *
  - * JkKEYSIZEIndicator SSL_CIPHER_USEKEYSIZE
  - */
  -
  -static const char *jk_set_key_size_indicator(cmd_parms *cmd,
  -                                           void *dummy,
  -                                           const char *indicator)
  -{
  -    server_rec *s = cmd->server;
  -    jk_workerEnv_t *workerEnv =
  -        (jk_workerEnv_t *)ap_get_module_config(s->module_config, &jk_module);
  -
  -    workerEnv->key_size_indicator = ap_pstrdup(cmd->pool,indicator);
  -
  -    return NULL;
  -}
  -
  -/*
  - * JkOptions Directive Handling
  - *
  - *
  - * +ForwardSSLKeySize        => Forward SSL Key Size, to follow 2.3 specs but may 
broke old TC 3.2
  - * -ForwardSSLKeySize        => Don't Forward SSL Key Size, will make mod_jk works 
with all TC release
  - *  ForwardURICompat         => Forward URI normally, less spec compliant but 
mod_rewrite compatible (old TC)
  - *  ForwardURICompatUnparsed => Forward URI as unparsed, spec compliant but broke 
mod_rewrite (old TC)
  - *  ForwardURIEscaped       => Forward URI escaped and Tomcat (3.3 rc2) stuff will 
do the decoding part
  - */
  -static const char *jk_set_options(cmd_parms *cmd,
  -                                  void *dummy,
  -                                  const char *line)
  -{
  -    int  opt = 0;
  -    int  mask = 0;
  -    char action;
  -    char *w;
  -
  -    server_rec *s = cmd->server;
  -    jk_workerEnv_t *workerEnv =
  -        (jk_workerEnv_t *)ap_get_module_config(s->module_config, &jk_module);
  -
  -    while (line[0] != 0) {
  -        w = ap_getword_conf(cmd->pool, &line);
  -        action = 0;
  -
  -        if (*w == '+' || *w == '-') {
  -            action = *(w++);
  -        }
  -
  -        mask = 0;
  -
  -        if (!strcasecmp(w, "ForwardKeySize")) {
  -            opt = JK_OPT_FWDKEYSIZE;
  -        }
  -        else if (!strcasecmp(w, "ForwardURICompat")) {
  -            opt = JK_OPT_FWDURICOMPAT;
  -            mask = JK_OPT_FWDURIMASK;
  -        }
  -        else if (!strcasecmp(w, "ForwardURICompatUnparsed")) {
  -            opt = JK_OPT_FWDURICOMPATUNPARSED;
  -            mask = JK_OPT_FWDURIMASK;
  -        }
  -        else if (!strcasecmp(w, "ForwardURIEscaped")) {
  -            opt = JK_OPT_FWDURIESCAPED;
  -            mask = JK_OPT_FWDURIMASK;
  -        }
  -        else
  -            return ap_pstrcat(cmd->pool, "JkOptions: Illegal option '", w, "'", 
NULL);
  +    env=workerEnv->globalEnv;
  +    
  +    value = jk_map_replaceProperties(env, m, m->pool, value);
   
  -        workerEnv->options &= ~mask;
  +    if(value==NULL)
  +        return NULL;
   
  -        if (action == '-') {
  -            workerEnv->options &= ~opt;
  -        }
  -        else if (action == '+') {
  -            workerEnv->options |=  opt;
  -        }
  -        else {
  -            /* for now +Opt == Opt */
  -            workerEnv->options |=  opt;
  -        }
  -    }
  +/*     workerEnv->init_data->add(  env, workerEnv->init_data, */
  +/*                                 ap_pstrdup(cmd->pool,name), */
  +/*                                 ap_pstrdup(cmd->pool,value)); */
       return NULL;
   }
   
  -/*
  - * JkEnvVar Directive Handling
  - *
  - * JkEnvVar MYOWNDIR
  +/* Command table.
    */
  -static const char *jk_add_env_var(cmd_parms *cmd,
  -                                  void *dummy,
  -                                  const char *env_name,
  -                                  const char *default_value)
  -{
  -    server_rec *s = cmd->server;
  -    jk_workerEnv_t *workerEnv =
  -        (jk_workerEnv_t *)ap_get_module_config(s->module_config, &jk_module);
  -
  -    workerEnv->envvars_in_use = JK_TRUE;
  -
  -    workerEnv->envvars->put(NULL, workerEnv->envvars, env_name,
  -                            ap_pstrdup(cmd->pool,default_value) , NULL);
  -
  -    return NULL;
  -}
  -    
   static const command_rec jk_cmds[] =
       {
  -    /*
  -     * JkWorkersFile specifies a full path to the location of the jk
  -     * properties file.
  -     */
       AP_INIT_TAKE1(
  -        "JkWorkersFile", jk_set_worker_file, NULL, RSRC_CONF,
  +        "JkWorkersFile", jk_set1, "workerFile", RSRC_CONF,
           "the name of a worker file for the Jakarta servlet containers"),
       AP_INIT_TAKE1(
  -        "JkProperties", jk_set_worker_file, NULL, RSRC_CONF,
  -        "the name of a worker file for the Jakarta servlet containers"),
  -
  -    /*
  -     * JkWorker allows you to specify worker properties in server.xml.
  -     * They are added before any property in JkWorkersFile ( if any ), 
  -     * as a more convenient way to configure
  -     */
  +        "JkProperties", jk_set1,  "workerFile", RSRC_CONF,
  +        "Properties file containing additional settings ( replaces JkWoprkerFile 
)"),
       AP_INIT_TAKE2(
  -        "JkSet", jk_worker_property, NULL, RSRC_CONF,
  +        "JkSet", jk_set2, NULL, RSRC_CONF,
           "Set a jk property, same syntax and rules as in JkWorkersFile"),
  -
  -    /*
  -     * JkMount mounts a url prefix to a worker (the worker need to be
  -     * defined in the worker properties file.
  -     */
  -    AP_INIT_TAKE23(
  -        "JkMount", jk_mount_context, NULL, RSRC_CONF,
  +    AP_INIT_TAKE2(
  +        "JkMount", jk_set2, "mount", RSRC_CONF,
           "A mount point from a context to a Tomcat worker"),
  -
  -    /*
  -     * JkWorker sets the worker associated with a <Location> directive.
  -     */
  +    AP_INIT_TAKE2(
  +        "JkWorker", jk_setWorker, NULL, RSRC_CONF,
  +        "Defines workers and worker properties "),
  +    AP_INIT_TAKE2(
  +        "JkWebapp", jk_setWebapp, NULL, ACCESS_CONF,
  +        "Defines a webapp in a Location directive and it's properties"),
  +    AP_INIT_TAKE2(
  +        "JkServlet", jk_setServlet, NULL, ACCESS_CONF,
  +        "Defines a servlet in a Location directive"),
       AP_INIT_TAKE1(
  -        "JkWorker", jk_set_worker, NULL, ACCESS_CONF,
  -        "Worker to be used for a webapp declared as Location"),
  -
  -    /*
  -     * JkMountCopy specifies if mod_jk should copy the mount points
  -     * from the main server to the virtual servers.
  -     */
  -    AP_INIT_FLAG(
  -        "JkMountCopy", jk_set_mountcopy, NULL, RSRC_CONF,
  -        "Should the base server mounts be copied to the virtual server"),
  -
  -    /* -------------------- Should be part of workers.properties ------------ */
  -    /*
  -     * JkLogFile & JkLogLevel specifies to where should the plugin log
  -     * its information and how much.
  -     * JkLogStampFormat specify the time-stamp to be used on log
  -     * XXX We should use error.log !
  -     */
  +        "JkMountCopy", jk_set1, "root_apps_are_global", RSRC_CONF,
  +        "Should the base server mounts be copied from main server to the virtual 
server"),
       AP_INIT_TAKE1(
  -        "JkLogFile", jk_set_log_file, NULL, RSRC_CONF,
  +        "JkLogFile", jk_set1, "logFile", RSRC_CONF,
           "Full path to the Jakarta Tomcat module log file"),
       AP_INIT_TAKE1(
  -        "JkLogLevel", jk_set_log_level, NULL, RSRC_CONF,
  +        "JkLogLevel", jk_set1, "logLevel", RSRC_CONF,
           "The Jakarta Tomcat module log level, can be debug, "
           "info, error or emerg"),
       AP_INIT_TAKE1(
  -        "JkLogStampFormat", jk_set_log_fmt, NULL, RSRC_CONF,
  +        "JkLogStampFormat", jk_set1, "logStampFormat", RSRC_CONF,
           "The Jakarta Tomcat module log format, follow strftime synthax"),
  -
  -    /*
  -     * Apache has multiple SSL modules (for example apache_ssl, stronghold
  -     * IHS ...). Each of these can have a different SSL environment names
  -     * The following properties let the administrator specify the envoiroment
  -     * variables names.
  -     *
  -     * HTTPS - indication for SSL
  -     * CERTS - Base64-Der-encoded client certificates.
  -     * CIPHER - A string specifing the ciphers suite in use.
  -     * KEYSIZE - Size of Key used in dialogue (#bits are secure)
  -     * SESSION - A string specifing the current SSL session.
  -     */
       AP_INIT_TAKE1(
  -        "JkHTTPSIndicator", jk_set_https_indicator, NULL, RSRC_CONF,
  +        "JkHTTPSIndicator", jk_set1, "HttpsIndicator", RSRC_CONF,
           "Name of the Apache environment that contains SSL indication"),
       AP_INIT_TAKE1(
  -        "JkCERTSIndicator", jk_set_certs_indicator, NULL, RSRC_CONF,
  +        "JkCERTSIndicator", jk_set1, "CertsIndicator", RSRC_CONF,
           "Name of the Apache environment that contains SSL client certificates"),
       AP_INIT_TAKE1(
  -         "JkCIPHERIndicator", jk_set_cipher_indicator, NULL, RSRC_CONF,
  +         "JkCIPHERIndicator", jk_set1, "CipherIndicator", RSRC_CONF,
           "Name of the Apache environment that contains SSL client cipher"),
       AP_INIT_TAKE1(
  -        "JkSESSIONIndicator", jk_set_session_indicator, NULL, RSRC_CONF,
  +        "JkSESSIONIndicator", jk_set1, "SessionIndicator", RSRC_CONF,
           "Name of the Apache environment that contains SSL session"),
       AP_INIT_TAKE1(
  -        "JkKEYSIZEIndicator", jk_set_key_size_indicator, NULL, RSRC_CONF,
  +        "JkKEYSIZEIndicator", jk_set1, "KeySizeIndicator", RSRC_CONF,
           "Name of the Apache environment that contains SSL key size in use"),
  -    AP_INIT_FLAG(
  -        "JkExtractSSL", jk_set_enable_ssl, NULL, RSRC_CONF,
  +    AP_INIT_TAKE1(
  +        "JkExtractSSL", jk_set1, "extractSsl", RSRC_CONF,
           "Turns on SSL processing and information gathering by mod_jk"),
  -
  -    /*
  -     * Options to tune mod_jk configuration
  -     * for now we understand :
  -     * +ForwardSSLKeySize        => Forward SSL Key Size, to follow 2.3
  -                                    specs but may broke old TC 3.2
  -     * -ForwardSSLKeySize        => Don't Forward SSL Key Size, will make
  -                                    mod_jk works with all TC release
  -     *  ForwardURICompat         => Forward URI normally, less spec compliant
  -                                    but mod_rewrite compatible (old TC)
  -     *  ForwardURICompatUnparsed => Forward URI as unparsed, spec compliant
  -                                    but broke mod_rewrite (old TC)
  -     *  ForwardURIEscaped        => Forward URI escaped and Tomcat (3.3 rc2)
  -                                    stuff will do the decoding part
  -     */
  -    AP_INIT_RAW_ARGS(
  -        "JkOptions", jk_set_options, NULL, RSRC_CONF, 
  -        "Set one of more options to configure the mod_jk module"),
  -
  -    /*
  -     * JkEnvVar let user defines envs var passed from WebServer to
  -     * Servlet Engine
  -     */
  +    AP_INIT_TAKE1(
  +        "JkForwardSSLKeySize", jk_set1, "forwardSslKeySize", RSRC_CONF,
  +        "Forward SSL Key Size, to follow 2.3 specs but may broke old TC 3.2,"
  +        "off is backward compatible"),
  +    AP_INIT_TAKE1(
  +        "ForwardURICompat",  jk_set1, "forwardUriCompat", RSRC_CONF,
  +        "Forward URI normally, less spec compliant but mod_rewrite compatible (old 
TC)"),
  +    AP_INIT_TAKE1(
  +        "JkForwardURICompatUnparsed", jk_set1, "forwardUriCompatUnparsed", 
RSRC_CONF,
  +        "Forward URI as unparsed, spec compliant but broke mod_rewrite (old TC)"),
  +    AP_INIT_TAKE1(
  +        "JkForwardURIEscaped", jk_set1, "forwardUriEscaped", RSRC_CONF,
  +        "Forward URI escaped and Tomcat (3.3 rc2) stuff will do the decoding part"),
       AP_INIT_TAKE2(
  -        "JkEnvVar", jk_add_env_var, NULL, RSRC_CONF,
  -        "Adds a name of environment variable that should be sent "
  +        "JkEnvVar", jk_set2, "env", RSRC_CONF,
  +        "Adds a name of environment variable that should be sent from web server "
           "to servlet-engine"),
  -
  -    {NULL}
  +    NULL
   };
   
  -static void *create_jk_dir_config(apr_pool_t *p, char *dummy)
  +static void *create_jk_dir_config(apr_pool_t *p, char *path)
   {
       jk_uriEnv_t *new =
           (jk_uriEnv_t *)apr_pcalloc(p, sizeof(jk_uriEnv_t));
   
  -    printf("XXX Create dir config %s %p\n", dummy, new);
  -    new->uri = dummy;
  +    fprintf(stderr, "XXX Create dir config %s %p\n", path, new);
  +    new->uri = path;
  +    new->workerEnv=workerEnv;
  +    
       return new;
   }
   
  @@ -710,24 +447,23 @@
       
       
       /* XXX */
  -    printf("XXX Merged dir config %p %p\n", base, new);
  +    fprintf(stderr, "XXX Merged dir config %p %p %s %s %p %p\n",
  +            base, new,
  +            base->uri, add->uri,
  +            base->webapp, add->webapp);
  +
  +    if( add->webapp == NULL ) {
  +        add->webapp=base->webapp;
  +    }
  +    
       return add;
   }
   
  -/** Create default jk_config. XXX This is mostly server-independent,
  -    all servers are using something similar - should go to common.
  -
  -    This is the first thing called ( or should be )
  - */
  -static void *create_jk_config(apr_pool_t *p, server_rec *s)
  -{
  -    /* XXX Do we need both env and workerEnv ? */
  +static void create_workerEnv(apr_pool_t *p, server_rec *s) {
       jk_env_t *env;
  -    jk_workerEnv_t *workerEnv;
       jk_logger_t *l;
       jk_pool_t *globalPool;
  -    jk_pool_t *workerEnvPool;
  -
  +    
       /** First create a pool
        */
   #ifdef NO_APACHE_POOL
  @@ -743,40 +479,61 @@
   
       /* Optional. Register more factories ( or replace existing ones ) */
   
  -
       /* Init the environment. */
       
       /* Create the logger */
   #ifdef NO_APACHE_LOGGER
       l = env->getInstance( env, env->globalPool, "logger", "file");
   #else
  -    jk_logger_apache2_factory( env, env->globalPool, &l, "logger", "file");
  +    jk_logger_apache2_factory( env, env->globalPool, (void *)&l, "logger", "file");
       l->logger_private=s;
   #endif
       
       env->l=l;
  -    l->level=JK_LOG_ERROR_LEVEL;
       
       /* Create the workerEnv */
  -    workerEnvPool=
  -        env->globalPool->create( env, env->globalPool, HUGE_POOL_SIZE );    
  -    workerEnv= env->getInstance( env,
  -                                 workerEnvPool,
  -                                 "workerEnv", "default");
  +    workerEnv= env->getInstance( env, env->globalPool,"workerEnv", "default");
   
  -    workerEnv->globalEnv=env;
       if( workerEnv==NULL ) {
           env->l->jkLog(env, env->l, JK_LOG_ERROR, "Error creating workerEnv\n");
  -        return NULL;
  +        return;
       }
   
       /* Local initialization */
       workerEnv->_private = s;
  +    fprintf( stderr, "Create worker env %p\n", workerEnv );
  +}
   
  -    env->l->jkLog(env, env->l, JK_LOG_INFO, "mod_jk.create_jk_config()\n" ); 
  -    return workerEnv;
  +/** Create default jk_config. XXX This is mostly server-independent,
  +    all servers are using something similar - should go to common.
  +
  +    This is the first thing called ( or should be )
  + */
  +static void *create_jk_config(apr_pool_t *p, server_rec *s)
  +{
  +    jk_uriEnv_t *newUri;
  +
  +    if(  workerEnv==NULL ) {
  +        create_workerEnv(p, s );
  +    }
  +    if( s->is_virtual == 1 ) {
  +        /* Virtual host */
  +        
  +        
  +    } else {
  +        /* Default host */
  +        
  +    }
  +
  +    newUri=(jk_uriEnv_t *)apr_pcalloc(p, sizeof(jk_uriEnv_t));
  +
  +    newUri->workerEnv=workerEnv;
  +    
  +    return newUri;
   }
   
  +
  +
   /** Standard apache callback, merge jk options specified in 
       <Host> context. Used to set per virtual host configs
    */
  @@ -784,59 +541,26 @@
                                void *basev, 
                                void *overridesv)
   {
  -    jk_workerEnv_t *base = (jk_workerEnv_t *) basev;
  -    jk_workerEnv_t *overrides = (jk_workerEnv_t *)overridesv;
  +    jk_uriEnv_t *base = (jk_uriEnv_t *) basev;
  +    jk_uriEnv_t *overrides = (jk_uriEnv_t *)overridesv;
       
  -
  -    /* XXX Commented out for now. It'll be reimplemented after we
  -       add per/dir config and merge. 
  -    if(base->ssl_enable) {
  -        overrides->ssl_enable        = base->ssl_enable;
  -        overrides->https_indicator   = base->https_indicator;
  -        overrides->certs_indicator   = base->certs_indicator;
  -        overrides->cipher_indicator  = base->cipher_indicator;
  -        overrides->session_indicator = base->session_indicator;
  -    }
  -
  -    overrides->options = base->options;
  -
  -    if(overrides->workerEnvmountcopy) {
  -        copy_jk_map(p, overrides->s, base->uri_to_context, 
  -                    overrides->uri_to_context);
  -        copy_jk_map(p, overrides->s, base->automount, overrides->automount);
  -    }
  -
  -    if(base->envvars_in_use) {
  -        overrides->envvars_in_use = JK_TRUE;
  -        overrides->envvars = apr_table_overlay(p, overrides->envvars, 
  -                                               base->envvars);
  -    }
  -
  -    if(overrides->log_file && overrides->log_level >= 0) {
  -        if(!jk_open_file_logger(&(overrides->log), overrides->log_file, 
  -                                overrides->log_level)) {
  -            overrides->log = NULL;
  -        }
  -    }
  -    if(!uri_worker_map_alloc(&(overrides->uw_map), 
  -                             overrides->uri_to_context, 
  -                             overrides->log)) {
  -    }
  +    fprintf(stderr,  "Merging workerEnv \n" );
       
  -    if (base->secret_key)
  -        overrides->secret_key = base->secret_key;
  -    */
  -
  +    /* The 'mountcopy' option should be implemented in common.
  +     */
       return overrides;
   }
   
  +
   /** Standard apache callback, initialize jk.
    */
   static void jk_child_init(apr_pool_t *pconf, 
                             server_rec *s)
   {
  -    jk_workerEnv_t *workerEnv =
  -        (jk_workerEnv_t *)ap_get_module_config(s->module_config, &jk_module);
  +    jk_uriEnv_t *serverEnv=(jk_uriEnv_t *)
  +        ap_get_module_config(s->module_config, &jk_module);
  +    jk_workerEnv_t *workerEnv = serverEnv->workerEnv;
  +
       jk_env_t *env=workerEnv->globalEnv;
   
       env->l->jkLog(env, env->l, JK_LOG_INFO, "mod_jk child init\n" );
  @@ -854,28 +578,13 @@
       SetHandler and normal apache directives ( but minimal jk-specific
       stuff )
   */
  -static void init_jk( jk_env_t *env, apr_pool_t *pconf,
  +static char * init_jk( jk_env_t *env, apr_pool_t *pconf,
                        jk_workerEnv_t *workerEnv, server_rec *s )
   {
  -    int err;
  -
  -    env->l->jkLog(env, env->l, JK_LOG_INFO, "mod_jk.init_jk()\n" ); 
  -
  -    env->l->open( env, env->l, workerEnv->init_data );
  -
  -    /* local initialization */
  -    workerEnv->virtual       = "*";     /* for now */
  +    workerEnv->init(env, workerEnv );
       workerEnv->server_name   = (char *)ap_get_server_version();
  -
  -    /* Init() - post-config initialization ( now all options are set ) */
  -    workerEnv->init( env, workerEnv ); 
  -
  -    err=workerEnv->uriMap->init(env, workerEnv->uriMap,
  -                                workerEnv,
  -                                workerEnv->init_data );
  -    
       ap_add_version_component(pconf, JK_EXPOSED_VERSION);
  -    return;
  +    return NULL;
   }
   
   /* Apache will first validate the config then restart.
  @@ -917,21 +626,18 @@
                              apr_pool_t *ptemp, 
                              server_rec *s)
   {
  -    jk_workerEnv_t *workerEnv;
       apr_pool_t *gPool=NULL;
       void *data=NULL;
       int rc;
       jk_env_t *env;
  -
  +    
       if(s->is_virtual) 
           return OK;
   
  -    workerEnv =
  -        (jk_workerEnv_t *)ap_get_module_config(s->module_config, &jk_module);
  -
       env=workerEnv->globalEnv;
       
       rc=jk_apache2_isValidating( plog, &gPool );
  +
       if( rc == JK_TRUE ) {
           /* This is the first step */
           env->l->jkLog(env, env->l, JK_LOG_INFO,
  @@ -954,16 +660,6 @@
   /* The JK module handlers                                                    */
   /* ========================================================================= */
   
  -/** Util - cleanup endpoint. Used with per/thread endpoints.
  - */
  -static apr_status_t jk_cleanup_endpoint( void *data ) {
  -    jk_endpoint_t *end = (jk_endpoint_t *)data;    
  -    printf("XXX jk_cleanup1 %p\n", data);
  -    /* XXX get env */
  -    end->done(NULL, end);  
  -    return 0;
  -}
  -
   /** Main service method, called to forward a request to tomcat
    */
   static int jk_handler(request_rec *r)
  @@ -989,8 +685,8 @@
           return HTTP_INTERNAL_SERVER_ERROR;
       }
   
  -    workerEnv=(jk_workerEnv_t *)ap_get_module_config(r->server->module_config, 
  -                                                     &jk_module);
  +    workerEnv = uriEnv->workerEnv;
  +
       /* XXX Get an env instance */
       env = workerEnv->globalEnv;
   
  @@ -1029,7 +725,7 @@
           jk_ws_service_t *s=&sOnStack;
           int is_recoverable_error = JK_FALSE;
   
  -        jk_service_apache2_factory( env, end->cPool, &s,
  +        jk_service_apache2_factory( env, end->cPool, (void *)&s,
                                       "service", "apache2");
           
           s->init( env, s, end, r );
  @@ -1064,8 +760,8 @@
       }
       
       uriEnv=ap_get_module_config( r->per_dir_config, &jk_module );
  -    workerEnv=(jk_workerEnv_t *)ap_get_module_config(r->server->module_config,
  -                                                     &jk_module);
  +    workerEnv=uriEnv->workerEnv;
  +    
       /* XXX get_env() */
       env=workerEnv->globalEnv;
           
  @@ -1163,7 +859,7 @@
   {
       STANDARD20_MODULE_STUFF,
       create_jk_dir_config,/*  dir config creater */
  -    NULL,  /* merge_jk_dir_config dir merger --- default is to override */
  +    merge_jk_dir_config, /* dir merger --- default is to override */
       create_jk_config,    /* server config */
       merge_jk_config,     /* merge server config */
       jk_cmds,             /* command ap_table_t */
  
  
  

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

Reply via email to