costin      01/12/04 10:40:42

  Modified:    jk/native2/common jk_ajp14.h jk_ajp14_worker.c
  Log:
  Merged the code from common.
  
  Merged the methods ( what used to be split between 14 and 13 specific ).
  
  Revision  Changes    Path
  1.2       +67 -99    jakarta-tomcat-connectors/jk/native2/common/jk_ajp14.h
  
  Index: jk_ajp14.h
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native2/common/jk_ajp14.h,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- jk_ajp14.h        2001/12/01 22:40:10     1.1
  +++ jk_ajp14.h        2001/12/04 18:40:42     1.2
  @@ -58,75 +58,109 @@
   /***************************************************************************
    * Description: Next generation bi-directional protocol handler.           *
    * Author:      Henri Gomez <[EMAIL PROTECTED]>                               *
  - * Version:     $Revision: 1.1 $                                           *
  + * Version:     $Revision: 1.2 $                                           *
    ***************************************************************************/
   #ifndef JK_AJP14_H
   #define JK_AJP14_H
   
  -#include "jk_ajp_common.h"
  -#include "jk_context.h"
  +#include "jk_global.h"
  +#include "jk_mt.h"
  +#include "jk_msg_buff.h"
  +#include "jk_pool.h"
  +#include "jk_logger.h"
  +#include "jk_service.h"
  +#include "jk_worker.h"
   
  +
   #ifdef __cplusplus
   extern "C" {
   #endif /* __cplusplus */
   
  -#define AJP14_PROTO                                  14
  +    
  +#define AJP_DEF_RETRY_ATTEMPTS    (1)
   
  -#define AJP14_DEF_HOST               ("localhost")
  -#define AJP14_DEF_PORT               (8011)
  -#define AJP14_READ_BUF_SIZEd    (8*1024)
  -#define AJP14_DEF_RETRY_ATTEMPTS  (1)
  -#define AJP14_DEF_CACHE_SZ      (1)
  -#define AJP14_MAX_SEND_BODY_SZ  (DEF_BUFFER_SZ - 6)
  -#define AJP14_HEADER_LEN     (4)
  -#define AJP14_HEADER_SZ_LEN  (2)
  +#define AJP_HEADER_LEN            (4)
  +#define AJP_HEADER_SZ_LEN         (2)
  +#define CHUNK_BUFFER_PAD          (12)
   
  +#define AJP13_PROTO                                  13
  +#define AJP13_WS_HEADER                              0x1234
  +#define AJP13_SW_HEADER                              0x4142  /* 'AB' */
  +
  +#define AJP13_DEF_HOST               ("localhost")
  +#define AJP13_DEF_PORT               (8009)
  +#define AJP13_READ_BUF_SIZE         (8*1024)
  +#define AJP13_DEF_CACHE_SZ          (1)
  +#define JK_INTERNAL_ERROR            (-2)
  +#define JK_FATAL_ERROR              (-3)
  +#define JK_CLIENT_ERROR             (-4)
  +#define AJP13_MAX_SEND_BODY_SZ      (DEF_BUFFER_SZ - 6)
  +
   /*
  - * Context Query (web server -> servlet engine), which URI are handled by servlet 
engine ?
  + * Message does not have a response (for example, JK_AJP13_END_RESPONSE)
    */
  -#define AJP14_CONTEXT_QRY_CMD        (unsigned char)0x15
  +#define JK_AJP13_ERROR              -1
  +/*
  + * Message does not have a response (for example, JK_AJP13_END_RESPONSE)
  + */
  +#define JK_AJP13_NO_RESPONSE        0
  +/*
  + * Message have a response.
  + */
  +#define JK_AJP13_HAS_RESPONSE       1
   
   /*
  - * Context Info (servlet engine -> web server), URI handled response
  + * Forward a request from the web server to the servlet container.
    */
  -#define AJP14_CONTEXT_INFO_CMD       (unsigned char)0x16
  +#define JK_AJP13_FORWARD_REQUEST    (unsigned char)2
   
  -/* 
  - * Context Update (servlet engine -> web server), status of context changed
  +/*
  + * Write a body chunk from the servlet container to the web server
    */
  -#define AJP14_CONTEXT_UPDATE_CMD (unsigned char)0x17
  +#define JK_AJP13_SEND_BODY_CHUNK    (unsigned char)3
   
   /*
  - * Servlet Engine Status (web server -> servlet engine), what's the status of the 
servlet engine ?
  + * Send response headers from the servlet container to the web server.
    */
  -#define AJP14_STATUS_CMD     (unsigned char)0x18
  +#define JK_AJP13_SEND_HEADERS       (unsigned char)4
   
   /*
  - * Secure Shutdown command (web server -> servlet engine),
  - * please servlet stop yourself.
  + * Marks the end of response.
    */
  -#define AJP14_SHUTDOWN_CMD   (unsigned char)0x19
  +#define JK_AJP13_END_RESPONSE       (unsigned char)5
   
   /*
  - * Secure Shutdown command Accepted (servlet engine -> web server)
  + * Marks the end of response.
    */
  -#define AJP14_SHUTOK_CMD     (unsigned char)0x1A
  +#define JK_AJP13_GET_BODY_CHUNK     (unsigned char)6
   
   /*
  - * Secure Shutdown Rejected (servlet engine -> web server)
  + * Asks the container to shutdown
    */
  -#define AJP14_SHUTNOK_CMD    (unsigned char)0x1B
  +#define JK_AJP13_SHUTDOWN           (unsigned char)7
   
   /*
  - * Context Status (web server -> servlet engine), what's
  - * the status of the context ?
  + * Functions
    */
  -#define AJP14_CONTEXT_STATE_CMD              (unsigned char)0x1C
  +int ajp13_marshal_shutdown_into_msgb(jk_msg_buf_t *msg,
  +                                     jk_pool_t *p,
  +                                     jk_logger_t *l);
  +
  +#define AJP14_PROTO                                  14
  +
  +#define AJP14_DEF_HOST               ("localhost")
  +#define AJP14_DEF_PORT               (8011)
  +#define AJP14_READ_BUF_SIZEd    (8*1024)
  +#define AJP14_DEF_RETRY_ATTEMPTS  (1)
  +#define AJP14_DEF_CACHE_SZ      (1)
  +#define AJP14_MAX_SEND_BODY_SZ  (DEF_BUFFER_SZ - 6)
  +#define AJP14_HEADER_LEN     (4)
  +#define AJP14_HEADER_SZ_LEN  (2)
   
   /*
  - * Context Status Reply (servlet engine -> web server), status of context
  + * Servlet Engine Status (web server -> servlet engine), what's the status of the 
servlet engine ?
    */
  -#define AJP14_CONTEXT_STATE_REP_CMD  (unsigned char)0x1D
  +#define AJP14_STATUS_CMD     (unsigned char)0x18
   
   /*
    * Unknown Packet Reply (web server <-> servlet engine),
  @@ -203,56 +237,7 @@
   #define AJP14_CONTEXT_DOWN       0x01
   #define AJP14_CONTEXT_UP         0x02
   #define AJP14_CONTEXT_OK         0x03
  -
  -/* 
  - * Misc defines
  - */
  -#define AJP14_ENTROPY_SEED_LEN               32      /* we're using MD5 => 32 chars 
*/
  -#define AJP14_COMPUTED_KEY_LEN               32  /* we're using MD5 also */
  -
  -/*
  - * The login structure
  - */
  -typedef struct jk_login_service jk_login_service_t;
  -
  -struct jk_login_service {
  -
  -    /*
  -     *  Pointer to web-server name
  -     */
  -    char * web_server_name;
  -    
  -    /*
  -     * Pointer to servlet-engine name
  -     */
  -    char * servlet_engine_name;
  -    
  -    /*
  -     * Pointer to secret key
  -     */
  -    char * secret_key;
  -    
  -    /*
  -     * Received entropy seed
  -     */
  -    char entropy[AJP14_ENTROPY_SEED_LEN + 1];
  -    
  -    /*
  -     * Computed key
  -     */
  -    char computed_key[AJP14_COMPUTED_KEY_LEN + 1];
  -    
  -    /*
  -     *  What we want to negociate
  -     */
  -    unsigned long negociation;
       
  -    /*
  -     * What we received from servlet engine 
  -     */
  -    unsigned long negociated;
  -};                                
  -    
   /*
    * functions defined here 
    */
  @@ -270,23 +255,6 @@
   int ajp14_marshal_context_query_into_msgb(jk_msg_buf_t *msg, 
                                             char *virtual, 
                                             jk_logger_t *l);
  -
  -int ajp14_unmarshal_context_info(jk_msg_buf_t *msg, 
  -                                 jk_context_t *context, 
  -                                 jk_logger_t *l);
  -
  -int ajp14_marshal_context_state_into_msgb(jk_msg_buf_t *msg, 
  -                                          jk_context_t *context, 
  -                                          char         *cname,
  -                                          jk_logger_t *l);
  -    
  -int ajp14_unmarshal_context_state_reply(jk_msg_buf_t *msg, 
  -                                        jk_context_t *context, 
  -                                        jk_logger_t *l);
  -
  -int ajp14_unmarshal_context_update_cmd(jk_msg_buf_t *msg, 
  -                                       jk_context_t *context, 
  -                                       jk_logger_t *l);
   
   #ifdef __cplusplus
   }
  
  
  
  1.3       +351 -74   jakarta-tomcat-connectors/jk/native2/common/jk_ajp14_worker.c
  
  Index: jk_ajp14_worker.c
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native2/common/jk_ajp14_worker.c,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- jk_ajp14_worker.c 2001/12/02 01:05:25     1.2
  +++ jk_ajp14_worker.c 2001/12/04 18:40:42     1.3
  @@ -64,36 +64,172 @@
    */
   
   #include "jk_global.h"
  -#include "jk_context.h"
   #include "jk_pool.h"
  -#include "jk_util.h"
  +#include "jk_channel.h"
   #include "jk_msg_buff.h"
  -#include "jk_ajp_common.h"
   #include "jk_ajp14.h" 
   #include "jk_logger.h"
   #include "jk_service.h"
   #include "jk_env.h"
   
   /* Ajp14 methods - XXX move to handler abstraction */
  -int logon(ajp_endpoint_t *ae,
  +int logon(jk_endpoint_t *ae,
             jk_logger_t    *l);
   
  -int discovery(ajp_endpoint_t *ae,
  +int discovery(jk_endpoint_t *ae,
                 jk_workerEnv_t *we,
                 jk_logger_t    *l);
   
  +/*
  + * Functions
  + */
  +static int validate(jk_worker_t *pThis,
  +             jk_map_t    *props,
  +             jk_workerEnv_t *we,
  +             jk_logger_t *l );
  +
  +int JK_METHOD ajp_done(jk_endpoint_t **e,
  +                       jk_logger_t    *l);
  +
  +
  +
   /* -------------------- Method -------------------- */
  -static int JK_METHOD validate(jk_worker_t *pThis,
  -                              jk_map_t    *props,
  -                              jk_workerEnv_t *we,
  -                              jk_logger_t *l)
  -{   
  -    ajp_worker_t *aw;
  +#define      JK_RETRIES 3
  +
  +/*
  + * service is now splitted in ajp_send_request and ajp_get_reply
  + * much more easier to do errors recovery
  + *
  + * We serve here the request, using AJP13/AJP14 (e->proto)
  + *
  + */
  +int JK_METHOD ajp_service(jk_endpoint_t   *e, 
  +                          jk_ws_service_t *s,
  +                          jk_logger_t     *l,
  +                          int             *is_recoverable_error)
  +{
  +    int i;
  +    int err;
  +    
  +    l->jkLog(l, JK_LOG_DEBUG, "Into jk_endpoint_t::service\n");
  +
  +    if( ( e== NULL ) 
  +     || ( s == NULL )
  +        || ! is_recoverable_error ) {
  +     l->jkLog(l, JK_LOG_ERROR, "jk_endpoint_t::service: NULL parameters\n");
  +     return JK_FALSE;
  +    }
  +     
  +    e->request = jk_b_new(&(e->pool));
  +    jk_b_set_buffer_size(e->request, DEF_BUFFER_SZ); 
  +    jk_b_reset(e->request);
  +    
  +    e->reply = jk_b_new(&(e->pool));
  +    jk_b_set_buffer_size(e->reply, DEF_BUFFER_SZ);
  +    jk_b_reset(e->reply); 
  +     
  +    e->post = jk_b_new(&(e->pool));
  +    jk_b_set_buffer_size(e->post, DEF_BUFFER_SZ);
  +    jk_b_reset(e->post); 
  +    
  +    e->recoverable = JK_TRUE;
  +    e->uploadfd       = -1;          /* not yet used, later ;) */
  +    
  +    e->left_bytes_to_send = s->content_length;
  +    e->reuse = JK_FALSE;
  +    *is_recoverable_error = JK_TRUE;
  +    
  +    /* 
  +     * We get here initial request (in reqmsg)
  +     */
  +    if (!jk_handler_request_marshal(e->request, s, l, e)) {
  +     *is_recoverable_error = JK_FALSE;                
  +     l->jkLog(l, JK_LOG_ERROR, "jk_endpoint_t::service: error marshaling\n");
  +     return JK_FALSE;
  +    }
  +    
  +    /* 
  +     * JK_RETRIES could be replaced by the number of workers in
  +     * a load-balancing configuration 
  +     */
  +    for (i = 0; i < JK_RETRIES; i++) {
  +     /*
  +      * We're using reqmsg which hold initial request
  +      * if Tomcat is stopped or restarted, we will pass reqmsg
  +      * to next valid tomcat. 
  +      */
  +     err=ajp_send_request(e, s, l);
  +     if (err!=JK_TRUE ) {
  +         l->jkLog(l, JK_LOG_ERROR, 
  +                "In jk_endpoint_t::service, ajp_send_request"
  +                "failed in send loop %d\n", i);
  +     } else {
  +         /* If we have the no recoverable error, it's probably because the sender 
(browser)
  +          * stop sending data before the end (certainly in a big post)
  +          */
  +         if (! e->recoverable) {
  +             *is_recoverable_error = JK_FALSE;
  +             l->jkLog(l, JK_LOG_ERROR, "In jk_endpoint_t::service,"
  +                    "ajp_send_request failed without recovery in send loop %d\n", 
i);
  +             return JK_FALSE;
  +         }
  +         
  +         /* Up to there we can recover */
  +         *is_recoverable_error = JK_TRUE;
  +         e->recoverable = JK_TRUE;
  +         
  +         if (ajp_get_reply(e, s, l))
  +             return (JK_TRUE);
  +         
  +         /* if we can't get reply, check if no recover flag was set 
  +          * if is_recoverable_error is cleared, we have started received 
  +          * upload data and we must consider that operation is no more recoverable
  +          */
  +         if (! e->recoverable) {
  +             *is_recoverable_error = JK_FALSE;
  +             l->jkLog(l, JK_LOG_ERROR, "In jk_endpoint_t::service,"
  +                    "ajp_get_reply failed without recovery in send loop %d\n", i);
  +             return JK_FALSE;
  +         }
  +         
  +         l->jkLog(l, JK_LOG_ERROR, "In jk_endpoint_t::service,"
  +                "ajp_get_reply failed in send loop %d\n", i);
  +     }
  +     /* Try again to connect */
  +     {
  +         jk_channel_t *channel=e->worker->channel;
  +         
  +         l->jkLog(l, JK_LOG_ERROR, "Error sending request, reconnect\n");
  +         err=channel->close( channel, e );
  +         err=channel->open( channel, e );
  +         if( err != JK_TRUE ) {
  +             l->jkLog(l, JK_LOG_ERROR, "Reconnect failed\n");
  +             return err;
  +         }
  +     }
  +    }
  +    
  +    return JK_FALSE;
  +}
  +
  +/*
  + * Validate the worker (ajp13/ajp14)
  + */
  +static int validate(jk_worker_t *pThis,
  +                    jk_map_t    *props,
  +                    jk_workerEnv_t *we,
  +                    jk_logger_t *l)
  +{
  +    int    port;
  +    char * host;
  +    int err;
  +    jk_worker_t *p = pThis;
  +    jk_worker_t *aw;
       char * secret_key;
       int proto=AJP14_PROTO;
   
  -    aw = pThis->worker_private;
  -    secret_key = jk_get_worker_secret_key(props, aw->name);
  +    aw = pThis;
  +    secret_key = map_getStrProp( props, "worker", aw->name, "secretkey", NULL );
       
       if ((!secret_key) || (!strlen(secret_key))) {
           l->jkLog(l, JK_LOG_ERROR,
  @@ -103,54 +239,190 @@
           aw->logon= NULL; 
       }
       
  -    if (ajp_validate(pThis, props, we, l, proto) == JK_FALSE)
  -        return JK_FALSE;
  +    if (proto == AJP13_PROTO) {
  +     port = AJP13_DEF_PORT;
  +     host = AJP13_DEF_HOST;
  +    } else if (proto == AJP14_PROTO) {
  +     port = AJP14_DEF_PORT;
  +     host = AJP14_DEF_HOST;
  +    } else {
  +     l->jkLog(l, JK_LOG_ERROR,
  +                 "ajp14.validate() unknown protocol %d\n",proto);
  +     return JK_FALSE;
  +    } 
  +    if( pThis->channel == NULL ) {
  +     /* Create a default channel */
  +     jk_env_t *env= we->env;
  +
  +     jk_env_objectFactory_t fac = 
  +         (jk_env_objectFactory_t)env->getFactory(env, "channel", "socket" );
  +     l->jkLog( l, JK_LOG_DEBUG, "Got socket channel factory \n");
  +
  +     err=fac( env, (void **)&pThis->channel, "channel", "socket" );
  +     if( err != JK_TRUE ) {
  +         l->jkLog(l, JK_LOG_ERROR, "Error creating socket factory\n");
  +         return err;
  +     }
  +     l->jkLog(l, JK_LOG_ERROR, "Got channel %lx %lx\n", pThis, pThis->channel);
  +    }
  +    
  +    pThis->channel->setProperty( pThis->channel, "defaultPort", "8007" );
  +
  +    err=pThis->channel->init( pThis->channel, props, p->name, pThis, l );
  +    if( err != JK_TRUE ) {
  +     l->jkLog(l, JK_LOG_ERROR, "ajp14.validate(): resolve failed\n");
  +     return err;
  +    }
       
  -    /* l->jkLog(l, JK_LOG_DEBUG,
  -       "Into ajp14:validate - secret_key=%s\n", secret_key); */
       return JK_TRUE;
   }
  +
   
  -static int JK_METHOD get_endpoint(jk_worker_t    *pThis,
  -                                  jk_endpoint_t **pend,
  +int ajp_destroy(jk_worker_t **pThis,
  +                jk_logger_t *l,
  +                int          proto)
  +{
  +}
  +
  +int JK_METHOD ajp_done(jk_endpoint_t **e,
  +                       jk_logger_t    *l)
  +{
  +    l->jkLog(l, JK_LOG_DEBUG, "Into jk_endpoint_t::done\n");
  +
  +    if (e && *e ) {
  +        jk_endpoint_t *p = *e;
  +        int reuse_ep = p->reuse;
  +
  +        ajp_reset_endpoint(p);
  +
  +        if(reuse_ep) {
  +            jk_worker_t *w = p->worker;
  +            if(w->ep_cache_sz) {
  +                int rc;
  +                JK_ENTER_CS(&w->cs, rc);
  +                if(rc) {
  +                    unsigned i;
  +
  +                    for(i = 0 ; i < w->ep_cache_sz ; i++) {
  +                        if(!w->ep_cache[i]) {
  +                            w->ep_cache[i] = p;
  +                            break;
  +                        }
  +                    }
  +                    JK_LEAVE_CS(&w->cs, rc);
  +                    if(i < w->ep_cache_sz) {
  +                     l->jkLog(l, JK_LOG_DEBUG, "Return endpoint to pool\n");
  +                        return JK_TRUE;
  +                    }
  +                }
  +            }
  +        }
  +
  +        ajp_close_endpoint(p, l);
  +        *e = NULL;
  +
  +        return JK_TRUE;
  +    }
  +
  +    l->jkLog(l, JK_LOG_ERROR, "In jk_endpoint_t::done, NULL parameters\n");
  +    return JK_FALSE;
  +}
  +
  +static int JK_METHOD get_endpoint(jk_worker_t *_this,
  +                                  jk_endpoint_t **e,
                                     jk_logger_t    *l)
   {
  -    ajp_worker_t *aw=pThis->worker_private;
  +    jk_endpoint_t *ae = NULL;
   
  -    if( aw->login->secret_key ==NULL ) {
  -        return (ajp_get_endpoint(pThis, pend, l, AJP13_PROTO));
  -    } else {
  -        return (ajp_get_endpoint(pThis, pend, l, AJP14_PROTO));
  +    if( _this->login->secret_key ==NULL ) {
       }
  +
  +    l->jkLog(l, JK_LOG_DEBUG, "ajp14.get_endpoint() %lx %lx\n", _this, 
_this->channel );
  +
  +    if (_this->ep_cache_sz) {
  +        int rc;
  +        JK_ENTER_CS(&_this->cs, rc);
  +        if (rc) {
  +            unsigned i;
  +            
  +            for (i = 0 ; i < _this->ep_cache_sz ; i++) {
  +                if (_this->ep_cache[i]) {
  +                    ae = _this->ep_cache[i];
  +                    _this->ep_cache[i] = NULL;
  +                    break;
  +                }
  +            }
  +            JK_LEAVE_CS(&_this->cs, rc);
  +            if (ae) {
  +                l->jkLog(l, JK_LOG_DEBUG, "Reusing endpoint\n");
  +                *e = ae;
  +                return JK_TRUE;
  +            }
  +        }
  +    }
  +
  +    ae = (jk_endpoint_t *)malloc(sizeof(jk_endpoint_t));
  +    if (!ae) {
  +        l->jkLog(l, JK_LOG_ERROR, "ajp14.get_endpoint OutOfMemoryException\n");
  +        return JK_FALSE;
  +    }
  +    
  +    ae->reuse = JK_FALSE;
  +    jk_open_pool(&ae->pool, ae->buf, sizeof(ae->buf));
  +    ae->worker = _this;
  +    ae->proto = _this->proto;
  +    ae->channelData = NULL;
  +    ae->service = ajp_service;
  +    ae->done = ajp_done;
  +    *e = ae;
  +    return JK_TRUE;
   }
   
  -static int JK_METHOD init(jk_worker_t *pThis,
  +static int JK_METHOD init(jk_worker_t *_this,
                             jk_map_t    *props, 
                             jk_workerEnv_t *we,
                             jk_logger_t *l)
   {
  -    ajp_worker_t   *aw=pThis->worker_private;
  -    ajp_endpoint_t *ae;
  -    jk_endpoint_t  *je;
  +    jk_endpoint_t *ae;
       int             rc;
       char * secret_key;
       int proto=AJP14_PROTO;
  -    
  -    secret_key = jk_get_worker_secret_key(props, aw->name);
  +    int cache_sz;
  +
  +    secret_key = map_getStrProp( props, "worker", _this->name, "secretkey", NULL );
       
       if( secret_key==NULL ) {
           proto=AJP13_PROTO;
  -        aw->proto= AJP13_PROTO;
  -        aw->logon= NULL; 
  +        _this->proto= AJP13_PROTO;
  +        _this->logon= NULL; 
       } else {
           /* Set Secret Key (used at logon time) */    
  -        aw->login->secret_key = strdup(secret_key);
  +        _this->login->secret_key = strdup(secret_key);
       }
   
  -    if (ajp_init(pThis, props, we, l, proto) == JK_FALSE)
  -        return JK_FALSE;
  +    l->jkLog(l, JK_LOG_DEBUG, "ajp14.init()\n");
  +
  +    /* start the connection cache */
  +    cache_sz = map_getIntProp( props, "worker", _this->name, "cachesize",
  +                               AJP13_DEF_CACHE_SZ );
  +    if (cache_sz > 0) {
  +        _this->ep_cache =
  +            (jk_endpoint_t **)malloc(sizeof(jk_endpoint_t *) * cache_sz);
  +        
  +        if(_this->ep_cache) {
  +            int i;
  +            _this->ep_cache_sz = cache_sz;
  +            for(i = 0 ; i < cache_sz ; i++) {
  +                _this->ep_cache[i] = NULL;
  +            }
  +            JK_INIT_CS(&(_this->cs), i);
  +            if (!i) {
  +                return JK_FALSE;
  +            }
  +        }
  +    }
       
  -    if (aw->login->secret_key == NULL) {
  +    if (_this->login->secret_key == NULL) {
           /* No extra initialization for AJP13 */
           return JK_TRUE;
       }
  @@ -158,18 +430,16 @@
       /* -------------------- Ajp14 discovery -------------------- */
       
       /* Set WebServerName (used at logon time) */
  -    aw->login->web_server_name = strdup(we->server_name);
  +    _this->login->web_server_name = strdup(we->server_name);
       
  -    if (aw->login->web_server_name == NULL) {
  +    if (_this->login->web_server_name == NULL) {
           l->jkLog(l, JK_LOG_ERROR, "can't malloc web_server_name\n");
           return JK_FALSE;
       }
       
  -    if (get_endpoint(pThis, &je, l) == JK_FALSE)
  +    if (get_endpoint(_this, &ae, l) == JK_FALSE)
           return JK_FALSE;
       
  -    ae = je->endpoint_private;
  -    
       if (ajp_connect_to_endpoint(ae, l) == JK_TRUE) {
           
        /* connection stage passed - try to get context info
  @@ -187,7 +457,7 @@
   static int JK_METHOD destroy(jk_worker_t **pThis,
                                jk_logger_t *l)
   {
  -    ajp_worker_t *aw = (*pThis)->worker_private;
  +    jk_worker_t *aw = *pThis;
       
       if (aw->login != NULL &&
           aw->login->secret_key != NULL ) {
  @@ -204,10 +474,34 @@
           
           free(aw->login);
           aw->login = NULL;
  -        return (ajp_destroy(pThis, l, AJP14_PROTO));
  -    } else {
  -        return (ajp_destroy(pThis, l, AJP13_PROTO));
  -    }    
  +    }
  +
  +
  +    l->jkLog(l, JK_LOG_DEBUG, "ajp14.destroy()\n");
  +
  +    free(aw->name);
  +        
  +    l->jkLog(l, JK_LOG_DEBUG, "ajp14.destroy() %d endpoints to close\n",
  +             aw->ep_cache_sz);
  +
  +    if(aw->ep_cache_sz > 0 ) {
  +        unsigned i;
  +        for(i = 0 ; i < aw->ep_cache_sz ; i++) {
  +            if(aw->ep_cache[i]) {
  +                ajp_close_endpoint(aw->ep_cache[i], l);
  +            }
  +        }
  +        free(aw->ep_cache);
  +        JK_DELETE_CS(&(aw->cs), i);
  +    }
  +
  +    if (aw->login) {
  +        free(aw->login);
  +        aw->login = NULL;
  +    }
  +
  +    free(aw);
  +    return JK_TRUE;
   }
   
   int JK_METHOD jk_worker_ajp14_factory( jk_env_t *env, void **result,
  @@ -215,7 +509,6 @@
   {
       jk_logger_t *l=env->logger;
       jk_worker_t *w=(jk_worker_t *)malloc(sizeof(jk_worker_t));
  -    ajp_worker_t *aw = (ajp_worker_t *)malloc(sizeof(ajp_worker_t));
      
       l->jkLog(l, JK_LOG_DEBUG, "Into ajp14_worker_factory\n");
   
  @@ -223,45 +516,29 @@
           l->jkLog(l, JK_LOG_ERROR, "In ajp14_worker_factory, NULL parameters\n");
           return JK_FALSE;
       }
  -
  -    if (! aw) {
  -        l->jkLog(l, JK_LOG_ERROR,
  -               "In ajp14_worker_factory, malloc of private data failed\n");
  -        return JK_FALSE;
  -    }
   
  -    aw->name = strdup(name);
  +    w->name = strdup(name);
       
  -    if (! aw->name) {
  -        free(aw);
  -        l->jkLog(l, JK_LOG_ERROR,
  -               "In ajp14_worker_factory, malloc failed for name\n");
  -        return JK_FALSE;
  -    }
  +    w->proto= AJP14_PROTO;
   
  -    aw->proto= AJP14_PROTO;
  +    w->login= (jk_login_service_t *)malloc(sizeof(jk_login_service_t));
   
  -    aw->login= (jk_login_service_t *)malloc(sizeof(jk_login_service_t));
  -
  -    if (aw->login == NULL) {
  +    if (w->login == NULL) {
           l->jkLog(l, JK_LOG_ERROR,
                  "In ajp14_worker_factory, malloc failed for login area\n");
           return JK_FALSE;
       }
        
  -    memset(aw->login, 0, sizeof(jk_login_service_t));
  +    memset(w->login, 0, sizeof(jk_login_service_t));
       
  -    aw->login->negociation=
  +    w->login->negociation=
           (AJP14_CONTEXT_INFO_NEG | AJP14_PROTO_SUPPORT_AJP14_NEG);
  -    aw->login->web_server_name=NULL; /* must be set in init */
  +    w->login->web_server_name=NULL; /* must be set in init */
       
  -    aw->ep_cache_sz= 0;
  -    aw->ep_cache= NULL;
  -    aw->connect_retry_attempts= AJP_DEF_RETRY_ATTEMPTS;
  +    w->ep_cache_sz= 0;
  +    w->ep_cache= NULL;
  +    w->connect_retry_attempts= AJP_DEF_RETRY_ATTEMPTS;
   
  -    aw->worker=w;
  -    
  -    w->worker_private= aw;
       w->channel= NULL;
      
       w->validate= validate;
  @@ -269,7 +546,7 @@
       w->get_endpoint= get_endpoint;
       w->destroy=destroy;
   
  -    aw->logon= logon; 
  +    w->logon= logon; 
   
       *result = w;
   
  
  
  

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

Reply via email to