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
