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>