-Dave
David Rees wrote, On 2/17/2004 8:28 AM: >
Umm, tab police? ;-)
-Dave
[EMAIL PROTECTED] wrote, On 2/17/2004 2:38 AM:
hgomez 2004/02/17 02:38:25
Modified: jk/native/common jk_ajp_common.c
- /* communication with tomcat has been interrupted AFTER - * headers have been sent to the client.
- * headers (and maybe parts of the body) have already been
- * sent, therefore the response is "complete" in a sense
- * that nobody should append any data, especially no 500 error - * page of the webserver! - *
- * BUT if you retrun JK_TRUE you have a 200 (OK) code in your
- * in your apache access.log instead of a 500 (Error). - * Therefore return FALSE/FALSE
- * return JK_TRUE; - */
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
--- jk_ajp_common.c.orig 2004-02-17 08:29:48.741514459 -0800 +++ jk_ajp_common.c 2004-02-17 08:33:47.518132894 -0800 @@ -658,28 +658,28 @@ int timeout, jk_logger_t *l) { - fd_set rset; - fd_set eset; - struct timeval tv; - int rc; - - FD_ZERO(&rset); - FD_ZERO(&eset); - FD_SET(ae->sd, &rset); - FD_SET(ae->sd, &eset); + fd_set rset; + fd_set eset; + struct timeval tv; + int rc; + + FD_ZERO(&rset); + FD_ZERO(&eset); + FD_SET(ae->sd, &rset); + FD_SET(ae->sd, &eset); - tv.tv_sec = timeout / 1000; - tv.tv_usec = (timeout % 1000) * 1000; + tv.tv_sec = timeout / 1000; + tv.tv_usec = (timeout % 1000) * 1000; - rc = select(ae->sd + 1, &rset, NULL, &eset, &tv); + rc = select(ae->sd + 1, &rset, NULL, &eset, &tv); if ((rc < 1) || (FD_ISSET(ae->sd, &eset))) - { - jk_log(l, JK_LOG_ERROR, "Error ajp13:is_input_event: error during select [%d]\n", rc); - return JK_FALSE; - } - - return ((FD_ISSET(ae->sd, &rset)) ? JK_TRUE : JK_FALSE) ; + { + jk_log(l, JK_LOG_ERROR, "Error ajp13:is_input_event: error during select [%d]\n", rc); + return JK_FALSE; + } + + return ((FD_ISSET(ae->sd, &rset)) ? JK_TRUE : JK_FALSE) ; } @@ -687,46 +687,46 @@ * Handle the CPING/CPONG initial query */ int ajp_handle_cping_cpong(ajp_endpoint_t *ae, - int timeout, + int timeout, jk_logger_t *l) { - int cmd; - jk_msg_buf_t * msg; + int cmd; + jk_msg_buf_t * msg; + + msg = jk_b_new(&ae->pool); + jk_b_set_buffer_size(msg, 16); /* 16 is way too large but I'm lazy :-) */ + jk_b_reset(msg); + jk_b_append_byte(msg, AJP13_CPING_REQUEST); - msg = jk_b_new(&ae->pool); - jk_b_set_buffer_size(msg, 16); /* 16 is way too large but I'm lazy :-) */ - jk_b_reset(msg); - jk_b_append_byte(msg, AJP13_CPING_REQUEST); - - /* Send CPing query */ - if (ajp_connection_tcp_send_message(ae, msg, l) != JK_TRUE) - { - jk_log(l, JK_LOG_ERROR, "Error ajp13:cping: can't send cping query\n"); - return JK_FALSE; - } - - /* wait for Pong reply for timeout milliseconds - */ - if (ajp_is_input_event(ae, timeout, l) == JK_FALSE) - { - jk_log(l, JK_LOG_ERROR, "Error ajp13:cping: timeout in reply pong\n"); - return JK_FALSE; - } - - /* Read and check for Pong reply - */ - if (ajp_connection_tcp_get_message(ae, msg, l) != JK_TRUE) - { - jk_log(l, JK_LOG_ERROR, "Error ajp13:cping: awaited reply cpong, not received\n"); - return JK_FALSE; - } - - if ((cmd = jk_b_get_byte(msg)) != AJP13_CPONG_REPLY) { - jk_log(l, JK_LOG_ERROR, "Error ajp13:cping: awaited reply cpong, received %d instead\n", cmd); - return JK_FALSE; - } + /* Send CPing query */ + if (ajp_connection_tcp_send_message(ae, msg, l) != JK_TRUE) + { + jk_log(l, JK_LOG_ERROR, "Error ajp13:cping: can't send cping query\n"); + return JK_FALSE; + } + + /* wait for Pong reply for timeout milliseconds + */ + if (ajp_is_input_event(ae, timeout, l) == JK_FALSE) + { + jk_log(l, JK_LOG_ERROR, "Error ajp13:cping: timeout in reply pong\n"); + return JK_FALSE; + } + + /* Read and check for Pong reply + */ + if (ajp_connection_tcp_get_message(ae, msg, l) != JK_TRUE) + { + jk_log(l, JK_LOG_ERROR, "Error ajp13:cping: awaited reply cpong, not received\n"); + return JK_FALSE; + } + + if ((cmd = jk_b_get_byte(msg)) != AJP13_CPONG_REPLY) { + jk_log(l, JK_LOG_ERROR, "Error ajp13:cping: awaited reply cpong, received %d instead\n", cmd); + return JK_FALSE; + } - return JK_TRUE; + return JK_TRUE; } int ajp_connect_to_endpoint(ajp_endpoint_t *ae, @@ -749,10 +749,10 @@ if (ae->worker->logon != NULL) return (ae->worker->logon(ae, l)); - /* should we send a CPING to validate connection ? */ - if (ae->worker->connect_timeout != 0) - return (ajp_handle_cping_cpong(ae, ae->worker->connect_timeout, l)); - + /* should we send a CPING to validate connection ? */ + if (ae->worker->connect_timeout != 0) + return (ajp_handle_cping_cpong(ae, ae->worker->connect_timeout, l)); + return JK_TRUE; } } @@ -970,7 +970,7 @@ } if (!r->is_chunked) { - ae->left_bytes_to_send -= len; + ae->left_bytes_to_send -= len; } if (len > 0) { @@ -1006,46 +1006,46 @@ ajp_endpoint_t *ae, ajp_operation_t *op) { - int err = 0; - int postlen; - + int err = 0; + int postlen; + /* Up to now, we can recover */ op->recoverable = JK_TRUE; /* * First try to reuse open connections... - */ + */ while ((ae->sd > 0)) { - err = 0; - - /* handle cping/cpong before request if timeout is set */ - if (ae->worker->prepost_timeout != 0) - { - if (ajp_handle_cping_cpong(ae, ae->worker->prepost_timeout, l) == JK_FALSE) - err++; - } - - /* If we got an error or can't send data, then try to get a pooled */ - /* connection and try again. If we are succesful, break out of this */ - /* loop. */ + err = 0; + + /* handle cping/cpong before request if timeout is set */ + if (ae->worker->prepost_timeout != 0) + { + if (ajp_handle_cping_cpong(ae, ae->worker->prepost_timeout, l) == JK_FALSE) + err++; + } + + /* If we got an error or can't send data, then try to get a pooled + * connection and try again. If we are succesful, break out of this + * loop. */ if (err || ajp_connection_tcp_send_message(ae, op->request, l) == JK_FALSE) { - jk_log(l, JK_LOG_INFO, - "Error sending request try another pooled connection\n"); - jk_close_socket(ae->sd); - ae->sd = -1; - ajp_reuse_connection(ae, l); - } + jk_log(l, JK_LOG_INFO, + "Error sending request try another pooled connection\n"); + jk_close_socket(ae->sd); + ae->sd = -1; + ajp_reuse_connection(ae, l); + } else break; - } - + } + /* * If we failed to reuse a connection, try to reconnect. */ if (ae->sd < 0) { - /* no need to handle cping/cpong here since it should be at connection time */ + /* no need to handle cping/cpong here since it should be at connection time */ if (ajp_connect_to_endpoint(ae, l) == JK_TRUE) { /* @@ -1090,21 +1090,21 @@ return JK_FALSE; } else - jk_log(l, JK_LOG_DEBUG, "Resent the request body (%d)\n", postlen); + jk_log(l, JK_LOG_DEBUG, "Resent the request body (%d)\n", postlen); } else if (s->reco_status == RECO_FILLED) { - /* Recovery in LB MODE */ - postlen = jk_b_get_len(s->reco_buf); + /* Recovery in LB MODE */ + postlen = jk_b_get_len(s->reco_buf); - if (postlen > AJP_HEADER_LEN) { - if(!ajp_connection_tcp_send_message(ae, s->reco_buf, l)) { - jk_log(l, JK_LOG_ERROR, "Error resending request body (lb mode) (%d)\n", postlen); - return JK_FALSE; - } - } - else - jk_log(l, JK_LOG_DEBUG, "Resent the request body (lb mode) (%d)\n", postlen); + if (postlen > AJP_HEADER_LEN) { + if(!ajp_connection_tcp_send_message(ae, s->reco_buf, l)) { + jk_log(l, JK_LOG_ERROR, "Error resending request body (lb mode) (%d)\n", postlen); + return JK_FALSE; + } + } + else + jk_log(l, JK_LOG_DEBUG, "Resent the request body (lb mode) (%d)\n", postlen); } else { /* We never sent any POST data and we check if we have to send at @@ -1112,13 +1112,13 @@ * for resend if the remote Tomcat is down, a fact we will learn only * doing a read (not yet) */ - /* || s->is_chunked - this can't be done here. The original protocol + /* || s->is_chunked - this can't be done here. The original protocol sends the first chunk of post data ( based on Content-Length ), and that's what the java side expects. - Sending this data for chunked would break other ajp13 servers. + Sending this data for chunked would break other ajp13 servers. - Note that chunking will continue to work - using the normal read. - */ + Note that chunking will continue to work - using the normal read. + */ if (ae->left_bytes_to_send > 0) { int len = ae->left_bytes_to_send; @@ -1131,11 +1131,11 @@ return JK_CLIENT_ERROR; } - /* If a RECOVERY buffer is available in LB mode, fill it */ - if (s->reco_status == RECO_INITED) { - jk_b_copy(op->post, s->reco_buf); - s->reco_status = RECO_FILLED; - } + /* If a RECOVERY buffer is available in LB mode, fill it */ + if (s->reco_status == RECO_INITED) { + jk_b_copy(op->post, s->reco_buf); + s->reco_status = RECO_FILLED; + } s->content_read = len; if (!ajp_connection_tcp_send_message(ae, op->post, l)) { @@ -1261,87 +1261,87 @@ ajp_endpoint_t *p, ajp_operation_t *op) { - /* Don't get header from tomcat yet */ - int headeratclient = JK_FALSE; + /* Don't get header from tomcat yet */ + int headeratclient = JK_FALSE; /* Start read all reply message */ while(1) { int rc = 0; - /* If we set a reply timeout, check it something is available */ - if (p->worker->reply_timeout != 0) - { - if (ajp_is_input_event(p, p->worker->reply_timeout, l) == JK_FALSE) - { - jk_log(l, JK_LOG_ERROR, - "Timeout will waiting reply from tomcat. " - "Tomcat is down, stopped or network problems.\n"); - - return JK_FALSE; - } - } - + /* If we set a reply timeout, check it something is available */ + if (p->worker->reply_timeout != 0) + { + if (ajp_is_input_event(p, p->worker->reply_timeout, l) == JK_FALSE) + { + jk_log(l, JK_LOG_ERROR, + "Timeout will waiting reply from tomcat. " + "Tomcat is down, stopped or network problems.\n"); + + return JK_FALSE; + } + } + if(!ajp_connection_tcp_get_message(p, op->reply, l)) { - /* we just can't recover, unset recover flag */ - if(headeratclient == JK_FALSE) { - jk_log(l, JK_LOG_ERROR, - "Tomcat is down or network problems. " - "No response has been sent to the client (yet)\n"); - /* - * communication with tomcat has been interrupted BEFORE - * headers have been sent to the client. - * DISCUSSION: As we suppose that tomcat has already started - * to process the query we think it's unrecoverable (and we - * should not retry or switch to another tomcat in the - * cluster). - */ - - /* - * We mark it unrecoverable if recovery_opts set to RECOVER_ABORT_IF_TCGETREQUEST - */ - if (p->worker->recovery_opts & RECOVER_ABORT_IF_TCGETREQUEST) - op->recoverable = JK_FALSE; - /* - * we want to display the webservers error page, therefore - * we return JK_FALSE - */ - return JK_FALSE; - } else { - jk_log(l, JK_LOG_ERROR, - "Error reading reply from tomcat. " - "Tomcat is down or network problems. " - "Part of the response has already been sent to the client\n"); - - /* communication with tomcat has been interrupted AFTER - * headers have been sent to the client. - * headers (and maybe parts of the body) have already been - * sent, therefore the response is "complete" in a sense - * that nobody should append any data, especially no 500 error - * page of the webserver! - * - * BUT if you retrun JK_TRUE you have a 200 (OK) code in your - * in your apache access.log instead of a 500 (Error). - * Therefore return FALSE/FALSE - * return JK_TRUE; - */ - - /* - * We mark it unrecoverable if recovery_opts set to RECOVER_ABORT_IF_TCSENDHEADER - */ - if (p->worker->recovery_opts & RECOVER_ABORT_IF_TCSENDHEADER) - op->recoverable = JK_FALSE; - - return JK_FALSE; - } - } - + /* we just can't recover, unset recover flag */ + if(headeratclient == JK_FALSE) { + jk_log(l, JK_LOG_ERROR, + "Tomcat is down or network problems. " + "No response has been sent to the client (yet)\n"); + /* + * communication with tomcat has been interrupted BEFORE + * headers have been sent to the client. + * DISCUSSION: As we suppose that tomcat has already started + * to process the query we think it's unrecoverable (and we + * should not retry or switch to another tomcat in the + * cluster). + */ + + /* + * We mark it unrecoverable if recovery_opts set to RECOVER_ABORT_IF_TCGETREQUEST + */ + if (p->worker->recovery_opts & RECOVER_ABORT_IF_TCGETREQUEST) + op->recoverable = JK_FALSE; + /* + * we want to display the webservers error page, therefore + * we return JK_FALSE + */ + return JK_FALSE; + } else { + jk_log(l, JK_LOG_ERROR, + "Error reading reply from tomcat. " + "Tomcat is down or network problems. " + "Part of the response has already been sent to the client\n"); + + /* communication with tomcat has been interrupted AFTER + * headers have been sent to the client. + * headers (and maybe parts of the body) have already been + * sent, therefore the response is "complete" in a sense + * that nobody should append any data, especially no 500 error + * page of the webserver! + * + * BUT if you retrun JK_TRUE you have a 200 (OK) code in your + * in your apache access.log instead of a 500 (Error). + * Therefore return FALSE/FALSE + * return JK_TRUE; + */ + + /* + * We mark it unrecoverable if recovery_opts set to RECOVER_ABORT_IF_TCSENDHEADER + */ + if (p->worker->recovery_opts & RECOVER_ABORT_IF_TCSENDHEADER) + op->recoverable = JK_FALSE; + + return JK_FALSE; + } + } + rc = ajp_process_callback(op->reply, op->post, 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_SEND_HEADERS == rc) { - headeratclient = JK_TRUE; + } else if(JK_AJP13_SEND_HEADERS == rc) { + headeratclient = JK_TRUE; } else if(JK_AJP13_HAS_RESPONSE == rc) { /* * in upload-mode there is no second chance since @@ -1608,7 +1608,7 @@ ajp_worker_t *p = pThis->worker_private; int cache_sz = jk_get_worker_cache_size(props, p->name, cache); p->socket_timeout = - jk_get_worker_socket_timeout(props, p->name, AJP13_DEF_TIMEOUT); + jk_get_worker_socket_timeout(props, p->name, AJP13_DEF_TIMEOUT); jk_log(l, JK_LOG_DEBUG, "In jk_worker_t::init, setting socket timeout to %d\n", @@ -1631,30 +1631,30 @@ p->connect_timeout = jk_get_worker_connect_timeout(props, p->name, AJP_DEF_CONNECT_TIMEOUT); - jk_log(l, JK_LOG_DEBUG, - "In jk_worker_t::init, setting connect timeout to %d\n", - p->connect_timeout); + jk_log(l, JK_LOG_DEBUG, + "In jk_worker_t::init, setting connect timeout to %d\n", + p->connect_timeout); p->reply_timeout = jk_get_worker_reply_timeout(props, p->name, AJP_DEF_REPLY_TIMEOUT); jk_log(l, JK_LOG_DEBUG, - "In jk_worker_t::init, setting reply timeout to %d\n", - p->reply_timeout); + "In jk_worker_t::init, setting reply timeout to %d\n", + p->reply_timeout); p->prepost_timeout = jk_get_worker_prepost_timeout(props, p->name, AJP_DEF_PREPOST_TIMEOUT); jk_log(l, JK_LOG_DEBUG, - "In jk_worker_t::init, setting prepost timeout to %d\n", - p->prepost_timeout); + "In jk_worker_t::init, setting prepost timeout to %d\n", + p->prepost_timeout); p->recovery_opts = jk_get_worker_recovery_opts(props, p->name, AJP_DEF_RECOVERY_OPTS); - jk_log(l, JK_LOG_DEBUG, - "In jk_worker_t::init, setting recovery opts to %d\n", - p->recovery_opts); + jk_log(l, JK_LOG_DEBUG, + "In jk_worker_t::init, setting recovery opts to %d\n", + p->recovery_opts); /* * Need to initialize secret here since we could return from inside
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]