You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ke...@apache.org on 2001/09/10 20:32:36 UTC
cvs commit: jakarta-tomcat-connectors/jk/native/common jk_ajp_common.c jk_service.h jk_util.c
keith 01/09/10 11:32:36
Modified: jk/java/org/apache/ajp Ajp13.java
jk/native/apache-1.3 mod_jk.c
jk/native/common jk_ajp_common.c jk_service.h jk_util.c
Log:
Port chunked encoding input support from jakarta-tomcat ajp13.
Revision Changes Path
1.10 +19 -5 jakarta-tomcat-connectors/jk/java/org/apache/ajp/Ajp13.java
Index: Ajp13.java
===================================================================
RCS file: /home/cvs/jakarta-tomcat-connectors/jk/java/org/apache/ajp/Ajp13.java,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -r1.9 -r1.10
--- Ajp13.java 2001/08/27 15:33:04 1.9
+++ Ajp13.java 2001/09/10 18:32:36 1.10
@@ -209,7 +209,9 @@
byte []bodyBuff = new byte[MAX_READ_SIZE];
int blen; // Length of current chunk of body data in buffer
- int pos; // Current read position within that buffer
+ int pos; // Current read position within that buffer
+
+ boolean end_of_stream; // true if we've received an empty packet
public Ajp13() {
super();
@@ -231,7 +233,8 @@
// This is a touch cargo-cultish, but I think wise.
blen = 0;
- pos = 0;
+ pos = 0;
+ end_of_stream = false;
}
/**
@@ -437,7 +440,7 @@
// Check to see if there should be a body packet coming along
// immediately after
- if(req.getContentLength() > 0) {
+ if(req.getContentLength() != 0) {
/* Read present data */
int err = receive(inBuf);
@@ -522,7 +525,7 @@
return len;
}
- // Not enough data (blen < pos + len)
+ // Not enough data (blen < pos + len) or chunked encoded
int toCopy = len;
while(toCopy > 0) {
int bytesRemaining = blen - pos;
@@ -559,7 +562,10 @@
}
// If the server returns an empty packet, assume that that end of
- // the stream has been reached (yuck -- fix protocol??).
+ // the stream has been reached (yuck -- fix protocol??).
+ if (end_of_stream) {
+ return false;
+ }
// Why not use outBuf??
inBuf.reset();
@@ -572,6 +578,14 @@
throw new IOException();
}
+ // No data received.
+ if( inBuf.getLen() == 0 ) {
+ pos=0;
+ blen=0;
+ end_of_stream = true;
+ return false;
+ }
+
blen = inBuf.peekInt();
pos = 0;
inBuf.getBytes(bodyBuff);
1.14 +23 -10 jakarta-tomcat-connectors/jk/native/apache-1.3/mod_jk.c
Index: mod_jk.c
===================================================================
RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native/apache-1.3/mod_jk.c,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -r1.13 -r1.14
--- mod_jk.c 2001/09/04 13:04:03 1.13
+++ mod_jk.c 2001/09/10 18:32:36 1.14
@@ -275,15 +275,18 @@
if(s && s->ws_private && b && actually_read) {
apache_private_data_t *p = s->ws_private;
if(!p->read_body_started) {
- if(!ap_setup_client_block(p->r, REQUEST_CHUNKED_DECHUNK)) {
- if(ap_should_client_block(p->r)) {
- p->read_body_started = JK_TRUE;
- }
+ if(ap_should_client_block(p->r)) {
+ p->read_body_started = JK_TRUE;
}
}
- if(p->read_body_started) {
- *actually_read = ap_get_client_block(p->r, b, len);
+ if(p->read_body_started) {
+ long rv;
+ if ((rv = ap_get_client_block(p->r, b, len)) < 0) {
+ *actually_read = 0;
+ } else {
+ *actually_read = (unsigned) rv;
+ }
return JK_TRUE;
}
}
@@ -457,7 +460,9 @@
s->server_software = (char *)ap_get_server_version();
s->method = (char *)r->method;
- s->content_length = get_content_length(r);
+ s->content_length = get_content_length(r);
+ s->is_chunked = r->read_chunked;
+ s->no_more_chunks = 0;
s->query_string = r->args;
/*
@@ -945,10 +950,17 @@
{
/* Retrieve the worker name stored by jk_translate() */
const char *worker_name = ap_table_get(r->notes, JK_WORKER_ID);
+ int rc;
if(r->proxyreq) {
return HTTP_INTERNAL_SERVER_ERROR;
- }
+ }
+
+
+ /* Set up r->read_chunked flags for chunked encoding, if present */
+ if(rc = ap_setup_client_block(r, REQUEST_CHUNKED_DECHUNK)) {
+ return rc;
+ }
if(worker_name) {
jk_server_conf_t *conf =
@@ -978,7 +990,8 @@
int is_recoverable_error = JK_FALSE;
rc = end->service(end, &s, l, &is_recoverable_error);
- if (s.content_read < s.content_length) {
+ if (s.content_read < s.content_length ||
+ (s.is_chunked && ! s.no_more_chunks)) {
/*
* If the servlet engine didn't consume all of the
* request data, consume and discard all further
1.9 +35 -15 jakarta-tomcat-connectors/jk/native/common/jk_ajp_common.c
Index: jk_ajp_common.c
===================================================================
RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native/common/jk_ajp_common.c,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- jk_ajp_common.c 2001/08/27 15:33:04 1.8
+++ jk_ajp_common.c 2001/09/10 18:32:36 1.9
@@ -687,6 +687,10 @@
unsigned len)
{
unsigned rdlen = 0;
+
+ if (s->is_chunked && s->no_more_chunks) {
+ return 0;
+ }
while(rdlen < len) {
unsigned this_time = 0;
@@ -695,6 +699,9 @@
}
if(0 == this_time) {
+ if (s->is_chunked) {
+ s->no_more_chunks = 1; /* read no more */
+ }
break;
}
rdlen += this_time;
@@ -705,13 +712,14 @@
/*
- * Read data from AJP13/AJP14 protocol
+ * Read data from AJP13/AJP14 protocol
+ * Returns -1 on error, else number of bytes read
*/
static int ajp_read_into_msg_buff(ajp_endpoint_t *ae,
jk_ws_service_t *r,
jk_msg_buf_t *msg,
- unsigned len,
+ unsigned len,
jk_logger_t *l)
{
unsigned char *read_buf = jk_b_get_buff(msg);
@@ -721,21 +729,33 @@
read_buf += AJP_HEADER_LEN; /* leave some space for the buffer headers */
read_buf += AJP_HEADER_SZ_LEN; /* leave some space for the read length */
- if (ajp_read_fully_from_server(r, read_buf, len) < 0) {
+ /* Pick the max size since we don't know the content_length */
+ if (r->is_chunked && len == 0) {
+ len = AJP13_MAX_SEND_BODY_SZ;
+ }
+
+ if ((len = ajp_read_fully_from_server(r, read_buf, len)) < 0) {
jk_log(l, JK_LOG_ERROR, "ajp_read_into_msg_buff: Error - ajp_read_fully_from_server failed\n");
- return JK_FALSE;
+ return -1;
}
-
- ae->left_bytes_to_send -= len;
-
- if(0 != jk_b_append_int(msg, (unsigned short)len)) {
- jk_log(l, JK_LOG_ERROR, "ajp_read_into_msg_buff: Error - jk_b_append_int failed\n");
- return JK_FALSE;
+
+ if (!r->is_chunked) {
+ ae->left_bytes_to_send -= len;
+ }
+
+ if (len > 0) {
+ /* Recipient recognizes empty packet as end of stream, not
+ an empty body packet */
+ 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 -1;
+ }
}
jk_b_set_len(msg, jk_b_get_len(msg) + len);
- return JK_TRUE;
+ return len;
}
@@ -817,11 +837,11 @@
* for resend if the remote Tomcat is down, a fact we will learn only
* doing a read (not yet)
*/
- if (ae->left_bytes_to_send > 0) {
+ if (s->is_chunked || ae->left_bytes_to_send > 0) {
unsigned len = ae->left_bytes_to_send;
if (len > AJP13_MAX_SEND_BODY_SZ)
len = AJP13_MAX_SEND_BODY_SZ;
- if (! ajp_read_into_msg_buff(ae, s, op->post, len, l)) {
+ if ((len = ajp_read_into_msg_buff(ae, s, op->post, len, l)) < 0) {
/* the browser stop sending data, no need to recover */
op->recoverable = JK_FALSE;
return JK_FALSE;
@@ -893,7 +913,7 @@
}
/* the right place to add file storage for upload */
- if (ajp_read_into_msg_buff(ae, r, msg, len, l)) {
+ if ((len = ajp_read_into_msg_buff(ae, r, msg, len, l)) >= 0) {
r->content_read += len;
return JK_AJP13_HAS_RESPONSE;
}
1.8 +5 -3 jakarta-tomcat-connectors/jk/native/common/jk_service.h
Index: jk_service.h
===================================================================
RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native/common/jk_service.h,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- jk_service.h 2001/07/03 21:56:48 1.7
+++ jk_service.h 2001/09/10 18:32:36 1.8
@@ -169,8 +169,10 @@
unsigned server_port;
char *server_software;
unsigned content_length; /* integer that represents the content */
- /* length should be 0 if unknown. */
- unsigned content_read;
+ /* length should be 0 if unknown. */
+ unsigned is_chunked; /* 1 if content length is unknown (chunked rq) */
+ unsigned no_more_chunks; /* 1 if last chunk has been read */
+ unsigned content_read; /* number of bytes read */
/*
* SSL information
1.7 +4 -2 jakarta-tomcat-connectors/jk/native/common/jk_util.c
Index: jk_util.c
===================================================================
RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native/common/jk_util.c,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- jk_util.c 2001/09/05 17:05:23 1.6
+++ jk_util.c 2001/09/10 18:32:36 1.7
@@ -749,7 +749,9 @@
s->server_name = NULL;
s->server_port = 80;
s->server_software = NULL;
- s->content_length = 0;
+ s->content_length = 0;
+ s->is_chunked = 0;
+ s->no_more_chunks = 0;
s->content_read = 0;
s->is_ssl = JK_FALSE;
s->ssl_cert = NULL;