billbarker    2005/02/02 19:36:57

  Modified:    jk/java/org/apache/jk/server JkCoyoteHandler.java
  Log:
  Cleanup exception handling in action, and remember error state so that we can 
close the connection without having to attempt another read.
  
  Fix for Bug #33374
  Reported By: Lars George [EMAIL PROTECTED]
  
  Revision  Changes    Path
  1.59      +112 -90   
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.58
  retrieving revision 1.59
  diff -u -r1.58 -r1.59
  --- JkCoyoteHandler.java      11 Jan 2005 13:37:45 -0000      1.58
  +++ JkCoyoteHandler.java      3 Feb 2005 03:36:57 -0000       1.59
  @@ -96,6 +96,7 @@
       public final int JK_STATUS_NEW=0;
       public final int JK_STATUS_HEAD=1;
       public final int JK_STATUS_CLOSED=2;
  +    public final int JK_STATUS_ERROR=3;
   
       /** Set a property. Name is a "component.property". JMX should
        * be used instead.
  @@ -311,11 +312,13 @@
               res.finish();
           }
   
  -        ep.setStatus( JK_STATUS_NEW );
  -
           req.recycle();
           req.updateCounters();
           res.recycle();
  +        if( ep.getStatus() == JK_STATUS_ERROR ) {
  +            return ERROR;
  +        }
  +        ep.setStatus( JK_STATUS_NEW );
        rp.setStage(Constants.STAGE_KEEPALIVE);
           return OK;
       }
  @@ -410,106 +413,125 @@
       // -------------------- Coyote Action implementation --------------------
       
       public void action(ActionCode actionCode, Object param) {
  -        try {
  -            if( actionCode==ActionCode.ACTION_COMMIT ) {
  -                if( log.isDebugEnabled() ) log.debug("COMMIT " );
  -                org.apache.coyote.Response 
res=(org.apache.coyote.Response)param;
  -
  -                if(  res.isCommitted() ) {
  -                    if( log.isInfoEnabled() )
  -                        log.info("Response already commited " );
  -                } else {
  +        if( actionCode==ActionCode.ACTION_COMMIT ) {
  +            if( log.isDebugEnabled() ) log.debug("COMMIT " );
  +            org.apache.coyote.Response res=(org.apache.coyote.Response)param;
  +
  +            if(  res.isCommitted() ) {
  +                if( log.isInfoEnabled() )
  +                    log.info("Response already commited " );
  +            } else {
  +                try {
                       appendHead( res );
  +                } catch(IOException iex) {
  +                    log.warn("Unable to send headers",iex);
  +                    MsgContext ep=(MsgContext)res.getNote( epNote );
  +                    ep.setStatus(JK_STATUS_ERROR);
                   }
  -            } else if( actionCode==ActionCode.ACTION_RESET ) {
  -                if( log.isDebugEnabled() )
  -                    log.debug("RESET " );
  -
  -            } else if( actionCode==ActionCode.ACTION_CLIENT_FLUSH ) {
  -                if( log.isDebugEnabled() ) log.debug("CLIENT_FLUSH " );
  -                org.apache.coyote.Response 
res=(org.apache.coyote.Response)param;
  -                MsgContext ep=(MsgContext)res.getNote( epNote );
  -                ep.setType( JkHandler.HANDLE_FLUSH );
  +            }
  +        } else if( actionCode==ActionCode.ACTION_RESET ) {
  +            if( log.isDebugEnabled() )
  +                log.debug("RESET " );
  +            
  +        } else if( actionCode==ActionCode.ACTION_CLIENT_FLUSH ) {
  +            if( log.isDebugEnabled() ) log.debug("CLIENT_FLUSH " );
  +            org.apache.coyote.Response res=(org.apache.coyote.Response)param;
  +            MsgContext ep=(MsgContext)res.getNote( epNote );
  +            ep.setType( JkHandler.HANDLE_FLUSH );
  +            try {
                   ep.getSource().flush( null, ep );
  -                
  -            } else if( actionCode==ActionCode.ACTION_CLOSE ) {
  -                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 
  -                    if( log.isDebugEnabled() ) log.debug("Double CLOSE - 
forward ? " + res.getRequest().requestURI() );
  -                    return;
  -                }
  +            } catch(IOException iex) {
  +                // This is logged elsewhere, so debug only here
  +                log.debug("Error during flush",iex);
  +                res.setErrorException(iex);
  +                ep.setStatus(JK_STATUS_ERROR);
  +            }
  +            
  +        } else if( actionCode==ActionCode.ACTION_CLOSE ) {
  +            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 
  +                if( log.isDebugEnabled() ) log.debug("Double CLOSE - forward 
? " + res.getRequest().requestURI() );
  +                return;
  +            }
                    
  -                if( !res.isCommitted() )
  -                    this.action( ActionCode.ACTION_COMMIT, param );
  -                
  -                MsgAjp msg=(MsgAjp)ep.getNote( headersMsgNote );
  -                msg.reset();
  -                msg.appendByte( HandlerRequest.JK_AJP13_END_RESPONSE );
  -                msg.appendByte( 1 );
  -
  -                try {                
  -                    ep.setType( JkHandler.HANDLE_SEND_PACKET );
  -                    ep.getSource().send( msg, ep );
  +            if( !res.isCommitted() )
  +                this.action( ActionCode.ACTION_COMMIT, param );
  +            
  +            MsgAjp msg=(MsgAjp)ep.getNote( headersMsgNote );
  +            msg.reset();
  +            msg.appendByte( HandlerRequest.JK_AJP13_END_RESPONSE );
  +            msg.appendByte( 1 );
   
  -                    ep.setType( JkHandler.HANDLE_FLUSH );
  -                    ep.getSource().flush( msg, ep );
  -                } catch(IOException iex) {
  -                    log.debug("Connection error ending request.",iex);
  -                }
  +            try {                
  +                ep.setType( JkHandler.HANDLE_SEND_PACKET );
  +                ep.getSource().send( msg, ep );
  +                
  +                ep.setType( JkHandler.HANDLE_FLUSH );
  +                ep.getSource().flush( msg, ep );
  +            } catch(IOException iex) {
  +                log.debug("Connection error ending request.",iex);
  +                ep.setStatus(JK_STATUS_ERROR);
  +            }
  +            if(ep.getStatus() != JK_STATUS_ERROR) {
                   ep.setStatus(JK_STATUS_CLOSED );
  +            }
   
  -                if( logTime.isDebugEnabled() ) 
  -                    logTime(res.getRequest(), res);
  -            } else if( actionCode==ActionCode.ACTION_REQ_SSL_ATTRIBUTE ) {
  -                org.apache.coyote.Request 
req=(org.apache.coyote.Request)param;
  -
  -                // Extract SSL certificate information (if requested)
  -                MessageBytes certString = 
(MessageBytes)req.getNote(WorkerEnv.SSL_CERT_NOTE);
  -                if( certString != null && !certString.isNull() ) {
  -                    ByteChunk certData = certString.getByteChunk();
  -                    ByteArrayInputStream bais = 
  -                        new ByteArrayInputStream(certData.getBytes(),
  -                                                 certData.getStart(),
  -                                                 certData.getLength());
  - 
  -                    // Fill the first element.
  -                    X509Certificate jsseCerts[] = null;
  -                    try {
  -                        CertificateFactory cf =
  -                            CertificateFactory.getInstance("X.509");
  -                        X509Certificate cert = (X509Certificate)
  -                            cf.generateCertificate(bais);
  -                        jsseCerts =  new X509Certificate[1];
  -                        jsseCerts[0] = cert;
  -                    } catch(java.security.cert.CertificateException e) {
  -                        log.error("Certificate convertion failed" , e );
  -                        return;
  -                    }
  +            if( logTime.isDebugEnabled() ) 
  +                logTime(res.getRequest(), res);
  +        } else if( actionCode==ActionCode.ACTION_REQ_SSL_ATTRIBUTE ) {
  +            org.apache.coyote.Request req=(org.apache.coyote.Request)param;
  +
  +            // Extract SSL certificate information (if requested)
  +            MessageBytes certString = 
(MessageBytes)req.getNote(WorkerEnv.SSL_CERT_NOTE);
  +            if( certString != null && !certString.isNull() ) {
  +                ByteChunk certData = certString.getByteChunk();
  +                ByteArrayInputStream bais = 
  +                    new ByteArrayInputStream(certData.getBytes(),
  +                                             certData.getStart(),
  +                                             certData.getLength());
    
  -                    req.setAttribute(SSLSupport.CERTIFICATE_KEY, 
  -                                     jsseCerts);
  +                // Fill the first element.
  +                X509Certificate jsseCerts[] = null;
  +                try {
  +                    CertificateFactory cf =
  +                        CertificateFactory.getInstance("X.509");
  +                    X509Certificate cert = (X509Certificate)
  +                        cf.generateCertificate(bais);
  +                    jsseCerts =  new X509Certificate[1];
  +                    jsseCerts[0] = cert;
  +                } catch(java.security.cert.CertificateException e) {
  +                    log.error("Certificate convertion failed" , e );
  +                    return;
                   }
  + 
  +                req.setAttribute(SSLSupport.CERTIFICATE_KEY, 
  +                                 jsseCerts);
  +            }
                   
  -            } else if( actionCode==ActionCode.ACTION_REQ_HOST_ATTRIBUTE ) {
  -                org.apache.coyote.Request 
req=(org.apache.coyote.Request)param;
  +        } else if( actionCode==ActionCode.ACTION_REQ_HOST_ATTRIBUTE ) {
  +            org.apache.coyote.Request req=(org.apache.coyote.Request)param;
   
  -                             // If remoteHost not set by JK, get it's name 
from it's remoteAddr
  -             if( req.remoteHost().isNull())
  -                     
req.remoteHost().setString(InetAddress.getByName(req.remoteAddr().toString()).getHostName());
  -
  -            // } else if( actionCode==ActionCode.ACTION_POST_REQUEST ) {
  -
  -            } else if( actionCode==ActionCode.ACTION_ACK ) {
  -                if( log.isDebugEnabled() )
  -                    log.debug("ACK " );
  -                // What should we do here ? Who calls it ? 
  +            // If remoteHost not set by JK, get it's name from it's 
remoteAddr
  +            if( req.remoteHost().isNull()) {
  +                try {
  +                    req.remoteHost().setString(InetAddress.getByName(
  +                                               req.remoteAddr().toString()).
  +                                               getHostName());
  +                } catch(IOException iex) {
  +                    if(log.isDebugEnabled())
  +                        log.debug("Unable to resolve "+req.remoteAddr());
  +                }
               }
  -        } catch( Exception ex ) {
  -            log.error( "Error in action code ", ex );
  +        // } else if( actionCode==ActionCode.ACTION_POST_REQUEST ) {
  +
  +        } else if( actionCode==ActionCode.ACTION_ACK ) {
  +            if( log.isDebugEnabled() )
  +                log.debug("ACK " );
  +            // What should we do here ? Who calls it ? 
           }
       }
   
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to