You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by mt...@apache.org on 2004/02/28 09:12:43 UTC
cvs commit: jakarta-tomcat-connectors/jk/native2/server/isapi jk_service_iis.c
mturk 2004/02/28 00:12:43
Modified: jk/native2/server/isapi jk_service_iis.c
Log:
Fix the POST data reads, rewriting service->read.
The previous implementation was total mess, dealing with
negative numbers to see if we read past the contol buffer,
etc...
Revision Changes Path
1.27 +83 -49 jakarta-tomcat-connectors/jk/native2/server/isapi/jk_service_iis.c
Index: jk_service_iis.c
===================================================================
RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native2/server/isapi/jk_service_iis.c,v
retrieving revision 1.26
retrieving revision 1.27
diff -u -r1.26 -r1.27
--- jk_service_iis.c 24 Feb 2004 08:44:42 -0000 1.26
+++ jk_service_iis.c 28 Feb 2004 08:12:43 -0000 1.27
@@ -43,7 +43,7 @@
extern int send_groups;
static int JK_METHOD jk2_service_iis_head(jk_env_t *env, jk_ws_service_t *s ){
- static char crlf[3] = { (char)13, (char)10, '\0' };
+ static char crlf[3] = { '\r', '\n', '\0' };
const char *reason;
LPEXTENSION_CONTROL_BLOCK lpEcb=(LPEXTENSION_CONTROL_BLOCK)s->ws_private;
DWORD len_of_status;
@@ -124,66 +124,100 @@
}
static int JK_METHOD jk2_service_iis_read(jk_env_t *env, jk_ws_service_t *s,
- void *b, unsigned len, unsigned *actually_read)
+ void *b, unsigned int len,
+ unsigned int *actually_read)
{
+
env->l->jkLog(env, env->l, JK_LOG_DEBUG,
- "Into jk_ws_service_t::read\n");
+ "Into jk_ws_service_t::read\n");
- if (s && s->ws_private && b && actually_read) {
- LPEXTENSION_CONTROL_BLOCK lpEcb=(LPEXTENSION_CONTROL_BLOCK)s->ws_private;
+ *actually_read = 0;
+ if (!len) {
+ env->l->jkLog(env, env->l, JK_LOG_INFO,
+ "jk_ws_service_t::read, requested read length is zero\n");
+ return JK_OK;
+ }
+ if (s && s->ws_private && b) {
+ LPEXTENSION_CONTROL_BLOCK lpEcb = (LPEXTENSION_CONTROL_BLOCK)s->ws_private;
- *actually_read = 0;
- if ((s->content_read < (long)lpEcb->cbTotalBytes)&& !s->end_of_stream ){
- if (len) {
- char *buf = b;
- long already_read = (long)lpEcb->cbAvailable - s->content_read;
-
- if (already_read >= (long)len) {
- memcpy(buf, lpEcb->lpbData + s->content_read, len);
- *actually_read = len;
- } else {
- /*
- * Try to copy what we already have
- */
- if (already_read > 0) {
- memcpy(buf, lpEcb->lpbData + s->content_read, already_read);
- buf += already_read;
- len -= already_read;
-// s->content_read = lpEcb->cbAvailable;
-
- *actually_read = already_read;
- }
- if ((s->content_read+*actually_read)==lpEcb->cbTotalBytes) {
- s->end_of_stream=JK_TRUE;
- }
- /*
- * Now try to read from the client ...
- */
- if (!s->end_of_stream ) {
- if ( lpEcb->ReadClient(lpEcb->ConnID, buf, &len)) {
- *actually_read += len;
- } else {
- env->l->jkLog(env,env->l, JK_LOG_ERROR,
- "jk_ws_service_t::read, ReadClient failed\n");
- return JK_OK;
- }
- }
+ if (s->end_of_stream) {
+ env->l->jkLog(env, env->l, JK_LOG_INFO,
+ "jk_ws_service_t::read, end of stram allready reached\n");
+ return JK_OK;
+ }
+
+ if ((DWORD)s->content_read < lpEcb->cbTotalBytes) {
+ DWORD rdlen, toread = len;
+ LPBYTE buff = (LPBYTE)b;
+
+ /*
+ * Fix the read length in case the requested
+ * is larger then what's available
+ */
+ if (s->content_read + toread > lpEcb->cbTotalBytes)
+ toread = lpEcb->cbTotalBytes - s->content_read;
+ rdlen = toread;
+
+ /*
+ * First read the already sent data from the client
+ * No need to call the ReadClient fuction for the
+ * data held in the control buffer
+ */
+ if ((DWORD)s->content_read < lpEcb->cbAvailable) {
+ /* Read the avail buffer */
+ if (s->content_read + toread > lpEcb->cbAvailable)
+ toread = lpEcb->cbAvailable - s->content_read;
+ memcpy(buff, lpEcb->lpbData + s->content_read, toread);
+ *actually_read = toread;
+
+ /* if that's all what that server wants to read, return... */
+ if (toread == rdlen) {
+ env->l->jkLog(env, env->l, JK_LOG_DEBUG,
+ "jk_ws_service_t::read buffer readed %d from already %d of total %d bytes\n",
+ toread, s->content_read, lpEcb->cbAvailable);
+ return JK_OK;
+ }
+ else {
+ /* Adjust the read buffer and length */
+ rdlen -= toread;
+ buff += toread;
}
}
+
+ /*
+ * Now try to read from the client ...
+ */
+ if (lpEcb->ReadClient(lpEcb->ConnID, b, &rdlen)) {
+ *actually_read += rdlen;
+ env->l->jkLog(env, env->l, JK_LOG_DEBUG,
+ "jk_ws_service_t::read ReadClient readed %d (actually %d) bytes\n",
+ rdlen, *actually_read);
+
+ }
+ else {
+ env->l->jkLog(env,env->l, JK_LOG_ERROR,
+ "jk_ws_service_t::read, ReadClient failed\n");
+ /* XXX: We should return here HSE_STATUS_ERROR */
+ return JK_OK;
+ }
}
- if ((s->content_read+*actually_read)==lpEcb->cbTotalBytes) {
- s->end_of_stream=JK_TRUE;
+ env->l->jkLog(env, env->l, JK_LOG_DEBUG,
+ "jk_ws_service_t::read actually readed %d from already %d of total %d bytes\n",
+ *actually_read, s->content_read, lpEcb->cbTotalBytes);
+ if ((s->content_read + *actually_read) == lpEcb->cbTotalBytes) {
+ s->end_of_stream = JK_TRUE;
}
return JK_OK;
}
-
- env->l->jkLog(env, env->l, JK_LOG_ERROR,
- "jk_ws_service_t::read, NULL parameters\n");
- return JK_ERR;
+ else {
+ env->l->jkLog(env, env->l, JK_LOG_ERROR,
+ "jk_ws_service_t::read, NULL parameters\n");
+ return JK_ERR;
+ }
}
static int JK_METHOD jk2_service_iis_write(jk_env_t *env, jk_ws_service_t *s,
- const void *b, unsigned len)
+ const void *b, unsigned int len)
{
env->l->jkLog(env, env->l, JK_LOG_DEBUG,
"Into jk_ws_service_t::write\n");
@@ -192,7 +226,7 @@
LPEXTENSION_CONTROL_BLOCK lpEcb=(LPEXTENSION_CONTROL_BLOCK)s->ws_private;
if (len) {
- unsigned written = 0;
+ unsigned int written = 0;
char *buf = (char *)b;
if (!s->response_started) {
---------------------------------------------------------------------
To unsubscribe, e-mail: tomcat-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: tomcat-dev-help@jakarta.apache.org