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]>