You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by cr...@locus.apache.org on 2000/11/07 04:16:53 UTC

cvs commit: jakarta-tomcat/src/share/org/apache/tomcat/service/http HttpResponseAdapter.java

craigmcc    00/11/06 19:16:52

  Modified:    src/share/org/apache/tomcat/core Tag: tomcat_32
                        ResponseImpl.java
               src/share/org/apache/tomcat/facade Tag: tomcat_32
                        RequestDispatcherImpl.java
               src/share/org/apache/tomcat/service/http Tag: tomcat_32
                        HttpResponseAdapter.java
  Log:
  Work around a nasty problem that is caused by the way SessionInterceptor is
  implemented in Tomcat 3.2.
  
  The problem report (BugRat Bug Report #316) indicates that session cookies
  were not being set if a servlet did a RequestDispatcher.include() of a JSP
  page.
  
  The actual problem would occur anytime that the first flush of the response
  buffer occurred inside the included servlet.  It happens because the session
  interceptor (that sets the session cookie) uses the same method used by
  servlets (response.addHeader()) to add the session ID cookie -- but attempts
  to add headers inside an included servlet are ignored.  A JSP page as the
  included target triggers this because it includes a flush someplace; you can
  easily duplicate it with regular servlets as well.
  
  The workaround is to call response.flushBuffer() before actually calling
  the included servlet.  This causes the session ID cookie (and the
  Servlet-Engine header) to be correctly set.  It should not cause any
  compatibility problems, because included servlets are not able to do anything
  but write to the output stream or writer (or flush) anyway.
  
  PR: 316
  
  Revision  Changes    Path
  No                   revision
  
  
  No                   revision
  
  
  1.33.2.2  +14 -13    jakarta-tomcat/src/share/org/apache/tomcat/core/Attic/ResponseImpl.java
  
  Index: ResponseImpl.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/core/Attic/ResponseImpl.java,v
  retrieving revision 1.33.2.1
  retrieving revision 1.33.2.2
  diff -u -r1.33.2.1 -r1.33.2.2
  --- ResponseImpl.java	2000/11/05 03:12:03	1.33.2.1
  +++ ResponseImpl.java	2000/11/07 03:16:45	1.33.2.2
  @@ -1,7 +1,7 @@
   /*
  - * $Header: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/core/Attic/ResponseImpl.java,v 1.33.2.1 2000/11/05 03:12:03 craigmcc Exp $
  - * $Revision: 1.33.2.1 $
  - * $Date: 2000/11/05 03:12:03 $
  + * $Header: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/core/Attic/ResponseImpl.java,v 1.33.2.2 2000/11/07 03:16:45 craigmcc Exp $
  + * $Revision: 1.33.2.2 $
  + * $Date: 2000/11/07 03:16:45 $
    *
    * ====================================================================
    *
  @@ -364,17 +364,18 @@
       }
       
       public void reset() throws IllegalStateException {
  +
  +        if( isIncluded() ) return;      // We are in an included sub-request
  +
   	// Force the PrintWriter to flush its data to the output
           // stream before resetting the output stream
           //
  -        if( ! isIncluded() ) {
  -            userCookies.removeAllElements();  // keep system (session) cookies
  -            contentType = Constants.DEFAULT_CONTENT_TYPE;
  -            locale = DEFAULT_LOCALE;
  -            characterEncoding = Constants.DEFAULT_CHAR_ENCODING;
  -            contentLength = -1;
  -            status = 200;
  -        }
  +        userCookies.removeAllElements();  // keep system (session) cookies
  +        contentType = Constants.DEFAULT_CONTENT_TYPE;
  +        locale = DEFAULT_LOCALE;
  +        characterEncoding = Constants.DEFAULT_CHAR_ENCODING;
  +        contentLength = -1;
  +        status = 200;
   
   	if (usingWriter == true && writer != null)
   	    writer.flush();
  @@ -386,7 +387,7 @@
           // Clear the cookies and such
   
           // Clear the headers
  -        if( ! isIncluded() ) headers.clear();
  +        headers.clear();
       }
   
       // Reset the response buffer but not headers and cookies
  @@ -427,7 +428,7 @@
   
   	// let CM notify interceptors and give a chance to fix
   	// the headers
  -	if(request.getContext() != null && notIncluded ) 
  +	if(request.getContext() != null) 
   	    request.getContext().getContextManager().doBeforeBody(request, this);
   
   	// No action.. 
  
  
  
  No                   revision
  
  
  No                   revision
  
  
  1.8.2.3   +13 -0     jakarta-tomcat/src/share/org/apache/tomcat/facade/Attic/RequestDispatcherImpl.java
  
  Index: RequestDispatcherImpl.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/facade/Attic/RequestDispatcherImpl.java,v
  retrieving revision 1.8.2.2
  retrieving revision 1.8.2.3
  diff -u -r1.8.2.2 -r1.8.2.3
  --- RequestDispatcherImpl.java	2000/08/25 21:48:52	1.8.2.2
  +++ RequestDispatcherImpl.java	2000/11/07 03:16:48	1.8.2.3
  @@ -208,6 +208,19 @@
   	    return;
   	}
   	
  +	// Add an unspecified response.flushBuffer() call to work around
  +	// a fundamental problem in the way that the session interceptor
  +	// works.  If we do not do this, the session cookie gets dropped (!)
  +	// if the first flush of the buffer happens inside an included
  +	// servlet.  This occurs because the session interceptor uses the
  +	// normal response.addHeader() method to add the cookie -- but such
  +	// header changes are suppressed inside an included servlet.
  +	// (Reference: BugRat bug report #316)
  +	//
  +	// NOTE:  This *must* be done before the include flag is set for
  +	// this request!
  +	response.flushBuffer();
  +
   	// Implement the spec that "no changes in response, only write"
   	// can also be done by setting the response to 0.9 mode
   	//	IncludedResponse iResponse = new IncludedResponse(realResponse);
  
  
  
  No                   revision
  
  
  No                   revision
  
  
  1.11.2.1  +5 -3      jakarta-tomcat/src/share/org/apache/tomcat/service/http/HttpResponseAdapter.java
  
  Index: HttpResponseAdapter.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/service/http/HttpResponseAdapter.java,v
  retrieving revision 1.11
  retrieving revision 1.11.2.1
  diff -u -r1.11 -r1.11.2.1
  --- HttpResponseAdapter.java	2000/05/24 16:34:15	1.11
  +++ HttpResponseAdapter.java	2000/11/07 03:16:50	1.11.2.1
  @@ -1,7 +1,7 @@
   /*
  - * $Header: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/service/http/HttpResponseAdapter.java,v 1.11 2000/05/24 16:34:15 costin Exp $
  - * $Revision: 1.11 $
  - * $Date: 2000/05/24 16:34:15 $
  + * $Header: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/service/http/HttpResponseAdapter.java,v 1.11.2.1 2000/11/07 03:16:50 craigmcc Exp $
  + * $Revision: 1.11.2.1 $
  + * $Date: 2000/11/07 03:16:50 $
    *
    * ====================================================================
    *
  @@ -102,6 +102,7 @@
       static final byte CRLF[]= { (byte)'\r', (byte)'\n' };
       
       public void endHeaders()  throws IOException {
  +
   	super.endHeaders();
   	
   	sendStatus( status, ResponseImpl.getMessage( status ));
  @@ -128,6 +129,7 @@
   	HTTP response is the status line
       */
       protected void sendStatus( int status, String message ) throws IOException {
  +
   	printHead("HTTP/1.0 ");
   	printHead(String.valueOf(status));
   	if(message!=null) {