jmcnally    02/03/28 18:00:02

  Modified:    .        build.xml
               src/java/org/apache/turbine Turbine.java
               src/java/org/apache/turbine/modules/pages DefaultPage.java
  Log:
  patch by  Glenn Golden <[EMAIL PROTECTED]>
  
  To follow the Servlet HTTP rules, we must do the redirect before committing
  any headers or body to the response, and once we do a redirect we must not
  do anything else with the response.
  
  Revision  Changes    Path
  1.11      +1 -0      jakarta-turbine-2/build.xml
  
  Index: build.xml
  ===================================================================
  RCS file: /home/cvs/jakarta-turbine-2/build.xml,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- build.xml 13 Mar 2002 04:45:00 -0000      1.10
  +++ build.xml 29 Mar 2002 02:00:02 -0000      1.11
  @@ -241,6 +241,7 @@
               depends="prepare, prepare-jsp, prepare-freemarker, prepare-python,
                        prepare-webmacro, prepare-log4java, prepare-castor"
               description="--> compiles the source code">
  +
           <javac srcdir="${build.src}"
               destdir="${build.dest}"
               excludes="**/package.html,**/*Test.java"
  
  
  
  1.12      +61 -42    jakarta-turbine-2/src/java/org/apache/turbine/Turbine.java
  
  Index: Turbine.java
  ===================================================================
  RCS file: /home/cvs/jakarta-turbine-2/src/java/org/apache/turbine/Turbine.java,v
  retrieving revision 1.11
  retrieving revision 1.12
  diff -u -r1.11 -r1.12
  --- Turbine.java      13 Mar 2002 19:44:19 -0000      1.11
  +++ Turbine.java      29 Mar 2002 02:00:02 -0000      1.12
  @@ -117,7 +117,7 @@
    * @author <a href="mailto:[EMAIL PROTECTED]";>Jason van Zyl</a>
    * @author <a href="mailto:[EMAIL PROTECTED]";>Sean Legassick</a>
    * @author <a href="mailto:[EMAIL PROTECTED]";>Martin Poeschl</a>
  - * @version $Id: Turbine.java,v 1.11 2002/03/13 19:44:19 mpoeschl Exp $
  + * @version $Id: Turbine.java,v 1.12 2002/03/29 02:00:02 jmcnally Exp $
    */
   public class Turbine
       extends HttpServlet
  @@ -376,6 +376,9 @@
           throws IOException,
                  ServletException
       {
  +        // set to true if the request is to be redirected by the page
  +        boolean requestRedirected = false;
  +
           // Placeholder for the RunData object.
           RunData data = null;
           try
  @@ -584,46 +587,57 @@
                       AccessControlList.SESSION_KEY);
               }
   
  -            try
  +            // handle a redirect request
  +            requestRedirected = ((data.getRedirectURI() != null) 
  +                && (data.getRedirectURI().length() > 0));
  +            if (requestRedirected)
               {
  -                if ( data.isPageSet() == false &&
  -                     data.isOutSet() == false )
  -                    throw new Exception ( "Nothing to output" );
  -
  -                // We are all done! if isPageSet() output that way
  -                // otherwise, data.getOut() has already been written
  -                // to the data.getOut().close() happens below in the
  -                // finally.
  -                if ( data.isPageSet() && data.isOutSet() == false )
  -                {
  -                    // Modules can override these.
  -                    data.getResponse()
  -                        .setLocale( data.getLocale() );
  -                    data.getResponse()
  -                        .setContentType( data.getContentType() );
  -
  -                    // Handle the case where a module may want to send
  -                    // a redirect.
  -                    if ( ( data.getStatusCode() == 301 ||
  -                           data.getStatusCode() ==  302 ) &&
  -                         data.getRedirectURI() != null )
  +                if (data.getResponse().isCommitted())
  +                {
  +                    requestRedirected = false;
  +                    log ("redirect requested, response already committed: " + 
  +                         data.getRedirectURI());
  +                }
  +                else
  +                {
  +                    data.getResponse().sendRedirect(data.getRedirectURI());
  +                }
  +            }
  +
  +            if (!requestRedirected)
  +            {
  +                try
  +                {
  +                    if ( data.isPageSet() == false &&
  +                        data.isOutSet() == false )
  +                        throw new Exception ( "Nothing to output" );
  +
  +                    // We are all done! if isPageSet() output that way
  +                    // otherwise, data.getOut() has already been written
  +                    // to the data.getOut().close() happens below in the
  +                    // finally.
  +                    if ( data.isPageSet() && data.isOutSet() == false )
                       {
  +                        // Modules can override these.
                           data.getResponse()
  -                            .sendRedirect ( data.getRedirectURI() );
  -                    }
  +                            .setLocale( data.getLocale() );
  +                        data.getResponse()
  +                            .setContentType( data.getContentType() );
   
  -                    // Set the status code.
  -                    data.getResponse().setStatus ( data.getStatusCode() );
  -                    // Output the Page.
  -                    data.getPage().output (data.getOut());
  +                        // Set the status code.
  +                        data.getResponse().setStatus ( data.getStatusCode() );
  +                        // Output the Page.
  +                        data.getPage().output (data.getOut());
  +                    }
  +                }
  +                catch ( Exception e )
  +                {
  +                    // The output stream was probably closed by the client
  +                    // end of things ie: the client clicked the Stop
  +                    // button on the browser, so ignore any errors that
  +                    // result.
  +                    Log.debug("Output stream closed? ", e);
                   }
  -            }
  -            catch ( Exception e )
  -            {
  -                // The output stream was probably closed by the client
  -                // end of things ie: the client clicked the Stop
  -                // button on the browser, so ignore any errors that
  -                // result.
               }
           }
           catch ( Exception e )
  @@ -637,13 +651,18 @@
           finally
           {
               // Make sure to close the outputstream when we are done.
  -            try
  +            // Note: not for redirects, when we must not get a printwriter on 
  +            // the response output stream.
  +            if (!requestRedirected)
               {
  -                data.getOut().close();
  -            }
  -            catch (Exception e)
  -            {
  -                // Ignore.
  +                try
  +                {
  +                    data.getOut().close();
  +                }
  +                catch (Exception e)
  +                {
  +                    // Ignore.
  +                }
               }
   
               // Return the used RunData to the factory for recycling.
  
  
  
  1.2       +4 -1      
jakarta-turbine-2/src/java/org/apache/turbine/modules/pages/DefaultPage.java
  
  Index: DefaultPage.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-turbine-2/src/java/org/apache/turbine/modules/pages/DefaultPage.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- DefaultPage.java  16 Aug 2001 05:08:36 -0000      1.1
  +++ DefaultPage.java  29 Mar 2002 02:00:02 -0000      1.2
  @@ -119,7 +119,7 @@
    * written by John McNally.  I've only modified it for WebMacro use.
    *
    * @author <a href="mailto:[EMAIL PROTECTED]";>Dave Bryson</a>
  - * @version $Id: DefaultPage.java,v 1.1 2001/08/16 05:08:36 jvanzyl Exp $
  + * @version $Id: DefaultPage.java,v 1.2 2002/03/29 02:00:02 jmcnally Exp $
    */
   public class DefaultPage extends Page
   {
  @@ -142,6 +142,9 @@
           {
               ActionLoader.getInstance().exec ( data, data.getAction() );
           }
  +
  +        // if a redirect was setup in data, don't do anything else
  +        if ((data.getRedirectURI() != null) && (data.getRedirectURI().length() > 
0)) return;
   
           // Set the default doctype from the value given in
           // TurbineResources.properties.
  
  
  

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

Reply via email to