costin 01/12/12 13:34:47 Modified: jk/native2/common jk_handler_response.c jk_handler_logon.c jk_handler_discovery.c Log: Rewrote the existing handlers to use the new interface. Note that each file will have a factory method that will create a map containing all the handlers it supports ( not perfect, it can be done clener, but this is the first round ) As before, the handler will process the message and optionally generate a reply ( like the original JK_GET_CHUNK message ) Using messages have the benefit that we don't need round-trips. The disadvantage is that RPC is more familiar to people, but if we can do soap we can probably handle this as well. It is possible to emulate one over the other. Revision Changes Path 1.5 +192 -149 jakarta-tomcat-connectors/jk/native2/common/jk_handler_response.c Index: jk_handler_response.c =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native2/common/jk_handler_response.c,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- jk_handler_response.c 2001/12/06 22:54:44 1.4 +++ jk_handler_response.c 2001/12/12 21:34:47 1.5 @@ -57,112 +57,36 @@ #include "jk_global.h" #include "jk_service.h" -#include "jk_msg_buff.h" +#include "jk_msg.h" #include "jk_env.h" #include "jk_requtil.h" #include "jk_env.h" #include "jk_handler.h" #include "jk_endpoint.h" -static int ajp_unmarshal_response(jk_msg_buf_t *msg, - jk_ws_service_t *s, - jk_endpoint_t *ae, - jk_logger_t *l); - -int ajp_handle_sendChunk(jk_msg_buf_t *msg, - jk_ws_service_t *r, - jk_endpoint_t *ae, - jk_logger_t *l); - - -int ajp_handle_startResponse(jk_msg_buf_t *msg, - jk_ws_service_t *r, - jk_endpoint_t *ae, - jk_logger_t *l); - -int ajp_handle_getChunk(jk_msg_buf_t *msg, - jk_ws_service_t *r, - jk_endpoint_t *ae, - jk_logger_t *l); - -/** SEND_HEADERS handler +/* + * Write a body chunk from the servlet container to the web server */ -int ajp_handle_startResponse(jk_msg_buf_t *msg, - jk_ws_service_t *r, - jk_endpoint_t *ae, - jk_logger_t *l) -{ - int err; - - err=ajp_unmarshal_response(msg, r, ae, l); - if( err!=JK_TRUE ) { - l->jkLog(l, JK_LOG_ERROR, "Error ajp_process_callback - ajp_unmarshal_response failed\n"); - return JK_AJP13_ERROR; - } - err=r->start_response(r, r->status, r->msg, - (const char * const *)r->out_header_names, - (const char * const *)r->out_header_values, - r->out_headers); - if( err!=JK_TRUE ) { - l->jkLog(l, JK_LOG_ERROR, "Error ajp_process_callback - start_response failed\n"); - return JK_CLIENT_ERROR; - } - return JK_TRUE; -} +#define JK_AJP13_SEND_BODY_CHUNK (unsigned char)3 -/** SEND_BODY_CHUNK handler +/* + * Send response headers from the servlet container to the web server. */ -int ajp_handle_sendChunk(jk_msg_buf_t *msg, - jk_ws_service_t *r, - jk_endpoint_t *ae, - jk_logger_t *l) -{ - int err; - unsigned len = (unsigned)jk_b_get_int(msg); +#define JK_AJP13_SEND_HEADERS (unsigned char)4 - err=r->write(r, jk_b_get_buff(msg) + jk_b_get_pos(msg), len); - if( err!= JK_TRUE ) { - l->jkLog(l, JK_LOG_ERROR, "Error ajp_process_callback - write failed\n"); - return JK_CLIENT_ERROR; - } - - return JK_TRUE; -} - -/** SEND_BODY_CHUNK handler +/* + * Marks the end of response. */ -int ajp_handle_getChunk(jk_msg_buf_t *msg, - jk_ws_service_t *r, - jk_endpoint_t *ae, - jk_logger_t *l) -{ - int len = jk_b_get_int(msg); - - if(len > AJP13_MAX_SEND_BODY_SZ) { - len = AJP13_MAX_SEND_BODY_SZ; - } - if(len > ae->left_bytes_to_send) { - len = ae->left_bytes_to_send; - } - if(len < 0) { - len = 0; - } - - /* the right place to add file storage for upload */ - if ((len = ajp_read_into_msg_buff(ae, r, msg, len, l)) >= 0) { - r->content_read += len; - return JK_AJP13_HAS_RESPONSE; - } - - l->jkLog(l, JK_LOG_ERROR, "Error ajp_process_callback - ajp_read_into_msg_buff failed\n"); - return JK_INTERNAL_ERROR; -} +#define JK_AJP13_GET_BODY_CHUNK (unsigned char)6 - +/* + * Marks the end of response. + */ +#define JK_AJP13_END_RESPONSE (unsigned char)5 -/* -AJPV13_RESPONSE/AJPV14_RESPONSE:= +/** SEND_HEADERS handler + AJPV13_RESPONSE/AJPV14_RESPONSE:= response_prefix (2) status (short) status_msg (short) @@ -185,78 +109,197 @@ body length*(var binary) */ -static int ajp_unmarshal_response(jk_msg_buf_t *msg, - jk_ws_service_t *s, - jk_endpoint_t *ae, - jk_logger_t *l) +static int jk_handler_startResponse(jk_msg_t *msg, + jk_ws_service_t *s, + jk_endpoint_t *ae, + jk_logger_t *l) { - jk_pool_t * p = ae->pool; - - s->status = jk_b_get_int(msg); - - if (!s->status) { - l->jkLog(l, JK_LOG_ERROR, "Error ajp_unmarshal_response - Null status\n"); - return JK_FALSE; - } + int err; + unsigned i; + jk_pool_t * p = s->pool; - s->msg = (char *)jk_b_get_string(msg); + s->status = msg->getInt(msg); + s->msg = (char *)msg->getString(msg); if (s->msg) { jk_xlate_from_ascii(s->msg, strlen(s->msg)); } - - l->jkLog(l, JK_LOG_DEBUG, "ajp_unmarshal_response: status = %d\n", s->status); + s->out_headers = msg->getInt(msg); + s->out_header_names = NULL; + s->out_header_values = NULL; - s->out_headers = jk_b_get_int(msg); - s->out_header_names = s->out_header_values = NULL; - - l->jkLog(l, JK_LOG_DEBUG, "ajp_unmarshal_response: Number of headers is = %d\n", s->out_headers); - - if (s->out_headers) { + if (s->out_headers > 0 ) { s->out_header_names = p->alloc(p, sizeof(char *) * s->out_headers); s->out_header_values = p->alloc(p, sizeof(char *) * s->out_headers); + + if (s->out_header_names==NULL || + s->out_header_values==NULL) { + l->jkLog(l, JK_LOG_ERROR, + "handler.startResponse() OutOfMemoryError %d headers\n", + s->out_headers); + return JK_HANDLER_FATAL; + } + for(i = 0 ; i < s->out_headers ; i++) { + unsigned short name = msg->peekInt(msg) ; - if (s->out_header_names && s->out_header_values) { - unsigned i; - for(i = 0 ; i < s->out_headers ; i++) { - unsigned short name = jk_b_pget_int(msg, jk_b_get_pos(msg)) ; - - if ((name & 0XFF00) == 0XA000) { - jk_b_get_int(msg); - name = name & 0X00FF; - if (name <= SC_RES_HEADERS_NUM) { - s->out_header_names[i] = (char *)jk_requtil_getHeaderById(name); - } else { - l->jkLog(l, JK_LOG_ERROR, "Error ajp_unmarshal_response - No such sc (%d)\n", name); - return JK_FALSE; - } + if ((name & 0XFF00) == 0XA000) { + msg->getInt(msg); + name = name & 0X00FF; + if (name <= SC_RES_HEADERS_NUM) { + s->out_header_names[i] = + (char *)jk_requtil_getHeaderById(name); } else { - s->out_header_names[i] = (char *)jk_b_get_string(msg); - if (!s->out_header_names[i]) { - l->jkLog(l, JK_LOG_ERROR, "Error ajp_unmarshal_response - Null header name\n"); - return JK_FALSE; - } - jk_xlate_from_ascii(s->out_header_names[i], - strlen(s->out_header_names[i])); - + l->jkLog(l, JK_LOG_ERROR, + "handler.response() Invalid header id (%d)\n", + name); + return JK_HANDLER_FATAL; } - - s->out_header_values[i] = (char *)jk_b_get_string(msg); - if (!s->out_header_values[i]) { - l->jkLog(l, JK_LOG_ERROR, "Error ajp_unmarshal_response - Null header value\n"); - return JK_FALSE; + } else { + s->out_header_names[i] = (char *)msg->getString(msg); + if (!s->out_header_names[i]) { + l->jkLog(l, JK_LOG_ERROR, + "handler.response() Null header name \n"); + return JK_HANDLER_FATAL; } - - jk_xlate_from_ascii(s->out_header_values[i], - strlen(s->out_header_values[i])); - - l->jkLog(l, JK_LOG_DEBUG, "ajp_unmarshal_response: Header[%d] [%s] = [%s]\n", - i, - s->out_header_names[i], - s->out_header_values[i]); + jk_xlate_from_ascii(s->out_header_names[i], + strlen(s->out_header_names[i])); } + s->out_header_values[i] = (char *)msg->getString(msg); + if (!s->out_header_values[i]) { + l->jkLog(l, JK_LOG_ERROR, + "Error ajp_unmarshal_response - Null header value\n"); + return JK_HANDLER_FATAL; + } + + jk_xlate_from_ascii(s->out_header_values[i], + strlen(s->out_header_values[i])); + + l->jkLog(l, JK_LOG_DEBUG, + "ajp_unmarshal_response: Header[%d] [%s] = [%s]\n", + i, + s->out_header_names[i], + s->out_header_values[i]); } } + + l->jkLog(l, JK_LOG_INFO, + "handler.response(): status=%d headers=%d\n", + s->status, s->out_headers); + + err=s->start_response(s, s->status, s->msg, + (const char * const *)s->out_header_names, + (const char * const *)s->out_header_values, + s->out_headers); + if( err!=JK_TRUE ) { + l->jkLog(l, JK_LOG_ERROR, + "handler.response() Error sending response"); + return JK_HANDLER_ERROR; + } + + return JK_HANDLER_OK; +} - return JK_TRUE; +/** SEND_BODY_CHUNK handler + */ +static int jk_handler_sendChunk(jk_msg_t *msg, + jk_ws_service_t *r, + jk_endpoint_t *ae, + jk_logger_t *l) +{ + int err; + int len; + char *buf; + + buf=msg->getBytes( msg, &len ); + + err=r->write(r, buf, len); + if( err!= JK_TRUE ) { + l->jkLog(l, JK_LOG_ERROR, "Error ajp_process_callback - write failed\n"); + return JK_HANDLER_ERROR; + } + + return JK_HANDLER_OK; } +static int jk_handler_endResponse(jk_msg_t *msg, + jk_ws_service_t *r, + jk_endpoint_t *ae, + jk_logger_t *l) +{ + ae->reuse = (int)msg->getByte(msg); + + if((ae->reuse & 0X01) != ae->reuse) { + /* + * Strange protocol error. + */ + ae->reuse = JK_FALSE; + } + return JK_HANDLER_LAST; +} + +/** SEND_BODY_CHUNK handler + */ +static int jk_handler_getChunk(jk_msg_t *msg, + jk_ws_service_t *r, + jk_endpoint_t *ae, + jk_logger_t *l) +{ + int len = msg->getInt(msg); + + if(len > AJP13_MAX_SEND_BODY_SZ) { + len = AJP13_MAX_SEND_BODY_SZ; + } + if(len > r->left_bytes_to_send) { + len = r->left_bytes_to_send; + } + if(len < 0) { + len = 0; + } + + len=msg->appendFromServer( msg, r, ae, len ); + /* the right place to add file storage for upload */ + if (len >= 0) { + r->content_read += len; + return JK_HANDLER_RESPONSE; + } + + l->jkLog(l, JK_LOG_ERROR, + "handler_request.getChunk() - ajp_read_into_msg_buff failed\n"); + return JK_HANDLER_FATAL; +} + +int JK_METHOD jk_handler_response_factory( jk_env_t *env, jk_pool_t *pool, + void **result, + const char *type, const char *name) +{ + jk_map_t *map; + jk_handler_t *h; + + map_alloc( &map, pool ); + *result=map; + + h=(jk_handler_t *)pool->calloc( pool, sizeof( jk_handler_t)); + h->name="sendHeaders"; + h->messageId=JK_AJP13_SEND_HEADERS; + h->callback=jk_handler_startResponse; + map_put( map, h->name, h, NULL ); + + h=(jk_handler_t *)pool->calloc( pool, sizeof( jk_handler_t)); + h->name="sendChunk"; + h->messageId=JK_AJP13_SEND_BODY_CHUNK; + h->callback=jk_handler_sendChunk; + map_put( map, h->name, h, NULL ); + + h=(jk_handler_t *)pool->calloc( pool, sizeof( jk_handler_t)); + h->name="endResponse"; + h->messageId=JK_AJP13_END_RESPONSE; + h->callback=jk_handler_endResponse; + map_put( map, h->name, h, NULL ); + + h=(jk_handler_t *)pool->calloc( pool, sizeof( jk_handler_t)); + h->name="getChunk"; + h->messageId=JK_AJP13_GET_BODY_CHUNK; + h->callback=jk_handler_getChunk; + map_put( map, h->name, h, NULL ); + + return JK_TRUE; +} 1.6 +135 -288 jakarta-tomcat-connectors/jk/native2/common/jk_handler_logon.c Index: jk_handler_logon.c =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native2/common/jk_handler_logon.c,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- jk_handler_logon.c 2001/12/06 22:54:44 1.5 +++ jk_handler_logon.c 2001/12/12 21:34:47 1.6 @@ -58,12 +58,12 @@ /** * Description: AJP14 Login handler * Author: Henri Gomez <[EMAIL PROTECTED]> - * Version: $Revision: 1.5 $ + * Version: $Revision: 1.6 $ */ #include "jk_global.h" #include "jk_pool.h" -#include "jk_msg_buff.h" +#include "jk_msg.h" #include "jk_md5.h" #include "jk_logger.h" #include "jk_service.h" @@ -73,11 +73,6 @@ /* Private definitions */ /* - * Initial Login Phase (web server -> servlet engine) - */ -#define AJP14_LOGINIT_CMD (unsigned char)0x10 - -/* * Second Login Phase (servlet engine -> web server), md5 seed is received */ #define AJP14_LOGSEED_CMD (unsigned char)0x11 @@ -96,317 +91,141 @@ * Login Rejected (servlet engine -> web server), will be logged */ #define AJP14_LOGNOK_CMD (unsigned char)0x14 - -int JK_METHOD jk_handler_logon_factory( jk_env_t *env, void **result, - char *type, char *name); - - -/* Private functions */ - -static void ajp14_compute_md5(jk_login_service_t *s, - jk_logger_t *l); -static int ajp14_marshal_login_init_into_msgb(jk_msg_buf_t *msg, - jk_login_service_t *s, - jk_logger_t *l); +/* web-server want context info after login */ +#define AJP14_CONTEXT_INFO_NEG 0x80000000 -static int ajp14_unmarshal_login_seed(jk_msg_buf_t *msg, - jk_login_service_t *s, - jk_logger_t *l); +/* web-server want context updates */ +#define AJP14_CONTEXT_UPDATE_NEG 0x40000000 -static int ajp14_marshal_login_comp_into_msgb(jk_msg_buf_t *msg, - jk_login_service_t *s, - jk_logger_t *l); +/* communication could use AJP14 */ +#define AJP14_PROTO_SUPPORT_AJP14_NEG 0x00010000 -static int ajp14_unmarshal_log_ok(jk_msg_buf_t *msg, - jk_login_service_t *s, - jk_logger_t *l); - -static int ajp14_unmarshal_log_nok(jk_msg_buf_t *msg, - jk_logger_t *l); - - -static int jk_handler_logon_logon(jk_endpoint_t *ae, jk_logger_t *l); -static int jk_handler_logon_init( jk_worker_t *w ); - -/* ==================== Impl =================== */ - -int JK_METHOD jk_handler_logon_factory( jk_env_t *env, void **result, - char *type, char *name) -{ - jk_handler_t *h=(jk_handler_t *)malloc( sizeof( jk_handler_t)); - - h->init=jk_handler_logon_init; - *result=h; - return JK_TRUE; -} - - -static int jk_handler_logon_init( jk_worker_t *w ) { - w->logon= jk_handler_logon_logon; - return JK_TRUE; -} +int JK_METHOD jk_handler_logon_factory( jk_env_t *env, + jk_pool_t *pool, + void **result, + char *type, char *name); +#define AJP14_ENTROPY_SEED_LEN 32 /* we're using MD5 => 32 chars */ +#define AJP14_COMPUTED_KEY_LEN 32 /* we're using MD5 also */ -/* - * AJP14 Logon Phase +/* + * Decode the Login Command * - * INIT + REPLY / NEGO + REPLY - */ -static int handle_logon(jk_endpoint_t *ae, - jk_msg_buf_t *msg, - jk_logger_t *l) -{ - int cmd; - - jk_login_service_t *jl = ae->worker->login; - - ajp14_marshal_login_init_into_msgb(msg, jl, l); - - l->jkLog(l, JK_LOG_DEBUG, "Into ajp14:logon - send init\n"); - - if (ajp_connection_tcp_send_message(ae, msg, l) != JK_TRUE) - return JK_FALSE; - - l->jkLog(l, JK_LOG_DEBUG, "Into ajp14:logon - wait init reply\n"); - - jk_b_reset(msg); - - if (ajp_connection_tcp_get_message(ae, msg, l) != JK_TRUE) - return JK_FALSE; - - if ((cmd = jk_b_get_byte(msg)) != AJP14_LOGSEED_CMD) { + * +-------------------------+---------------------------+ + * | LOGIN SEED CMD (1 byte) | MD5 of entropy (String) | + * +-------------------------+---------------------------+ + * + * Build the reply: + * byte LOGCOMP + * String MD5 of random + Secret key + * long negotiation + * String serverName + * + */ +static int jk_handler_login(jk_msg_t *msg, + jk_ws_service_t *s, + jk_endpoint_t *ae, + jk_logger_t *l) +{ + int rc; + char *entropy; + char computedKey[AJP14_COMPUTED_KEY_LEN]; + char *secret=ae->worker->secret; + + entropy= msg->getString( msg ); + if( entropy==NULL ) { l->jkLog(l, JK_LOG_ERROR, - "Error ajp14:logon: awaited command %d, received %d\n", - AJP14_LOGSEED_CMD, cmd); - return JK_FALSE; + "Error ajp14_unmarshal_login_seed - can't get seed\n"); + return JK_HANDLER_FATAL; } - - if (ajp14_unmarshal_login_seed(msg, jl, l) != JK_TRUE) - return JK_FALSE; - - l->jkLog(l, JK_LOG_DEBUG, - "Into ajp14:logon - received entropy %s\n", jl->entropy); - - ajp14_compute_md5(jl, l); - - if (ajp14_marshal_login_comp_into_msgb(msg, jl, l) != JK_TRUE) - return JK_FALSE; - - if (ajp_connection_tcp_send_message(ae, msg, l) != JK_TRUE) - return JK_FALSE; - - jk_b_reset(msg); - - if (ajp_connection_tcp_get_message(ae, msg, l) != JK_TRUE) - return JK_FALSE; - - switch (jk_b_get_byte(msg)) { - - case AJP14_LOGOK_CMD : - if (ajp14_unmarshal_log_ok(msg, jl, l) == JK_TRUE) { - l->jkLog(l, JK_LOG_DEBUG, - "Successfully connected to servlet-engine %s\n", - jl->servlet_engine_name); - return JK_TRUE; - } - break; - - case AJP14_LOGNOK_CMD : - ajp14_unmarshal_log_nok(msg, l); - break; - } - - return JK_FALSE; -} - - -static int jk_handler_logon_logon(jk_endpoint_t *ae, - jk_logger_t *l) -{ - jk_pool_t *p = ae->pool; - jk_msg_buf_t *msg; - int rc; - - l->jkLog(l, JK_LOG_DEBUG, "Into ajp14:logon\n"); - msg = jk_b_new(p); - jk_b_set_buffer_size(msg, DEF_BUFFER_SZ); - - if ((rc = handle_logon(ae, msg, l)) == JK_FALSE) - ajp_close_endpoint(ae, l); + l->jkLog(l, JK_LOG_INFO, + "handle.logseed() received entropy %s\n", entropy); - return rc; -} + jk_md5((const unsigned char *)entropy, + (const unsigned char *)secret, computedKey); + l->jkLog(l, JK_LOG_DEBUG, + "Into ajp14_compute_md5 (%s/%s) -> (%s)\n", + entropy, secret, computedKey); -/* -------------------- private utils/marshaling -------------------- */ + msg->reset( msg ); -/* - * Compute the MD5 with ENTROPY / SECRET KEY - */ -static void ajp14_compute_md5(jk_login_service_t *s, - jk_logger_t *l) -{ - jk_md5((const unsigned char *)s->entropy, - (const unsigned char *)s->secret_key, s->computed_key); + l->jkLog(l, JK_LOG_DEBUG, "Into ajp14_marshal_login_comp_into_msgb\n"); - l->jkLog(l, JK_LOG_DEBUG, - "Into ajp14_compute_md5 (%s/%s) -> (%s)\n", - s->entropy, s->secret_key, s->computed_key); -} + rc=msg->appendByte( msg, AJP14_LOGCOMP_CMD); + if (rc!=JK_TRUE ) + return JK_HANDLER_FATAL; -/* - * Build the Login Init Command - * - * +-------------------------+---------------------------+------------------- - * | LOGIN INIT CMD (1 byte) | NEGOCIATION DATA (32bits) | WEB SERVER INFO - * | | | (CString) - * +-------------------------+---------------------------+------------------- - * - */ -static int ajp14_marshal_login_init_into_msgb(jk_msg_buf_t *msg, - jk_login_service_t *s, - jk_logger_t *l) -{ - l->jkLog(l, JK_LOG_DEBUG, "Into ajp14_marshal_login_init_into_msgb\n"); - - /* To be on the safe side */ - jk_b_reset(msg); - - /* - * LOGIN - */ - if (jk_b_append_byte(msg, AJP14_LOGINIT_CMD)) - return JK_FALSE; - - /* - * NEGOCIATION FLAGS - */ - if (jk_b_append_long(msg, s->negociation)) - return JK_FALSE; - - /* - * WEB-SERVER NAME - */ - if (jk_b_append_string(msg, s->web_server_name)) { + /* COMPUTED-SEED */ + rc= msg->appendString( msg, (const unsigned char *)computedKey); + if( rc!=JK_TRUE ) { l->jkLog(l, JK_LOG_ERROR, - "Error ajp14_marshal_login_init_into_msgb " - "- Error appending the web_server_name string\n"); - return JK_FALSE; + "handler.loginSecret() error serializing computed secret\n"); + return JK_HANDLER_FATAL; } + ae->negociation= + (AJP14_CONTEXT_INFO_NEG | AJP14_PROTO_SUPPORT_AJP14_NEG); + msg->appendLong(msg, ae->negociation); - return JK_TRUE; -} + rc=msg->appendString(msg, ae->worker->workerEnv->server_name); - -/* - * Decode the Login Seed Command - * - * +-------------------------+---------------------------+ - * | LOGIN SEED CMD (1 byte) | MD5 of entropy (32 chars) | - * +-------------------------+---------------------------+ - * - */ -static int ajp14_unmarshal_login_seed(jk_msg_buf_t *msg, - jk_login_service_t *s, - jk_logger_t *l) -{ - if (jk_b_get_bytes(msg, (unsigned char *)s->entropy, - AJP14_ENTROPY_SEED_LEN) < 0) { - l->jkLog(l, JK_LOG_ERROR, - "Error ajp14_unmarshal_login_seed - can't get seed\n"); - return JK_FALSE; - } - - s->entropy[AJP14_ENTROPY_SEED_LEN] = 0; /* Just to have a CString */ - return JK_TRUE; -} - -/* - * Build the Login Computed Command - * - * +-------------------------+---------------------------------------+ - * | LOGIN COMP CMD (1 byte) | MD5 of RANDOM + SECRET KEY (32 chars) | - * +-------------------------+---------------------------------------+ - * - */ -static int ajp14_marshal_login_comp_into_msgb(jk_msg_buf_t *msg, - jk_login_service_t *s, - jk_logger_t *l) -{ - l->jkLog(l, JK_LOG_DEBUG, "Into ajp14_marshal_login_comp_into_msgb\n"); + if ( rc != JK_TRUE) + return JK_HANDLER_FATAL; - /* To be on the safe side */ - jk_b_reset(msg); - - /* - * LOGIN - */ - if (jk_b_append_byte(msg, AJP14_LOGCOMP_CMD)) - return JK_FALSE; - - /* - * COMPUTED-SEED - */ - if (jk_b_append_bytes(msg, (const unsigned char *)s->computed_key, - AJP14_COMPUTED_KEY_LEN)) { - l->jkLog(l, JK_LOG_ERROR, - "Error ajp14_marshal_login_comp_into_msgb " - " - Error appending the COMPUTED MD5 bytes\n"); - return JK_FALSE; - } - - return JK_TRUE; + return JK_HANDLER_RESPONSE; } /* - * Decode the LogOk Command + * Decode the LogOk Command. After that we're done, the connection is + * perfect and ready. * * +--------------------+------------------------+--------------------------- * | LOGOK CMD (1 byte) | NEGOCIED DATA (32bits) | SERVLET ENGINE INFO(CString) * +--------------------+------------------------+--------------------------- * */ -static int ajp14_unmarshal_log_ok(jk_msg_buf_t *msg, - jk_login_service_t *s, - jk_logger_t *l) -{ - unsigned long nego; - char * sname; - - nego = jk_b_get_long(msg); +static int jk_handler_logok(jk_msg_t *msg, + jk_ws_service_t *s, + jk_endpoint_t *ae, + jk_logger_t *l) +{ + unsigned long nego; + char *sname; + int rc; + + nego = msg->getLong(msg); if (nego == 0xFFFFFFFF) { l->jkLog(l, JK_LOG_ERROR, - "Error ajp14_unmarshal_log_ok - can't get negociated data\n"); - return JK_FALSE; + "Error ajp14_unmarshal_log_ok - can't get negociated data\n"); + return JK_HANDLER_FATAL; } - sname = (char *)jk_b_get_string(msg); + sname = (char *)msg->getString(msg); if (! sname) { l->jkLog(l, JK_LOG_ERROR, - "Error ajp14_unmarshal_log_ok - " - "can't get servlet engine name\n"); - return JK_FALSE; + "Error ajp14_unmarshal_log_ok - " + "can't get servlet engine name\n"); + return JK_HANDLER_FATAL; } - - /* take care of removing previously allocated data */ - if (s->servlet_engine_name) - free(s->servlet_engine_name); - s->servlet_engine_name = strdup(sname); - - if (! s->servlet_engine_name) { - l->jkLog(l, JK_LOG_ERROR, - "Error ajp14_unmarshal_log_ok - " - " can't malloc servlet engine name\n"); - return JK_FALSE; + /* take care of removing previously allocated data */ + /* XXXXXXXXX NEED A SUB POOL !!!! */ + if (ae->servletContainerName == NULL || + strcmp( sname, ae->servletContainerName) != 0 ) { + ae->servletContainerName=(char *)ae->pool->pstrdup( ae->pool, + sname ); } - return JK_TRUE; + l->jkLog(l, JK_LOG_DEBUG, + "Successfully connected to servlet-engine %s\n", + ae->servletContainerName); + + return JK_HANDLER_LAST; } @@ -418,24 +237,52 @@ * +---------------------+-----------------------+ * */ - -static int ajp14_unmarshal_log_nok(jk_msg_buf_t *msg, - jk_logger_t *l) +static int jk_handler_lognok(jk_msg_t *msg, + jk_ws_service_t *s, + jk_endpoint_t *ae, + jk_logger_t *l) { unsigned long status; - l->jkLog(l, JK_LOG_DEBUG, "Into ajp14_unmarshal_log_nok\n"); + status = msg->getLong(msg); - status = jk_b_get_long(msg); + l->jkLog(l, JK_LOG_INFO, + "handler.logonFailure() code %08lx", status); - if (status == 0xFFFFFFFF) { - l->jkLog(l, JK_LOG_ERROR, - "Error ajp14_unmarshal_log_nok - can't get failure code\n"); - return JK_FALSE; - } + return JK_HANDLER_FATAL; +} + + + +/** Register handlers + */ +int JK_METHOD jk_handler_logon_factory( jk_env_t *env, jk_pool_t *pool, + void **result, + char *type, char *name) +{ + jk_map_t *map; + jk_handler_t *h; + + map_alloc( &map, pool ); + *result=map; - l->jkLog(l, JK_LOG_INFO, - "Can't Log with servlet engine - code %08lx", status); + h=(jk_handler_t *)pool->calloc( pool, sizeof( jk_handler_t)); + h->name="login"; + h->messageId=AJP14_LOGSEED_CMD; + h->callback=jk_handler_login; + map_put( map, h->name, h, NULL ); + + h=(jk_handler_t *)pool->calloc( pool, sizeof( jk_handler_t)); + h->name="logOk"; + h->messageId=AJP14_LOGOK_CMD; + h->callback=jk_handler_logok; + map_put( map, h->name, h, NULL ); + + h=(jk_handler_t *)pool->calloc( pool, sizeof( jk_handler_t)); + h->name="logNok"; + h->messageId=AJP14_LOGNOK_CMD; + h->callback=jk_handler_lognok; + map_put( map, h->name, h, NULL ); + return JK_TRUE; } - 1.7 +49 -168 jakarta-tomcat-connectors/jk/native2/common/jk_handler_discovery.c Index: jk_handler_discovery.c =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native2/common/jk_handler_discovery.c,v retrieving revision 1.6 retrieving revision 1.7 diff -u -r1.6 -r1.7 --- jk_handler_discovery.c 2001/12/06 22:57:13 1.6 +++ jk_handler_discovery.c 2001/12/12 21:34:47 1.7 @@ -58,41 +58,23 @@ /** * Description: AJP14 Discovery handler * Author: Henri Gomez <[EMAIL PROTECTED]> - * Version: $Revision: 1.6 $ + * Version: $Revision: 1.7 $ */ #include "jk_global.h" #include "jk_pool.h" #include "jk_env.h" -#include "jk_msg_buff.h" +#include "jk_msg.h" #include "jk_logger.h" #include "jk_service.h" #include "jk_handler.h" #include "jk_webapp.h" #include "jk_workerEnv.h" -int JK_METHOD jk_handler_discovery_factory( jk_env_t *env, jk_pool_t *pool, void **result, +int JK_METHOD jk_handler_discovery_factory( jk_env_t *env, jk_pool_t *pool, + void **result, const char *type, const char *name); -int jk_handler_discovery_sendDiscovery(jk_endpoint_t *ae, - jk_workerEnv_t *we, - jk_logger_t *l); - -int jk_handler_discovery_handleContextList(jk_endpoint_t *ae, - jk_workerEnv_t *we, - jk_msg_buf_t *msg, - jk_logger_t *l); - -int jk_handler_discovery_sendGetContextaState(jk_msg_buf_t *msg, - jk_workerEnv_t *c, - char *vhost, - char *cname, - jk_logger_t *l); - -int jk_handler_discovery_handleContextState(jk_msg_buf_t *msg, - jk_workerEnv_t *c, - jk_logger_t *l); - /* * Context Query (web server -> servlet engine), which URI are handled by servlet engine ? */ @@ -121,76 +103,7 @@ #define MAX_URI_SIZE 512 -static int jk_handler_discovery_init( jk_worker_t *w ); - -/* ==================== Constructor and impl. ==================== */ - -int JK_METHOD jk_handler_discovery_factory( jk_env_t *env, jk_pool_t *pool, - void **result, - const char *type, const char *name) -{ - jk_handler_t *h=(jk_handler_t *)pool->alloc( pool, sizeof( jk_handler_t)); - - h->init=jk_handler_discovery_init; - *result=h; - return JK_TRUE; -} - - -static int jk_handler_discovery_init( jk_worker_t *w ) { - return JK_TRUE; -} - - -/** Send a 'discovery' message. This is a request for tomcat to - * report all configured webapps and mappings. - * - * Build the Context Query Cmd (autoconf) - * - * +--------------------------+- - * | CONTEXT QRY CMD (1 byte) | - * +--------------------------+- - * - */ -int jk_handler_discovery_sendDiscovery(jk_endpoint_t *ae, - jk_workerEnv_t *we, - jk_logger_t *l) -{ - jk_pool_t *p = ae->pool; - jk_msg_buf_t *msg; - int rc=JK_FALSE; - int cmd; - int i,j; - jk_login_service_t *jl = ae->worker->login; - jk_webapp_t *ci; - jk_webapp_t *webapp; - char *buf; - - - l->jkLog(l, JK_LOG_DEBUG, "Into ajp14:discovery\n"); - - msg = jk_b_new(p); - jk_b_set_buffer_size(msg, DEF_BUFFER_SZ); - jk_b_reset(msg); - - /* - * CONTEXT QUERY CMD - */ - if (jk_b_append_byte(msg, AJP14_CONTEXT_QRY_CMD)) - return JK_FALSE; - - l->jkLog(l, JK_LOG_DEBUG, "Into ajp14:discovery - send query\n"); - - if (ajp_connection_tcp_send_message(ae, msg, l) != JK_TRUE) - return JK_FALSE; - - jk_b_reset(msg); - - return rc; -} - /* -------------------- private utils/marshaling -------------------- */ - /* * Decode the ContextList Cmd (Autoconf) * @@ -205,33 +118,35 @@ *CONTEXT NAME (CString (*)) | URL1 [\n] URL2 [\n] URL3 [\n] | NEXT CTX. | *-------------------+-------------------------------+-----------+ */ -int jk_handler_discovery_handleContextList(jk_endpoint_t *ae, - jk_workerEnv_t *we, - jk_msg_buf_t *msg, - jk_logger_t *l) +static int jk_handler_contextList(jk_msg_t *msg, + jk_ws_service_t *s, + jk_endpoint_t *ae, + jk_logger_t *l) { char *vname; char *cname; char *uri; int cmd; int i,j; - jk_login_service_t *jl = ae->worker->login; - jk_webapp_t *ci; + jk_webapp_t *ci; jk_webapp_t *webapp; char *buf; - + jk_workerEnv_t *we=ae->worker->workerEnv; + /* if (ajp_connection_tcp_get_message(ae, msg, l) != JK_TRUE) */ /* return JK_FALSE; */ - - if ((cmd = jk_b_get_byte(msg)) != AJP14_CONTEXT_INFO_CMD) { - l->jkLog(l, JK_LOG_ERROR, "Error ajp14:discovery - wrong cmd %d:%d\n", + + cmd=msg->getByte( msg ); + if (cmd != AJP14_CONTEXT_INFO_CMD) { + l->jkLog(l, JK_LOG_ERROR, + "handler.discovery() - wrong cmd %d:%d\n", AJP14_CONTEXT_INFO_CMD, cmd); return JK_FALSE; } for (;;) { - vname = (char *)jk_b_get_string(msg); - cname = (char *)jk_b_get_string(msg); + vname = (char *)msg->getString(msg); + cname = (char *)msg->getString(msg); if (cname==NULL || strlen( cname ) == 0 ) { l->jkLog(l, JK_LOG_DEBUG, "End of contest list\n"); @@ -249,7 +164,7 @@ } for (;;) { - uri = (char *)jk_b_get_string(msg); + uri = (char *)msg->getString(msg); if (uri==NULL || strlen( uri ) == 0 ) { l->jkLog(l, JK_LOG_DEBUG, "No more URI for context %s", cname); @@ -272,62 +187,6 @@ /* - * Build the Context State Query Cmd - * - * We send the list of contexts where we want to know state, - * empty string end context list* - * If cname is set, only ask about THIS context - * - * +----------------------------+----------------------------------+---------- - * | CONTEXT STATE CMD (1 byte) | VIRTUAL HOST NAME | CONTEXT NAME - * | (CString (*)) | (CString (*)) - * +----------------------------+----------------------------------+---------- - * - */ -int jk_handler_discovery_sendGetContextaState(jk_msg_buf_t *msg, - jk_workerEnv_t *we, - char *vhost, - char *cname, - jk_logger_t *l) -{ - jk_webapp_t *ci; - int i; - - l->jkLog(l, JK_LOG_DEBUG, "Into ajp14_marshal_context_state_into_msgb\n"); - - /* To be on the safe side */ - jk_b_reset(msg); - - /* - * CONTEXT STATE CMD - */ - if (jk_b_append_byte(msg, AJP14_CONTEXT_STATE_CMD)) - return JK_FALSE; - - /* - * VIRTUAL HOST CSTRING - */ - if (jk_b_append_string(msg, vhost)) { - l->jkLog(l, JK_LOG_ERROR, "Error ajp14_marshal_context_state_into_msgb" - "- Error appending the virtual host string\n"); - return JK_FALSE; - } - - /* - * CONTEXT CSTRING - */ - if (jk_b_append_string(msg, cname )) { - l->jkLog(l, JK_LOG_ERROR, - "Error ajp14_marshal_context_state_into_msgb" - "- Error appending the context string %s\n", cname); - return JK_FALSE; - } - - return JK_TRUE; -} - - -/* * Decode the Context State Reply Cmd * * We get update of contexts list, empty string end context list* @@ -340,19 +199,20 @@ *CONTEXT NAME (CString (*)) | UP/DOWN (1 byte) | .. | * ------------------------+------------------+----+ */ -int jk_handler_discovery_handleContextState(jk_msg_buf_t *msg, - jk_workerEnv_t *c, - jk_logger_t *l) +static int jk_handler_contextState(jk_msg_t *msg, + jk_ws_service_t *s, + jk_endpoint_t *ae, + jk_logger_t *l) { char *vname; char *cname; jk_webapp_t *ci = NULL; /* get virtual name */ - vname = (char *)jk_b_get_string(msg); + vname = (char *)msg->getString(msg); /* get context name */ - cname = (char *)jk_b_get_string(msg); + cname = (char *)msg->getString(msg); if (! cname || ! strlen(cname)) { return JK_TRUE; @@ -368,16 +228,37 @@ return JK_FALSE; } - ci->status = jk_b_get_int(msg); + ci->status = msg->getInt(msg); l->jkLog(l, JK_LOG_DEBUG, "ajp14_unmarshal_context_state_reply " "- updated context %s to state %d\n", cname, ci->status); return JK_TRUE; } - - +int JK_METHOD jk_handler_discovery_factory( jk_env_t *env, jk_pool_t *pool, + void **result, + const char *type, const char *name) +{ + jk_map_t *map; + jk_handler_t *h; + + map_alloc( &map, pool ); + *result=map; + + h=(jk_handler_t *)pool->calloc( pool, sizeof( jk_handler_t)); + h->name="contextInfo"; + h->messageId=AJP14_CONTEXT_INFO_CMD; + h->callback=jk_handler_contextList; + map_put( map, h->name, h, NULL ); + + h=(jk_handler_t *)pool->calloc( pool, sizeof( jk_handler_t)); + h->name="contextState"; + h->messageId=AJP14_CONTEXT_STATE_REP_CMD; + h->callback=jk_handler_contextState; + map_put( map, h->name, h, NULL ); + return JK_TRUE; +}
-- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>