You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by hg...@apache.org on 2001/06/07 16:33:08 UTC
cvs commit: jakarta-tomcat-connectors/jk/src/native/common jk_ajp13_worker.c jk_ajp13_worker.h
hgomez 01/06/07 07:33:07
Modified: jk/src/native/common jk_ajp13_worker.c jk_ajp13_worker.h
Log:
ajp13_worker also on the Diet.
code is shared with ajp14 and live in ajp_common :=)
Revision Changes Path
1.4 +25 -683 jakarta-tomcat-connectors/jk/src/native/common/jk_ajp13_worker.c
Index: jk_ajp13_worker.c
===================================================================
RCS file: /home/cvs/jakarta-tomcat-connectors/jk/src/native/common/jk_ajp13_worker.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- jk_ajp13_worker.c 2001/06/01 09:59:47 1.3
+++ jk_ajp13_worker.c 2001/06/07 14:33:02 1.4
@@ -58,288 +58,18 @@
* Author: Henri Gomez <hg...@slib.fr> *
* Author: Costin <co...@costin.dnt.ro> *
* Author: Gal Shachor <sh...@il.ibm.com> *
- * Version: $Revision: 1.3 $ *
+ * Version: $Revision: 1.4 $ *
***************************************************************************/
#include "jk_ajp13_worker.h"
-static void reset_endpoint(ajp13_endpoint_t *ep)
-{
- ep->reuse = JK_FALSE;
- jk_reset_pool(&(ep->pool));
-}
-
-static void close_endpoint(ajp13_endpoint_t *ep)
-{
- reset_endpoint(ep);
- jk_close_pool(&(ep->pool));
-
- if(ep->sd > 0) {
- jk_close_socket(ep->sd);
- }
- free(ep);
-}
-
-
-static void reuse_connection(ajp13_endpoint_t *ep,
- jk_logger_t *l)
-{
- ajp13_worker_t *w = ep->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]) {
- ep->sd = w->ep_cache[i]->sd;
- w->ep_cache[i]->sd = -1;
- close_endpoint(w->ep_cache[i]);
- w->ep_cache[i] = NULL;
- break;
- }
- }
- JK_LEAVE_CS(&w->cs, rc);
- }
- }
-}
-
-static void connect_to_tomcat(ajp13_endpoint_t *ep,
- jk_logger_t *l)
-{
- unsigned attempt;
-
- for(attempt = 0 ; attempt < ep->worker->connect_retry_attempts ; attempt++) {
- ep->sd = jk_open_socket(&ep->worker->worker_inet_addr, JK_TRUE, l);
- if(ep->sd >= 0) {
- jk_log(l, JK_LOG_DEBUG, "In jk_endpoint_t::connect_to_tomcat, connected sd = %d\n", ep->sd);
- return;
- }
- }
-
- jk_log(l, JK_LOG_ERROR, "In jk_endpoint_t::connect_to_tomcat, failed errno = %d\n", errno);
-}
-
-static int connection_tcp_send_message(ajp13_endpoint_t *ep,
- jk_msg_buf_t *msg,
- jk_logger_t *l )
-{
- jk_b_end(msg);
-
- jk_dump_buff(l, JK_LOG_DEBUG, "sending to ajp13", msg);
-
- if(0 > jk_tcp_socket_sendfull(ep->sd, jk_b_get_buff(msg), jk_b_get_len(msg))) {
- return JK_FALSE;
- }
-
- return JK_TRUE;
-}
-
-static int connection_tcp_get_message(ajp13_endpoint_t *ep,
- jk_msg_buf_t *msg,
- jk_logger_t *l)
-{
- unsigned char head[AJP13_HEADER_LEN];
- int rc;
- int msglen;
-
- rc = jk_tcp_socket_recvfull(ep->sd, head, AJP13_HEADER_LEN);
-
- if(rc < 0) {
- jk_log(l, JK_LOG_ERROR, "connection_tcp_get_message: Error - jk_tcp_socket_recvfull failed\n");
- return JK_FALSE;
- }
-
- if((head[0] != 'A') || (head[1] != 'B' )) {
- jk_log(l, JK_LOG_ERROR, "connection_tcp_get_message: Error - Wrong message format\n");
- return JK_FALSE;
- }
-
- msglen = ((head[2]&0xff)<<8);
- msglen += (head[3] & 0xFF);
-
- if(msglen > jk_b_get_size(msg)) {
- jk_log(l, JK_LOG_ERROR, "connection_tcp_get_message: Error - Wrong message size\n");
- return JK_FALSE;
- }
-
- jk_b_set_len(msg, msglen);
- jk_b_set_pos(msg, 0);
-
- rc = jk_tcp_socket_recvfull(ep->sd, jk_b_get_buff(msg), msglen);
- if(rc < 0) {
- jk_log(l, JK_LOG_ERROR, "connection_tcp_get_message: Error - jk_tcp_socket_recvfull failed\n");
- return JK_FALSE;
- }
-
- jk_dump_buff(l, JK_LOG_DEBUG, "received from ajp13", msg);
- return JK_TRUE;
-}
-
-static int read_fully_from_server(jk_ws_service_t *s,
- unsigned char *buf,
- unsigned len)
-{
- unsigned rdlen = 0;
-
- while(rdlen < len) {
- unsigned this_time = 0;
- if(!s->read(s, buf + rdlen, len - rdlen, &this_time)) {
- return -1;
- }
-
- if(0 == this_time) {
- break;
- }
- rdlen += this_time;
- }
-
- return (int)rdlen;
-}
-
-static int read_into_msg_buff(ajp13_endpoint_t *ep,
- jk_ws_service_t *r,
- jk_msg_buf_t *msg,
- jk_logger_t *l,
- unsigned len)
-{
- unsigned char *read_buf = jk_b_get_buff(msg);
-
- jk_b_reset(msg);
-
- read_buf += AJP13_HEADER_LEN; /* leave some space for the buffer headers */
- read_buf += AJP13_HEADER_SZ_LEN; /* leave some space for the read length */
-
- if(read_fully_from_server(r, read_buf, len) < 0) {
- jk_log(l, JK_LOG_ERROR, "read_into_msg_buff: Error - read_fully_from_server failed\n");
- return JK_FALSE;
- }
-
- ep->left_bytes_to_send -= len;
-
- if(0 != jk_b_append_int(msg, (unsigned short)len)) {
- jk_log(l, JK_LOG_ERROR, "read_into_msg_buff: Error - jk_b_append_int failed\n");
- return JK_FALSE;
- }
-
- jk_b_set_len(msg, jk_b_get_len(msg) + len);
-
- return JK_TRUE;
-}
-
-static int ajp13_process_callback(jk_msg_buf_t *msg,
- ajp13_endpoint_t *ep,
- jk_ws_service_t *r,
- jk_logger_t *l)
-{
- int code = (int)jk_b_get_byte(msg);
-
- switch(code) {
- case JK_AJP13_SEND_HEADERS:
- {
- jk_res_data_t res;
- if(!ajp13_unmarshal_response(msg, &res, &ep->pool, l)) {
- jk_log(l, JK_LOG_ERROR, "Error ajp13_process_callback - ajp13_unmarshal_response failed\n");
- return JK_AJP13_ERROR;
- }
- if(!r->start_response(r,
- res.status,
- res.msg,
- (const char * const *)res.header_names,
- (const char * const *)res.header_values,
- res.num_headers)) {
- jk_log(l, JK_LOG_ERROR, "Error ajp13_process_callback - start_response failed\n");
- return JK_INTERNAL_ERROR;
- }
- }
- break;
-
- case JK_AJP13_SEND_BODY_CHUNK:
- {
- unsigned len = (unsigned)jk_b_get_int(msg);
- if(!r->write(r, jk_b_get_buff(msg) + jk_b_get_pos(msg), len)) {
- jk_log(l, JK_LOG_ERROR, "Error ajp13_process_callback - write failed\n");
- return JK_INTERNAL_ERROR;
- }
- }
- break;
-
- case JK_AJP13_GET_BODY_CHUNK:
- {
- unsigned len = (unsigned)jk_b_get_int(msg);
-
- if(len > AJP13_MAX_SEND_BODY_SZ) {
- len = AJP13_MAX_SEND_BODY_SZ;
- }
- if(len > ep->left_bytes_to_send) {
- len = ep->left_bytes_to_send;
- }
- if(len < 0) {
- len = 0;
- }
-
- /* the right place to add file storage for upload */
- if(read_into_msg_buff(ep, r, msg, l, len)) {
- r->content_read += len;
- return JK_AJP13_HAS_RESPONSE;
- }
-
- jk_log(l, JK_LOG_ERROR, "Error ajp13_process_callback - read_into_msg_buff failed\n");
- return JK_INTERNAL_ERROR;
- }
- break;
-
- case JK_AJP13_END_RESPONSE:
- {
- ep->reuse = (int)jk_b_get_byte(msg);
-
- if((ep->reuse & 0X01) != ep->reuse) {
- /*
- * Strange protocol error.
- */
- ep->reuse = JK_FALSE;
- }
- }
- return JK_AJP13_END_RESPONSE;
- break;
-
- default:
- jk_log(l, JK_LOG_ERROR, "Error ajp13_process_callback - Invalid code: %d\n", code);
- return JK_AJP13_ERROR;
- }
-
- return JK_AJP13_NO_RESPONSE;
-}
-
/* -------------------- Method -------------------- */
static int JK_METHOD validate(jk_worker_t *pThis,
jk_map_t *props,
jk_logger_t *l)
{
- jk_log(l, JK_LOG_DEBUG, "Into jk_worker_t::validate\n");
-
- if(pThis && pThis->worker_private) {
- ajp13_worker_t *p = pThis->worker_private;
- int port = jk_get_worker_port(props, p->name, AJP13_DEF_PORT);
- char *host = jk_get_worker_host(props, p->name, AJP13_DEF_HOST);
-
- jk_log(l, JK_LOG_DEBUG, "In jk_worker_t::validate for worker %s contact is %s:%d\n", p->name, host, port);
-
- if(port > 1024 && host) {
- if(jk_resolve(host, (short)port, &p->worker_inet_addr)) {
- return JK_TRUE;
- }
- jk_log(l, JK_LOG_ERROR, "In jk_worker_t::validate, resolve failed\n");
- }
- jk_log(l, JK_LOG_ERROR, "In jk_worker_t::validate, Error %s %d\n", host, port);
- } else {
- jk_log(l, JK_LOG_ERROR, "In jk_worker_t::validate, NULL parameters\n");
- }
-
- return JK_FALSE;
+ return (ajp_validate(pThis, props, l, AJP13_PROTO));
}
@@ -347,420 +77,29 @@
jk_map_t *props,
jk_logger_t *l)
{
- /*
- * start the connection cache
- */
- jk_log(l, JK_LOG_DEBUG, "Into jk_worker_t::init\n");
-
- if(pThis && pThis->worker_private) {
- ajp13_worker_t *p = pThis->worker_private;
- int cache_sz = jk_get_worker_cache_size(props, p->name, AJP13_DEF_CACHE_SZ);
- if (cache_sz > 0) {
- p->ep_cache = (ajp13_endpoint_t **)malloc(sizeof(ajp13_endpoint_t *) * cache_sz);
- if(p->ep_cache) {
- int i;
- p->ep_cache_sz = cache_sz;
- for(i = 0 ; i < cache_sz ; i++) {
- p->ep_cache[i] = NULL;
- }
- JK_INIT_CS(&(p->cs), i);
- if (i) {
- return JK_TRUE;
- }
- }
- }
- } else {
- jk_log(l, JK_LOG_ERROR, "In jk_worker_t::init, NULL parameters\n");
- }
-
- return JK_FALSE;
+ return (ajp_init(pThis, props, l, AJP13_PROTO));
}
static int JK_METHOD destroy(jk_worker_t **pThis,
jk_logger_t *l)
{
- jk_log(l, JK_LOG_DEBUG, "Into jk_worker_t::destroy\n");
-
- if(pThis && *pThis && (*pThis)->worker_private) {
- ajp13_worker_t *private_data = (*pThis)->worker_private;
-
- free(private_data->name);
-
- if(private_data->ep_cache_sz) {
- unsigned i;
- for(i = 0 ; i < private_data->ep_cache_sz ; i++) {
- if(private_data->ep_cache[i]) {
- reset_endpoint(private_data->ep_cache[i]);
- close_endpoint(private_data->ep_cache[i]);
- }
- }
- free(private_data->ep_cache);
- JK_DELETE_CS(&(private_data->cs), i);
- }
-
- free(private_data);
-
- return JK_TRUE;
- }
-
- jk_log(l, JK_LOG_ERROR, "In jk_worker_t::destroy, NULL parameters\n");
- return JK_FALSE;
+ return (ajp_destroy(pThis, l, AJP13_PROTO));
}
-static int JK_METHOD done(jk_endpoint_t **e,
- jk_logger_t *l)
-{
- jk_log(l, JK_LOG_DEBUG, "Into jk_endpoint_t::done\n");
-
- if(e && *e && (*e)->endpoint_private) {
- ajp13_endpoint_t *p = (*e)->endpoint_private;
- int reuse_ep = p->reuse;
-
- reset_endpoint(p);
-
- if(reuse_ep) {
- ajp13_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) {
- return JK_TRUE;
- }
- }
- }
- }
-
- close_endpoint(p);
- *e = NULL;
-
- return JK_TRUE;
- }
-
- jk_log(l, JK_LOG_ERROR, "In jk_endpoint_t::done, NULL parameters\n");
- return JK_FALSE;
-}
-
-/*
- * send request to Tomcat via Ajp13
- * - first try to find reuseable socket
- * - if no one available, try to connect
- * - send request, but send must be see as asynchronous,
- * since send() call will return noerror about 95% of time
- * Hopefully we'll get more information on next read.
- *
- * nb: reqmsg is the original request msg buffer
- * repmsg is the reply msg buffer which could be scratched
- */
-static int send_request(jk_endpoint_t *e,
- jk_ws_service_t *s,
- jk_logger_t *l,
- ajp13_endpoint_t *p,
- ajp13_operation_t *op)
-{
- /* Up to now, we can recover */
- op->recoverable = JK_TRUE;
-
- /*
- * First try to reuse open connections...
- */
- while((p->sd > 0) && !connection_tcp_send_message(p, op->request, l)) {
- jk_log(l, JK_LOG_ERROR, "Error sending request try another pooled connection\n");
- jk_close_socket(p->sd);
- p->sd = -1;
- reuse_connection(p, l);
- }
-
- /*
- * If we failed to reuse a connection, try to reconnect.
- */
- if(p->sd < 0) {
- connect_to_tomcat(p, l);
- if(p->sd >= 0) {
- /*
- * After we are connected, each error that we are going to
- * have is probably unrecoverable
- */
- if(!connection_tcp_send_message(p, op->request, l)) {
- jk_log(l, JK_LOG_ERROR, "Error sending request on a fresh connection\n");
- return JK_FALSE;
- }
- } else {
- jk_log(l, JK_LOG_ERROR, "Error connecting to the Tomcat process.\n");
- return JK_FALSE;
- }
- }
-
- /*
- * From now on an error means that we have an internal server error
- * or Tomcat crashed. In any case we cannot recover this.
- */
-
- jk_log(l, JK_LOG_DEBUG, "send_request 2: request body to send %d - request body to resend %d\n",
- p->left_bytes_to_send, jk_b_get_len(op->reply) - AJP13_HEADER_LEN);
-
- /*
- * POST recovery job is done here.
- * It's not very fine to have posted data in reply but that's the only easy
- * way to do that for now. Sharing the reply is really a bad solution but
- * it will works for POST DATA less than 8k.
- * We send here the first part of data which was sent previously to the
- * remote Tomcat
- */
- if(jk_b_get_len(op->reply) > AJP13_HEADER_LEN) {
- if(!connection_tcp_send_message(p, op->reply, l)) {
- jk_log(l, JK_LOG_ERROR, "Error resending request body\n");
- return JK_FALSE;
- }
- }
- else
- {
- /* We never sent any POST data and we check it we have to send at
- * least of block of data (max 8k). These data will be kept in reply
- * for resend if the remote Tomcat is down, a fact we will learn only
- * doing a read (not yet)
- */
- if(p->left_bytes_to_send > 0) {
- unsigned len = p->left_bytes_to_send;
- if(len > AJP13_MAX_SEND_BODY_SZ)
- len = AJP13_MAX_SEND_BODY_SZ;
- if(!read_into_msg_buff(p, s, op->reply, l, len)) {
- /* the browser stop sending data, no need to recover */
- op->recoverable = JK_FALSE;
- return JK_FALSE;
- }
- s->content_read = len;
- if(!connection_tcp_send_message(p, op->reply, l)) {
- jk_log(l, JK_LOG_ERROR, "Error sending request body\n");
- return JK_FALSE;
- }
- }
- }
- return (JK_TRUE);
-}
-
-/*
- * get replies from Tomcat via Ajp13
- * We will know only at read time if the remote host closed
- * the connection (half-closed state - FIN-WAIT2). In that case
- * we must close our side of the socket and abort emission.
- * We will need another connection to send the request
- * There is need of refactoring here since we mix
- * reply reception (tomcat -> apache) and request send (apache -> tomcat)
- * and everything using the same buffer (repmsg)
- * ajp13 is async but handling read/send this way prevent nice recovery
- * In fact if tomcat link is broken during upload (browser -> apache -> tomcat)
- * we'll loose data and we'll have to abort the whole request.
- */
-static int get_reply(jk_endpoint_t *e,
- jk_ws_service_t *s,
- jk_logger_t *l,
- ajp13_endpoint_t *p,
- ajp13_operation_t *op)
-{
- /* Start read all reply message */
- while(1) {
- int rc = 0;
-
- if(!connection_tcp_get_message(p, op->reply, l)) {
- jk_log(l, JK_LOG_ERROR, "Error reading reply\n");
- /* we just can't recover, unset recover flag */
- return JK_FALSE;
- }
-
- rc = ajp13_process_callback(op->reply, p, s, l);
-
- /* no more data to be sent, fine we have finish here */
- if(JK_AJP13_END_RESPONSE == rc)
- return JK_TRUE;
- else if(JK_AJP13_HAS_RESPONSE == rc) {
- /*
- * in upload-mode there is no second chance since
- * we may have allready send part of uploaded data
- * to Tomcat.
- * In this case if Tomcat connection is broken we must
- * abort request and indicate error.
- * A possible work-around could be to store the uploaded
- * data to file and replay for it
- */
- op->recoverable = JK_FALSE;
- rc = connection_tcp_send_message(p, op->reply, l);
- if (rc < 0) {
- jk_log(l, JK_LOG_ERROR, "Error sending request data %d\n", rc);
- return JK_FALSE;
- }
- } else if(rc < 0) {
- return (JK_FALSE); /* XXX error */
- }
- }
-}
-
-#define JK_RETRIES 3
-
-/*
- * service is now splitted in send_request and get_reply
- * much more easier to do errors recovery
- */
-static int JK_METHOD service(jk_endpoint_t *e,
- jk_ws_service_t *s,
- jk_logger_t *l,
- int *is_recoverable_error)
-{
- int i;
- ajp13_operation_t oper;
- ajp13_operation_t *op = &oper;
-
- jk_log(l, JK_LOG_DEBUG, "Into jk_endpoint_t::service\n");
-
- if(e && e->endpoint_private && s && is_recoverable_error) {
- ajp13_endpoint_t *p = e->endpoint_private;
- op->request = jk_b_new(&(p->pool));
- jk_b_set_buffer_size(op->request, DEF_BUFFER_SZ);
- jk_b_reset(op->request);
-
- op->reply = jk_b_new(&(p->pool));
- jk_b_set_buffer_size(op->reply, DEF_BUFFER_SZ);
- jk_b_reset(op->reply);
-
- op->recoverable = JK_TRUE;
- op->uploadfd = -1; /* not yet used, later ;) */
-
- p->left_bytes_to_send = s->content_length;
- p->reuse = JK_FALSE;
- *is_recoverable_error = JK_TRUE;
-
- /*
- * We get here initial request (in reqmsg)
- */
- if(!ajp13_marshal_into_msgb(op->request, s, l)) {
- *is_recoverable_error = JK_FALSE;
- 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.
- */
- if (send_request(e, s, l, p, op)) {
-
- /* 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 (! op->recoverable) {
- *is_recoverable_error = JK_FALSE;
- jk_log(l, JK_LOG_ERROR, "In jk_endpoint_t::service, 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;
- op->recoverable = JK_TRUE;
-
- if (get_reply(e, s, l, p, op))
- 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 (! op->recoverable) {
- *is_recoverable_error = JK_FALSE;
- jk_log(l, JK_LOG_ERROR, "In jk_endpoint_t::service, get_reply failed without recovery in send loop %d\n", i);
- return JK_FALSE;
- }
-
- jk_log(l, JK_LOG_ERROR, "In jk_endpoint_t::service, get_reply failed in send loop %d\n", i);
- }
- else
- jk_log(l, JK_LOG_ERROR, "In jk_endpoint_t::service, send_request failed in send loop %d\n", i);
-
- jk_close_socket(p->sd);
- p->sd = -1;
- reuse_connection(p, l);
- }
- } else {
- jk_log(l, JK_LOG_ERROR, "In jk_endpoint_t::service, NULL parameters\n");
- }
-
- return JK_FALSE;
-}
-
static int JK_METHOD get_endpoint(jk_worker_t *pThis,
jk_endpoint_t **pend,
jk_logger_t *l)
{
- jk_log(l, JK_LOG_DEBUG, "Into jk_worker_t::get_endpoint\n");
-
- if(pThis && pThis->worker_private && pend) {
- ajp13_worker_t *p = pThis->worker_private;
- ajp13_endpoint_t *ep = NULL;
-
- if(p->ep_cache_sz) {
- int rc;
- JK_ENTER_CS(&p->cs, rc);
- if(rc) {
- unsigned i;
-
- for(i = 0 ; i < p->ep_cache_sz ; i++) {
- if(p->ep_cache[i]) {
- ep = p->ep_cache[i];
- p->ep_cache[i] = NULL;
- break;
- }
- }
- JK_LEAVE_CS(&p->cs, rc);
- if(ep) {
- *pend = &ep->endpoint;
- return JK_TRUE;
- }
- }
- }
-
- ep = (ajp13_endpoint_t *)malloc(sizeof(ajp13_endpoint_t));
- if(ep) {
- ep->sd = -1;
- ep->reuse = JK_FALSE;
- jk_open_pool(&ep->pool, ep->buf, sizeof(ep->buf));
- ep->worker = pThis->worker_private;
- ep->endpoint.endpoint_private = ep;
- ep->endpoint.service = service;
- ep->endpoint.done = done;
- *pend = &ep->endpoint;
- return JK_TRUE;
- }
- jk_log(l, JK_LOG_ERROR, "In jk_worker_t::get_endpoint, malloc failed\n");
- } else {
- jk_log(l, JK_LOG_ERROR, "In jk_worker_t::get_endpoint, NULL parameters\n");
- }
-
- return JK_FALSE;
+ return (ajp_get_endpoint(pThis, pend, l, AJP13_PROTO));
}
-
-
int JK_METHOD ajp13_worker_factory(jk_worker_t **w,
- const char *name,
- jk_logger_t *l)
+ const char *name,
+ jk_logger_t *l)
{
- ajp13_worker_t *private_data = (ajp13_worker_t *)malloc(sizeof(ajp13_worker_t));
+ ajp_worker_t *aw = (ajp_worker_t *)malloc(sizeof(ajp_worker_t));
jk_log(l, JK_LOG_DEBUG, "Into ajp13_worker_factory\n");
@@ -769,29 +108,32 @@
return JK_FALSE;
}
- if (! private_data) {
+ if (! aw) {
jk_log(l, JK_LOG_ERROR, "In ajp13_worker_factory, malloc of private_data failed\n");
return JK_FALSE;
}
- private_data->name = strdup(name);
+ aw->name = strdup(name);
- if (! private_data->name) {
- free(private_data);
+ if (! aw->name) {
+ free(aw);
jk_log(l, JK_LOG_ERROR, "In ajp13_worker_factory, malloc failed\n");
return JK_FALSE;
}
- private_data->ep_cache_sz = 0;
- private_data->ep_cache = NULL;
- private_data->connect_retry_attempts = AJP13_DEF_RETRY_ATTEMPTS;
- private_data->worker.worker_private = private_data;
-
- private_data->worker.validate = validate;
- private_data->worker.init = init;
- private_data->worker.get_endpoint = get_endpoint;
- private_data->worker.destroy = destroy;
+ aw->proto = AJP13_PROTO;
+ aw->login = NULL;
+
+ aw->ep_cache_sz = 0;
+ aw->ep_cache = NULL;
+ aw->connect_retry_attempts = AJP_DEF_RETRY_ATTEMPTS;
+ aw->worker.worker_private = aw;
+
+ aw->worker.validate = validate;
+ aw->worker.init = init;
+ aw->worker.get_endpoint = get_endpoint;
+ aw->worker.destroy = destroy;
- *w = &private_data->worker;
+ *w = &aw->worker;
return JK_TRUE;
}
1.3 +2 -60 jakarta-tomcat-connectors/jk/src/native/common/jk_ajp13_worker.h
Index: jk_ajp13_worker.h
===================================================================
RCS file: /home/cvs/jakarta-tomcat-connectors/jk/src/native/common/jk_ajp13_worker.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- jk_ajp13_worker.h 2001/05/18 16:45:05 1.2
+++ jk_ajp13_worker.h 2001/06/07 14:33:03 1.3
@@ -56,7 +56,7 @@
/***************************************************************************
* Description: ajpv1.3 worker header file *
* Author: Gal Shachor <sh...@il.ibm.com> *
- * Version: $Revision: 1.2 $ *
+ * Version: $Revision: 1.3 $ *
***************************************************************************/
#ifndef JK_AJP13_WORKER_H
@@ -66,73 +66,15 @@
#include "jk_connect.h"
#include "jk_util.h"
#include "jk_msg_buff.h"
+#include "jk_ajp_common.h"
#include "jk_ajp13.h"
#include "jk_logger.h"
-#include "jk_service.h"
-#include "jk_mt.h"
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
#define JK_AJP13_WORKER_NAME ("ajp13")
-
-struct ajp13_operation;
-typedef struct ajp13_operation ajp13_operation_t;
-
-struct ajp13_endpoint;
-typedef struct ajp13_endpoint ajp13_endpoint_t;
-
-struct ajp13_worker;
-typedef struct ajp13_worker ajp13_worker_t;
-
-struct ajp13_worker {
- struct sockaddr_in worker_inet_addr; /* Contains host and port */
- unsigned connect_retry_attempts;
- char *name;
-
- /*
- * Open connections cache...
- *
- * 1. Critical section object to protect the cache.
- * 2. Cache size.
- * 3. An array of "open" endpoints.
- */
- JK_CRIT_SEC cs;
- unsigned ep_cache_sz;
- ajp13_endpoint_t **ep_cache;
-
- jk_worker_t worker;
-};
-
-/*
- * endpoint, the remote which will does the work
- */
-struct ajp13_endpoint {
- ajp13_worker_t *worker;
-
- jk_pool_t pool;
- jk_pool_atom_t buf[BIG_POOL_SIZE];
-
- int sd;
- int reuse;
- jk_endpoint_t endpoint;
-
- unsigned left_bytes_to_send;
-};
-
-/*
- * little struct to avoid multiples ptr passing
- * this struct is ready to hold upload file fd
- * to add upload persistant storage
- */
-struct ajp13_operation {
- jk_msg_buf_t *request; /* original request storage */
- jk_msg_buf_t *reply; /* reply storage (chuncked by ajp13 */
- int uploadfd; /* future persistant storage id */
- int recoverable; /* if exchange could be conducted on another TC */
-};
-
int JK_METHOD ajp13_worker_factory(jk_worker_t **w,
const char *name,