You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by co...@apache.org on 2002/06/19 20:24:49 UTC
cvs commit: jakarta-tomcat-connectors/jk/java/org/apache/jk/server JkCoyoteHandler.java
costin 2002/06/19 11:24:49
Modified: jk/java/org/apache/jk/common JkInputStream.java MsgAjp.java
jk/java/org/apache/jk/core MsgContext.java
jk/java/org/apache/jk/server JkCoyoteHandler.java
Log:
- Reduce debugging on JkInputStream.
- dump the buffer in case of overflow
- Add a 'status' to the msgContext. This can be used by the protocol - in particular
we need it to detect double CLOSE. The problem is that Response.finish() is called
by forward(), and it'll close the response ( XXX need to block any write after
that too )
- If the data is larger than the buffer size, chunk it ( seen with soap, where
a direct write() is used with a very large buffer, most of the time we use
writers and that goes through OutputBuffers )
Revision Changes Path
1.9 +2 -1 jakarta-tomcat-connectors/jk/java/org/apache/jk/common/JkInputStream.java
Index: JkInputStream.java
===================================================================
RCS file: /home/cvs/jakarta-tomcat-connectors/jk/java/org/apache/jk/common/JkInputStream.java,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- JkInputStream.java 11 Jun 2002 00:13:48 -0000 1.8
+++ JkInputStream.java 19 Jun 2002 18:24:49 -0000 1.9
@@ -271,7 +271,8 @@
}
public int doRead(ByteChunk responseChunk ) throws IOException {
- log.info( "doRead " + pos + " " + blen + " " + available + " " + end_of_stream);
+ if( log.isDebugEnabled())
+ log.debug( "doRead " + pos + " " + blen + " " + available + " " + end_of_stream);
if( blen == pos ) {
refillReadBuffer();
}
1.10 +2 -1 jakarta-tomcat-connectors/jk/java/org/apache/jk/common/MsgAjp.java
Index: MsgAjp.java
===================================================================
RCS file: /home/cvs/jakarta-tomcat-connectors/jk/java/org/apache/jk/common/MsgAjp.java,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -r1.9 -r1.10
--- MsgAjp.java 11 Jun 2002 22:48:46 -0000 1.9
+++ MsgAjp.java 19 Jun 2002 18:24:49 -0000 1.10
@@ -210,8 +210,9 @@
*/
public void appendBytes( byte b[], int off, int numBytes ) {
if( pos + numBytes >= buf.length ) {
- log.error( "Buffer overflow buf.len" + buf.length + " pos=" +
+ log.error( "Buffer overflow buf.len=" + buf.length + " pos=" +
pos + " data=" + numBytes );
+ dump("Overflow");
return;
}
appendInt( numBytes );
1.4 +9 -0 jakarta-tomcat-connectors/jk/java/org/apache/jk/core/MsgContext.java
Index: MsgContext.java
===================================================================
RCS file: /home/cvs/jakarta-tomcat-connectors/jk/java/org/apache/jk/core/MsgContext.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- MsgContext.java 17 Apr 2002 22:32:45 -0000 1.3
+++ MsgContext.java 19 Jun 2002 18:24:49 -0000 1.4
@@ -88,6 +88,7 @@
private Object req;
private WorkerEnv wEnv;
private Msg msgs[]=new Msg[10];
+ private int status=0;
// The context can be used by JNI components as well
private long jkEndpointP;
@@ -128,6 +129,14 @@
this.source=ch;
}
+ public final int getStatus() {
+ return status;
+ }
+
+ public final void setStatus( int s ) {
+ status=s;
+ }
+
public final JkHandler getNext() {
return next;
}
1.23 +37 -9 jakarta-tomcat-connectors/jk/java/org/apache/jk/server/JkCoyoteHandler.java
Index: JkCoyoteHandler.java
===================================================================
RCS file: /home/cvs/jakarta-tomcat-connectors/jk/java/org/apache/jk/server/JkCoyoteHandler.java,v
retrieving revision 1.22
retrieving revision 1.23
diff -u -r1.22 -r1.23
--- JkCoyoteHandler.java 22 May 2002 23:52:13 -0000 1.22
+++ JkCoyoteHandler.java 19 Jun 2002 18:24:49 -0000 1.23
@@ -92,6 +92,10 @@
Adapter adapter;
protected JkMain jkMain=new JkMain();
+
+ public final int JK_STATUS_NEW=0;
+ public final int JK_STATUS_HEAD=1;
+ public final int JK_STATUS_CLOSED=2;
public void setProperty( String name, String value ) {
if( log.isDebugEnabled())
@@ -175,16 +179,30 @@
// set the filters accordingly.
res.sendHeaders();
}
- if( log.isDebugEnabled() ) log.debug("doWrite " );
MsgContext ep=(MsgContext)res.getNote( epNote );
-
+
MsgAjp msg=(MsgAjp)ep.getNote( headersMsgNote );
- msg.reset();
- msg.appendByte( HandlerRequest.JK_AJP13_SEND_BODY_CHUNK);
- msg.appendBytes( chunk.getBytes(), chunk.getOffset(), chunk.getLength() );
- ep.setType( JkHandler.HANDLE_SEND_PACKET );
- ep.getSource().invoke( msg, ep );
-
+
+ int len=chunk.getLength();
+ byte buf[]=msg.getBuffer();
+ // 3 - hardcoded, byte[] marshalling overhead
+ int chunkSize=buf.length - msg.getHeaderLength() - 3;
+ int off=0;
+ while( len > 0 ) {
+ int thisTime=len;
+ if( thisTime > chunkSize ) {
+ thisTime=chunkSize;
+ }
+ len-=thisTime;
+
+ msg.reset();
+ msg.appendByte( HandlerRequest.JK_AJP13_SEND_BODY_CHUNK);
+ if( log.isDebugEnabled() ) log.debug("doWrite " + off + " " + thisTime + " " + len );
+ msg.appendBytes( chunk.getBytes(), chunk.getOffset() + off, thisTime );
+ off+=thisTime;
+ ep.setType( JkHandler.HANDLE_SEND_PACKET );
+ ep.getSource().invoke( msg, ep );
+ }
return 0;
}
@@ -222,6 +240,7 @@
}
res.setNote( epNote, ep );
+ ep.setStatus( JK_STATUS_HEAD );
try {
adapter.service( req, res );
@@ -229,6 +248,8 @@
ex.printStackTrace();
}
+ ep.setStatus( JK_STATUS_NEW );
+
req.recycle();
res.recycle();
return OK;
@@ -297,10 +318,15 @@
ep.setType( JkHandler.HANDLE_FLUSH );
ep.getSource().invoke( null, ep );
} else if( actionCode==ActionCode.ACTION_CLOSE ) {
- if( log.isDebugEnabled() )
+ if( log.isDebugEnabled() ) {
log.debug("CLOSE " );
+ }
org.apache.coyote.Response res=(org.apache.coyote.Response)param;
MsgContext ep=(MsgContext)res.getNote( epNote );
+ if( ep.getStatus()== JK_STATUS_CLOSED ) {
+ // Double close - it may happen with forward
+ return;
+ }
MsgAjp msg=(MsgAjp)ep.getNote( headersMsgNote );
msg.reset();
@@ -312,6 +338,8 @@
ep.setType( JkHandler.HANDLE_FLUSH );
ep.getSource().invoke( msg, ep );
+
+ ep.setStatus(JK_STATUS_CLOSED );
} else if( actionCode==ActionCode.ACTION_REQ_SSL_ATTRIBUTE ) {
--
To unsubscribe, e-mail: <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>