costin      01/01/06 16:17:06

  Modified:    src/share/org/apache/tomcat/modules/generators
                        ErrorHandler.java
  Log:
  - Added showDebugInfo property to the ErrorHandler module - it'll act as default
  ( explicit properties are easier to document, and it's better to set the properties
  on the module if it's specific to the module )
  
  - Bug fix: the buffer will be reset before displaying the exception, even for
  the default handler. It shouldn't be any distinction between the "default" error
  handler and a user-defined handler, and this helps if the buffer may have
  garbage ( open tags, etc ).
  
  - Bug fix: reset the exception state before calling the error servlet. This prevent
  the display of "error in the error handler"
  
  - Bug fix: if( ! (ex instanceof ... ) -> if( ex!=null && ! ( ex instanceof ... )
  
  - Bug fix: add the <head>, <body>, etc only if the buffere is "clean". The previous
  test ( getBytesWritten() ) was bad, the correct test is "isNew()" ( because both
  chars and bytes can be written to the buffer ).
  
  Revision  Changes    Path
  1.3       +43 -19    
jakarta-tomcat/src/share/org/apache/tomcat/modules/generators/ErrorHandler.java
  
  Index: ErrorHandler.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/modules/generators/ErrorHandler.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- ErrorHandler.java 2001/01/01 02:07:24     1.2
  +++ ErrorHandler.java 2001/01/07 00:17:06     1.3
  @@ -77,10 +77,15 @@
    */
   public final class ErrorHandler extends BaseInterceptor {
       private Context rootContext=null;
  +    boolean showDebugInfo=true;
       
       public ErrorHandler() {
       }
   
  +    public void setShowDebugInfo( boolean b ) {
  +     showDebugInfo=b;
  +    }
  +
       public void engineInit( ContextManager cm )
        throws TomcatException
       {
  @@ -98,7 +103,7 @@
       {
        if( ctx.getHost() == null && ctx.getPath().equals(""))
            rootContext = ctx;
  -     boolean showDebugInfo=true;
  +
        ContextManager cm=ctx.getContextManager();
        String dI=cm.getProperty( "showDebugInfo" );
        if( dI!=null && ( dI.equalsIgnoreCase("no") ||
  @@ -185,7 +190,12 @@
            return;
        }
   
  -     if (!isDefaultHandler && !res.isBufferCommitted())
  +     // XXX The original code didn't reset the buffer if
  +     // isDefaultHandler :   if (!isDefaultHandler && ...
  +     // Is there any reason for that ?
  +     // I also think we should reset the buffer anyway, to get
  +     // in a stable state - even if the buffer is commited
  +     if ( !res.isBufferCommitted())
            res.resetBuffer();
   
        req.setAttribute("javax.servlet.error.status_code",new Integer( code));
  @@ -194,6 +204,8 @@
        if( debug>0 )
            ctx.log( "Handler " + errorServlet + " " + errorPath);
   
  +     // reset error exception
  +     res.setErrorException( null );
        errorServlet.service( req, res );
        Exception ex=res.getErrorException();
        if( ex!=null && ! (ex instanceof IOException) ) {
  @@ -281,8 +293,14 @@
            ctx.log( "Handler errorServlet is null! errorPath:" + errorPath);
            return;
        }
  +
   
  -     if (!isDefaultHandler && !res.isBufferCommitted())
  +     // XXX The original code didn't reset the buffer if
  +     // isDefaultHandler :   if (!isDefaultHandler && ...
  +     // Is there any reason for that ?
  +     // I also think we should reset the buffer anyway, to get
  +     // in a stable state - even if the buffer is commited
  +     if ( !res.isBufferCommitted())
            res.resetBuffer();
   
        req.setAttribute("javax.servlet.error.exception_type", t.getClass());
  @@ -294,14 +312,16 @@
        if( debug>0 )
            ctx.log( "Handler " + errorServlet + " " + errorPath);
   
  +     // reset error exception
  +     res.setErrorException( null );
        errorServlet.service( req, res );
        Exception ex=res.getErrorException();
  -     if( ! (ex instanceof IOException) ) {
  +     if( ex!=null && ! (ex instanceof IOException) ) {
            // we can ignore IOException - probably the user
            // has clicked "STOP"
            // we need to log any other error - something may be
            // broken if the error servlet has errors.
  -         ctx.log( "Error in errorServlet", ex);
  +         ctx.log( "Error in errorServlet: ", ex);
        } 
       }
   
  @@ -379,9 +399,9 @@
            req.setNote( sbNote, buf );
        }
        
  -     boolean bufReset = (res.getBuffer().getBytesWritten() == 0);
  +     boolean needsHead = res.getBuffer().isNew();
        // only include <head>...<body> if reset was successful
  -     if (bufReset) {
  +     if (needsHead) {
            buf.append("<head><title>")
                .append(sm.getString("defaulterrorpage.notfound404"))
                .append("</title></head>\r\n<body>");
  @@ -402,7 +422,7 @@
        }
   
        // only add </body> if reset was successful
  -     if ( bufReset )
  +     if ( needsHead )
            buf.append("</body>");
        buf.append("\r\n");
   
  @@ -435,16 +455,16 @@
        Throwable e= (Throwable)req.
            getAttribute("tomcat.servlet.error.throwable");
        if( e==null ) {
  -         log("Exception handler called without an exception", new 
Throwable("trace"));
  +         log("Exception handler called without an exception",
  +             new Throwable("trace"));
            return;
        }
   
  -     res.setContentType("text/html");
  -     res.setStatus( 500 );
        
        if( sbNote==0 ) {
  -         sbNote=req.getContextManager().getNoteId(ContextManager.REQUEST_NOTE,
  -                                                  "ExceptionHandler.buff");
  +         sbNote=req.getContextManager().
  +             getNoteId(ContextManager.REQUEST_NOTE,
  +                       "ExceptionHandler.buff");
        }
   
        // we can recycle it because
  @@ -455,9 +475,13 @@
            req.setNote( sbNote, buf );
        }
   
  -     boolean bufReset = (res.getBuffer().getBytesWritten() == 0);
  +     boolean needsHead = res.getBuffer().isNew();
  +
        // only include <head>...<body> if reset was successful
  -     if (bufReset) {
  +     if ( needsHead ) {
  +         res.setContentType("text/html");
  +         res.setStatus( 500 );
  +     
            buf.append("<head><title>");
            if( null != errorURI && showDebugInfo ) {
                buf.append(sm.getString("defaulterrorpage.includedservlet") )
  @@ -509,7 +533,7 @@
        }
   
        // only add </body> if reset was successful
  -     if ( bufReset )
  +     if (  needsHead )
            buf.append("</body>");
        buf.append("\r\n");
        
  @@ -557,9 +581,9 @@
            req.setNote( sbNote, buf );
        }
   
  -     boolean bufReset = (res.getBuffer().getBytesWritten() == 0);
  +     boolean needsHead = res.getBuffer().isNew();
        // only include <head>...<body> if reset was successful
  -     if (bufReset) {
  +     if (needsHead) {
            buf.append("<head><title>");
            if( null != errorURI && showDebugInfo ) {
                buf.append(sm.getString("defaulterrorpage.includedservlet") )
  @@ -615,7 +639,7 @@
        }
   
        // only add </body> if reset was successful
  -     if ( bufReset )
  +     if ( needsHead )
            buf.append("</body>");
        buf.append("\r\n");
   
  
  
  

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

Reply via email to