Re: Sun One/iPlanet nsapi_redirector issue
Kevin Convy (Contractor) wrote: I am having an issue posting a large request (that also requires authentication) through a Sun One/IPlanet 6.0sp5 webserver to Tomcat 5.5 using the 1.2.8 nsapi_redirector. The client that is doing the posting gets a server write error if the request body is over a certain size (~150K). The issue occurs on both the Windows XP and Solaris versions.The issue does NOT occur using an Apache-mod_jk configuration. If I use the attached version of the ajp_process_callback method in jk_ajp_common.c (changes from the 1.2.8 version of the code are marked with KCADD comments) it resolves the problem. A diff -u would help to see your changes. It seems to resolve it by making sure the entire request body is read off the netbuf before turning around and starting the response (which occurs in this case because an authentication challenge is sent before the entire request is read by tomcat). I don't mean to offer this as a fix, but I was wondering if this is a known issue and if there is a better fix somewhere. I sent a slightly different version of this email to the tomcat-user list a couple of weeks ago and apologize for the cross-post. Thanks, Kevin Convy Icebox LLC static int ajp_process_callback(jk_msg_buf_t *msg, jk_msg_buf_t *pmsg, ajp_endpoint_t * ae, jk_ws_service_t *r, jk_logger_t *l) { int code = (int)jk_b_get_byte(msg); // KCADD int bytesread = 0; unsigned char buf1[AJP13_MAX_SEND_BODY_SZ]; JK_TRACE_ENTER(l); switch (code) { case JK_AJP13_SEND_HEADERS: { jk_res_data_t res; if (!ajp_unmarshal_response(msg, res, ae, l)) { jk_log(l, JK_LOG_ERROR, ajp_unmarshal_response failed\n); JK_TRACE_EXIT(l); return JK_AJP13_ERROR; } //KCADD // make sure the entire request body has been read. jk_log(l, JK_LOG_INFO, KCDEBUG: this many bytes left: %d, ae-left_bytes_to_send); while(ae-left_bytes_to_send 0) { r-read(r, buf1, AJP13_MAX_SEND_BODY_SZ, bytesread); ae-left_bytes_to_send -= bytesread; } r-start_response(r, res.status, res.msg, (const char *const *)res.header_names, (const char *const *)res.header_values, res.num_headers); } return JK_AJP13_SEND_HEADERS; 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_INFO, Connection aborted or network problems\n); JK_TRACE_EXIT(l); return JK_CLIENT_ERROR; } } break; case JK_AJP13_GET_BODY_CHUNK: { int len = (int)jk_b_get_int(msg); if (len 0) { len = 0; } if (len AJP13_MAX_SEND_BODY_SZ) { len = AJP13_MAX_SEND_BODY_SZ; } if ((unsigned int)len ae-left_bytes_to_send) { len = ae-left_bytes_to_send; } /* the right place to add file storage for upload */ if ((len = ajp_read_into_msg_buff(ae, r, pmsg, len, l)) = 0) { r-content_read += len; JK_TRACE_EXIT(l); return JK_AJP13_HAS_RESPONSE; } jk_log(l, JK_LOG_INFO, Connection aborted or network problems\n); JK_TRACE_EXIT(l); return JK_CLIENT_ERROR; } break; case JK_AJP13_END_RESPONSE: { ae-reuse = (int)jk_b_get_byte(msg); if (!ae-reuse) { /* * Strange protocol error. */ if (JK_IS_DEBUG_LEVEL(l)) jk_log(l, JK_LOG_DEBUG, Reuse: %d\n, ae-reuse); ae-reuse = JK_FALSE; } /* Reuse in all cases */ ae-reuse = JK_TRUE; } JK_TRACE_EXIT(l); return JK_AJP13_END_RESPONSE; break; default: jk_log(l, JK_LOG_ERROR, Invalid code: %d\n, code); JK_TRACE_EXIT(l); return JK_AJP13_ERROR; } JK_TRACE_EXIT(l); return JK_AJP13_NO_RESPONSE; } - To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
RE: Sun One/iPlanet nsapi_redirector issue
--- jk_ajp_common.c.orig.c 2005-06-15 07:23:02.0 -0700 +++ jk_ajp_common.c 2005-06-15 07:29:00.0 -0700 @@ -1296,6 +1296,9 @@ jk_ws_service_t *r, jk_logger_t *l) { int code = (int)jk_b_get_byte(msg); + //KCADD + int bytesread = 0; + unsigned char buf1[AJP13_MAX_SEND_BODY_SZ]; JK_TRACE_ENTER(l); switch (code) { @@ -1309,6 +1312,14 @@ return JK_AJP13_ERROR; } + //KCADD + // make sure the entire request body has been read. + jk_log(l, JK_LOG_INFO, KCDEBUG: this many bytes left: %d, ae-left_bytes_to_send); + while(ae-left_bytes_to_send 0) { + r-read(r, buf1, AJP13_MAX_SEND_BODY_SZ, bytesread); + ae-left_bytes_to_send -= bytesread; + } + r-start_response(r, res.status, res.msg, (const char *const *)res.header_names, (const char *const *)res.header_values, -Original Message- From: jean-frederic clere [mailto:[EMAIL PROTECTED] Sent: Tuesday, June 14, 2005 11:53 PM To: Tomcat Developers List Subject: Re: Sun One/iPlanet nsapi_redirector issue Kevin Convy (Contractor) wrote: I am having an issue posting a large request (that also requires authentication) through a Sun One/IPlanet 6.0sp5 webserver to Tomcat 5.5 using the 1.2.8 nsapi_redirector. The client that is doing the posting gets a server write error if the request body is over a certain size (~150K). The issue occurs on both the Windows XP and Solaris versions.The issue does NOT occur using an Apache-mod_jk configuration. If I use the attached version of the ajp_process_callback method in jk_ajp_common.c (changes from the 1.2.8 version of the code are marked with KCADD comments) it resolves the problem. A diff -u would help to see your changes. It seems to resolve it by making sure the entire request body is read off the netbuf before turning around and starting the response (which occurs in this case because an authentication challenge is sent before the entire request is read by tomcat). I don't mean to offer this as a fix, but I was wondering if this is a known issue and if there is a better fix somewhere. I sent a slightly different version of this email to the tomcat-user list a couple of weeks ago and apologize for the cross-post. Thanks, Kevin Convy Icebox LLC static int ajp_process_callback(jk_msg_buf_t *msg, jk_msg_buf_t *pmsg, ajp_endpoint_t * ae, jk_ws_service_t *r, jk_logger_t *l) { int code = (int)jk_b_get_byte(msg); // KCADD int bytesread = 0; unsigned char buf1[AJP13_MAX_SEND_BODY_SZ]; JK_TRACE_ENTER(l); switch (code) { case JK_AJP13_SEND_HEADERS: { jk_res_data_t res; if (!ajp_unmarshal_response(msg, res, ae, l)) { jk_log(l, JK_LOG_ERROR, ajp_unmarshal_response failed\n); JK_TRACE_EXIT(l); return JK_AJP13_ERROR; } //KCADD // make sure the entire request body has been read. jk_log(l, JK_LOG_INFO, KCDEBUG: this many bytes left: %d, ae-left_bytes_to_send); while(ae-left_bytes_to_send 0) { r-read(r, buf1, AJP13_MAX_SEND_BODY_SZ, bytesread); ae-left_bytes_to_send -= bytesread; } r-start_response(r, res.status, res.msg, (const char *const *)res.header_names, (const char *const *)res.header_values, res.num_headers); } return JK_AJP13_SEND_HEADERS; 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_INFO, Connection aborted or network problems\n); JK_TRACE_EXIT(l); return JK_CLIENT_ERROR; } } break; case JK_AJP13_GET_BODY_CHUNK: { int len = (int)jk_b_get_int(msg); if (len 0) { len = 0; } if (len AJP13_MAX_SEND_BODY_SZ) { len = AJP13_MAX_SEND_BODY_SZ; } if ((unsigned int)len ae-left_bytes_to_send) { len = ae-left_bytes_to_send; } /* the right place to add
Sun One/iPlanet nsapi_redirector issue
I am having an issue posting a large request (that also requires authentication) through a Sun One/IPlanet 6.0sp5 webserver to Tomcat 5.5 using the 1.2.8 nsapi_redirector. The client that is doing the posting gets a server write error if the request body is over a certain size (~150K). The issue occurs on both the Windows XP and Solaris versions.The issue does NOT occur using an Apache-mod_jk configuration. If I use the attached version of the ajp_process_callback method in jk_ajp_common.c (changes from the 1.2.8 version of the code are marked with KCADD comments) it resolves the problem. It seems to resolve it by making sure the entire request body is read off the netbuf before turning around and starting the response (which occurs in this case because an authentication challenge is sent before the entire request is read by tomcat). I don't mean to offer this as a fix, but I was wondering if this is a known issue and if there is a better fix somewhere. I sent a slightly different version of this email to the tomcat-user list a couple of weeks ago and apologize for the cross-post. Thanks, Kevin Convy Icebox LLC static int ajp_process_callback(jk_msg_buf_t *msg, jk_msg_buf_t *pmsg, ajp_endpoint_t * ae, jk_ws_service_t *r, jk_logger_t *l) { int code = (int)jk_b_get_byte(msg); // KCADD int bytesread = 0; unsigned char buf1[AJP13_MAX_SEND_BODY_SZ]; JK_TRACE_ENTER(l); switch (code) { case JK_AJP13_SEND_HEADERS: { jk_res_data_t res; if (!ajp_unmarshal_response(msg, res, ae, l)) { jk_log(l, JK_LOG_ERROR, ajp_unmarshal_response failed\n); JK_TRACE_EXIT(l); return JK_AJP13_ERROR; } //KCADD // make sure the entire request body has been read. jk_log(l, JK_LOG_INFO, KCDEBUG: this many bytes left: %d, ae-left_bytes_to_send); while(ae-left_bytes_to_send 0) { r-read(r, buf1, AJP13_MAX_SEND_BODY_SZ, bytesread); ae-left_bytes_to_send -= bytesread; } r-start_response(r, res.status, res.msg, (const char *const *)res.header_names, (const char *const *)res.header_values, res.num_headers); } return JK_AJP13_SEND_HEADERS; 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_INFO, Connection aborted or network problems\n); JK_TRACE_EXIT(l); return JK_CLIENT_ERROR; } } break; case JK_AJP13_GET_BODY_CHUNK: { int len = (int)jk_b_get_int(msg); if (len 0) { len = 0; } if (len AJP13_MAX_SEND_BODY_SZ) { len = AJP13_MAX_SEND_BODY_SZ; } if ((unsigned int)len ae-left_bytes_to_send) { len = ae-left_bytes_to_send; } /* the right place to add file storage for upload */ if ((len = ajp_read_into_msg_buff(ae, r, pmsg, len, l)) = 0) { r-content_read += len; JK_TRACE_EXIT(l); return JK_AJP13_HAS_RESPONSE; } jk_log(l, JK_LOG_INFO, Connection aborted or network problems\n); JK_TRACE_EXIT(l); return JK_CLIENT_ERROR; } break; case JK_AJP13_END_RESPONSE: { ae-reuse = (int)jk_b_get_byte(msg); if (!ae-reuse) { /* * Strange protocol error. */ if (JK_IS_DEBUG_LEVEL(l)) jk_log(l, JK_LOG_DEBUG, Reuse: %d\n, ae-reuse); ae-reuse = JK_FALSE; } /* Reuse in all cases */ ae-reuse = JK_TRUE; } JK_TRACE_EXIT(l); return JK_AJP13_END_RESPONSE; break; default: jk_log(l, JK_LOG_ERROR, Invalid code: %d\n, code); JK_TRACE_EXIT(l); return JK_AJP13_ERROR; } JK_TRACE_EXIT(l); return JK_AJP13_NO_RESPONSE; }