kinman      01/12/11 17:19:35

  Modified:    jasper/src/share/org/apache/jasper/compiler JspReader.java
               jasper/src/share/org/apache/jasper/runtime
                        PageContextImpl.java
  Log:
  PR: 5345
  
  - This bug is caused by the recent change in response.sendRedirect in catalina
    that (correctly) enforces the rule that the response object is closed
    after a call to sendRedirect and subsequent write or flush throws an
    IllegalStateException.
  
    There is no real fix to this problem except by changing the semantics of
    sendRedirect in the Servlet spec to not to return after the call.  Since
    Jasper has no ideas that response.sendRedirect has been called, it cannot
    generate code to skip the rest of the page.
  
    Thus I take the position that it is an user error to include any text
    after the call to sendRedirect.  I did fixed the reader to ignore the
    extra '\n' that got generated automatically by the IO reader.
  
    I also put a check in PageContext.release not to flush the buffer
    if the response object has been close.  This would enable the user page
    to behave as expected, as long as the page is buffered, or the bufer
    size is not exceeded.
  
  Revision  Changes    Path
  1.7       +7 -1      
jakarta-tomcat-4.0/jasper/src/share/org/apache/jasper/compiler/JspReader.java
  
  Index: JspReader.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat-4.0/jasper/src/share/org/apache/jasper/compiler/JspReader.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- JspReader.java    2001/06/02 18:44:45     1.6
  +++ JspReader.java    2001/12/12 01:19:35     1.7
  @@ -332,7 +332,13 @@
       */
   
       public boolean hasMoreInput() throws ParseException {
  -     if (current.cursor >= current.stream.length) {
  +     // An extra '\n' seems to be inserted when there is none at end of
  +     // a file.  Not only is this useless, but it causes problems when
  +     // none is expected (e.g. after response.sendRedirect() ).
  +
  +     if (current.cursor >= current.stream.length ||
  +             ((current.cursor == current.stream.length - 1) &&
  +                     (peekChar() == '\n'))) {
               if (singleFile) return false; 
            while (popFile()) {
                if (current.cursor < current.stream.length) return true;
  
  
  
  1.15      +14 -10    
jakarta-tomcat-4.0/jasper/src/share/org/apache/jasper/runtime/PageContextImpl.java
  
  Index: PageContextImpl.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat-4.0/jasper/src/share/org/apache/jasper/runtime/PageContextImpl.java,v
  retrieving revision 1.14
  retrieving revision 1.15
  diff -u -r1.14 -r1.15
  --- PageContextImpl.java      2001/12/05 00:19:18     1.14
  +++ PageContextImpl.java      2001/12/12 01:19:35     1.15
  @@ -1,7 +1,7 @@
   /*
  - * $Header: 
/home/cvs/jakarta-tomcat-4.0/jasper/src/share/org/apache/jasper/runtime/PageContextImpl.java,v
 1.14 2001/12/05 00:19:18 kinman Exp $
  - * $Revision: 1.14 $
  - * $Date: 2001/12/05 00:19:18 $
  + * $Header: 
/home/cvs/jakarta-tomcat-4.0/jasper/src/share/org/apache/jasper/runtime/PageContextImpl.java,v
 1.15 2001/12/12 01:19:35 kinman Exp $
  + * $Revision: 1.15 $
  + * $Date: 2001/12/12 01:19:35 $
    *
    * ====================================================================
    *
  @@ -169,14 +169,18 @@
       }
   
       public void release() {
  -     try {
  -         if (isIncluded) {
  -             ((JspWriterImpl)out).flushBuffer(); // push it into the including 
jspWriter
  -         } else {
  -             out.flush();
  +     // Flush the out stream only if the response is not committed.
  +     if (! response.isCommitted()) {
  +         try {
  +             if (isIncluded) {
  +                 ((JspWriterImpl)out).flushBuffer();
  +                             // push it into the including jspWriter
  +             } else {
  +                 out.flush();
  +             }
  +         } catch (IOException ex) {
  +             loghelper.log("Internal error flushing the buffer in release()");
            }
  -     } catch (IOException ex) {
  -         loghelper.log("Internal error flushing the buffer in release()");
        }
        servlet      = null;
        config       = null;
  
  
  

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

Reply via email to