Should this be included in 6.4? If so can we mark the issue fixed?

Martijn

On Fri, Dec 14, 2012 at 4:19 PM,  <[email protected]> wrote:
> Updated Branches:
>   refs/heads/master 1f5989f54 -> 8c827e33e
>
>
> WICKET-4927 allow headers to be set even if meta data is no longer
> buffered
>
> Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
> Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/8c827e33
> Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/8c827e33
> Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/8c827e33
>
> Branch: refs/heads/master
> Commit: 8c827e33e6ae1d4177df2eab9bd3cf9b5a84248f
> Parents: d70b7f4
> Author: svenmeier <[email protected]>
> Authored: Fri Dec 14 16:15:04 2012 +0100
> Committer: svenmeier <[email protected]>
> Committed: Fri Dec 14 16:18:19 2012 +0100
>
> ----------------------------------------------------------------------
>  .../protocol/http/HeaderBufferingWebResponse.java  |   98 ++++++++-------
>  .../http/HeaderBufferingWebResponseTest.java       |   82 ++++++++++++
>  2 files changed, 134 insertions(+), 46 deletions(-)
> ----------------------------------------------------------------------
>
>
> http://git-wip-us.apache.org/repos/asf/wicket/blob/8c827e33/wicket-core/src/main/java/org/apache/wicket/protocol/http/HeaderBufferingWebResponse.java
> ----------------------------------------------------------------------
> diff --git 
> a/wicket-core/src/main/java/org/apache/wicket/protocol/http/HeaderBufferingWebResponse.java
>  
> b/wicket-core/src/main/java/org/apache/wicket/protocol/http/HeaderBufferingWebResponse.java
> index 0ac0c2a..8771dca 100644
> --- 
> a/wicket-core/src/main/java/org/apache/wicket/protocol/http/HeaderBufferingWebResponse.java
> +++ 
> b/wicket-core/src/main/java/org/apache/wicket/protocol/http/HeaderBufferingWebResponse.java
> @@ -24,135 +24,134 @@ import org.apache.wicket.util.lang.Args;
>  import org.apache.wicket.util.time.Time;
>
>  /**
> - * Response that keeps headers in buffers but writes the content directly to 
> the response.
> + * Response that keeps headers in buffers until the first content is written.
>   *
>   * This is necessary to get {@link #reset()} working without removing the 
> JSESSIONID cookie. When
>   * {@link HttpServletResponse#reset()} is called it removes all cookies, 
> including the JSESSIONID
> - * cookie.
> + * cookie - see <a 
> href="https://issues.apache.org/bugzilla/show_bug.cgi?id=26183";>Bug 26183</a>.
>   *
> - * Calling {@link #reset()} on this response only clears the buffered 
> headers. If there is any
> - * content written to response it throws {@link IllegalStateException}.
> + * Calling {@link #reset()} on this response clears the buffered meta data, 
> if there is already any
> + * content written it throws {@link IllegalStateException}.
>   *
>   * @author Matej Knopp
>   */
>  class HeaderBufferingWebResponse extends WebResponse implements 
> IMetaDataBufferingWebResponse
>  {
>         private final WebResponse originalResponse;
> +
> +       /**
> +        * Buffer of meta data.
> +        */
>         private final BufferedWebResponse bufferedResponse;
>
>         public HeaderBufferingWebResponse(WebResponse originalResponse)
>         {
>                 this.originalResponse = originalResponse;
> +
>                 bufferedResponse = new BufferedWebResponse(originalResponse);
>         }
>
> -       private boolean bufferedWritten = false;
> +       private boolean buffering = true;
>
> -       private void writeBuffered()
> +       private void stopBuffering()
>         {
> -               if (!bufferedWritten)
> +               if (buffering)
>                 {
>                         bufferedResponse.writeTo(originalResponse);
> -                       bufferedWritten = true;
> +                       buffering = false;
>                 }
>         }
>
> -       private void checkHeader()
> +       /**
> +        * The response used for meta data.
> +        *
> +        * @return buffered response if nothing was written yet, the original 
> response otherwise
> +        */
> +       private WebResponse getMetaResponse()
>         {
> -               if (bufferedWritten)
> +               if (buffering)
> +               {
> +                       return bufferedResponse;
> +               }
> +               else
>                 {
> -                       throw new IllegalStateException("Header was already 
> written to response!");
> +                       return originalResponse;
>                 }
>         }
>
>         @Override
>         public void addCookie(Cookie cookie)
>         {
> -               checkHeader();
> -               bufferedResponse.addCookie(cookie);
> +               getMetaResponse().addCookie(cookie);
>         }
>
>         @Override
>         public void clearCookie(Cookie cookie)
>         {
> -               checkHeader();
> -               bufferedResponse.clearCookie(cookie);
> +               getMetaResponse().clearCookie(cookie);
>         }
>
> -       private boolean flushed = false;
> -
>         @Override
>         public void flush()
>         {
> -               if (!bufferedWritten)
> -               {
> -                       bufferedResponse.writeTo(originalResponse);
> -                       bufferedResponse.reset();
> -               }
> +               stopBuffering();
> +
>                 originalResponse.flush();
> -               flushed = true;
>         }
>
>         @Override
>         public boolean isRedirect()
>         {
> -               return bufferedResponse.isRedirect();
> +               return getMetaResponse().isRedirect();
>         }
>
>         @Override
>         public void sendError(int sc, String msg)
>         {
> -               checkHeader();
> -               bufferedResponse.sendError(sc, msg);
> +               getMetaResponse().sendError(sc, msg);
>         }
>
>         @Override
>         public void sendRedirect(String url)
>         {
> -               checkHeader();
> -               bufferedResponse.sendRedirect(url);
> +               getMetaResponse().sendRedirect(url);
>         }
>
>         @Override
>         public void setContentLength(long length)
>         {
> -               checkHeader();
> -               bufferedResponse.setContentLength(length);
> +               getMetaResponse().setContentLength(length);
>         }
>
>         @Override
>         public void setContentType(String mimeType)
>         {
> -               checkHeader();
> -               bufferedResponse.setContentType(mimeType);
> +               getMetaResponse().setContentType(mimeType);
>         }
>
>         @Override
>         public void setDateHeader(String name, Time date)
>         {
>                 Args.notNull(date, "date");
> -               checkHeader();
> -               bufferedResponse.setDateHeader(name, date);
> +               getMetaResponse().setDateHeader(name, date);
>         }
>
>         @Override
>         public void setHeader(String name, String value)
>         {
> -               checkHeader();
> -               bufferedResponse.setHeader(name, value);
> +               getMetaResponse().setHeader(name, value);
>         }
>
>         @Override
>         public void addHeader(String name, String value)
>         {
> -               checkHeader();
> -               bufferedResponse.addHeader(name, value);
> +               getMetaResponse().addHeader(name, value);
>         }
>
>         @Override
>         public void setStatus(int sc)
>         {
> -               bufferedResponse.setStatus(sc);
> +               getMetaResponse().setStatus(sc);
>         }
>
>         @Override
> @@ -170,14 +169,16 @@ class HeaderBufferingWebResponse extends WebResponse 
> implements IMetaDataBufferi
>         @Override
>         public void write(CharSequence sequence)
>         {
> -               writeBuffered();
> +               stopBuffering();
> +
>                 originalResponse.write(sequence);
>         }
>
>         @Override
>         public void write(byte[] array)
>         {
> -               writeBuffered();
> +               stopBuffering();
> +
>                 originalResponse.write(array);
>         }
>
> @@ -185,19 +186,24 @@ class HeaderBufferingWebResponse extends WebResponse 
> implements IMetaDataBufferi
>         @Override
>         public void write(byte[] array, int offset, int length)
>         {
> -               writeBuffered();
> +               stopBuffering();
> +
>                 originalResponse.write(array, offset, length);
>         }
>
>         @Override
>         public void reset()
>         {
> -               if (flushed)
> +               if (buffering)
> +               {
> +                       // still buffering so just reset the buffer of meta 
> data
> +                       bufferedResponse.reset();
> +               }
> +               else
>                 {
> -                       throw new IllegalStateException("Response has already 
> been flushed!");
> +                       // the original response is never reset (see class 
> javadoc)
> +                       throw new IllegalStateException("Response is no 
> longer buffering!");
>                 }
> -               bufferedResponse.reset();
> -               bufferedWritten = false;
>         }
>
>         @Override
>
> http://git-wip-us.apache.org/repos/asf/wicket/blob/8c827e33/wicket-core/src/test/java/org/apache/wicket/protocol/http/HeaderBufferingWebResponseTest.java
> ----------------------------------------------------------------------
> diff --git 
> a/wicket-core/src/test/java/org/apache/wicket/protocol/http/HeaderBufferingWebResponseTest.java
>  
> b/wicket-core/src/test/java/org/apache/wicket/protocol/http/HeaderBufferingWebResponseTest.java
> new file mode 100644
> index 0000000..1383b4b
> --- /dev/null
> +++ 
> b/wicket-core/src/test/java/org/apache/wicket/protocol/http/HeaderBufferingWebResponseTest.java
> @@ -0,0 +1,82 @@
> +/*
> + * Licensed to the Apache Software Foundation (ASF) under one or more
> + * contributor license agreements.  See the NOTICE file distributed with
> + * this work for additional information regarding copyright ownership.
> + * The ASF licenses this file to You under the Apache License, Version 2.0
> + * (the "License"); you may not use this file except in compliance with
> + * the License.  You may obtain a copy of the License at
> + *
> + *      http://www.apache.org/licenses/LICENSE-2.0
> + *
> + * Unless required by applicable law or agreed to in writing, software
> + * distributed under the License is distributed on an "AS IS" BASIS,
> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
> + * See the License for the specific language governing permissions and
> + * limitations under the License.
> + */
> +package org.apache.wicket.protocol.http;
> +
> +import org.apache.wicket.mock.MockWebResponse;
> +import org.junit.Assert;
> +import org.junit.Test;
> +
> +
> +/**
> + * Test for {@link HeaderBufferingWebResponse}.
> + *
> + * @author svenmeier
> + */
> +public class HeaderBufferingWebResponseTest extends Assert
> +{
> +
> +       /**
> +        * WICKET-4927
> +        */
> +       @Test
> +       public void additionalHeaderAfterWrittenContent()
> +       {
> +               MockWebResponse originalResponse = new MockWebResponse();
> +
> +               HeaderBufferingWebResponse response = new 
> HeaderBufferingWebResponse(originalResponse);
> +
> +               response.addHeader("key1", "value1");
> +
> +               assertNull(originalResponse.getHeader("key1"));
> +
> +               response.write("written");
> +
> +               assertEquals("value1", originalResponse.getHeader("key1"));
> +
> +               response.addHeader("key2", "value2");
> +
> +               assertEquals("value2", originalResponse.getHeader("key2"));
> +       }
> +
> +       /**
> +        */
> +       @Test
> +       public void resetAfterWrittenContent()
> +       {
> +               MockWebResponse originalResponse = new MockWebResponse();
> +
> +               HeaderBufferingWebResponse response = new 
> HeaderBufferingWebResponse(originalResponse);
> +
> +               response.addHeader("key1", "value1");
> +
> +               assertNull(originalResponse.getHeader("key1"));
> +
> +               response.reset();
> +
> +               response.write("written");
> +
> +               try
> +               {
> +                       response.reset();
> +
> +                       fail();
> +               }
> +               catch (IllegalStateException expected)
> +               {
> +               }
> +       }
> +}
>



-- 
Become a Wicket expert, learn from the best: http://wicketinaction.com

Reply via email to