Updated Branches: refs/heads/wicket-1.5.x afccae4a3 -> a1c2814e0
WICKET-4358 BufferedWebResponse fails to add/clear cookie in redirect Project: http://git-wip-us.apache.org/repos/asf/wicket/repo Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/a1c2814e Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/a1c2814e Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/a1c2814e Branch: refs/heads/wicket-1.5.x Commit: a1c2814e0dce5fbda715b14150aab3d74b8b4709 Parents: afccae4 Author: Martin Tzvetanov Grigorov <mgrigo...@apache.org> Authored: Thu Jun 28 12:33:26 2012 +0300 Committer: Martin Tzvetanov Grigorov <mgrigo...@apache.org> Committed: Thu Jun 28 12:33:26 2012 +0300 ---------------------------------------------------------------------- .../request/handler/render/WebPageRenderer.java | 14 ++- .../PreserveCookieForTheNextHandlerTest.java | 90 +++++++++++++++ 2 files changed, 98 insertions(+), 6 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/wicket/blob/a1c2814e/wicket-core/src/main/java/org/apache/wicket/request/handler/render/WebPageRenderer.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/request/handler/render/WebPageRenderer.java b/wicket-core/src/main/java/org/apache/wicket/request/handler/render/WebPageRenderer.java index 3c84f2c..ba1ef70 100644 --- a/wicket-core/src/main/java/org/apache/wicket/request/handler/render/WebPageRenderer.java +++ b/wicket-core/src/main/java/org/apache/wicket/request/handler/render/WebPageRenderer.java @@ -20,7 +20,6 @@ import org.apache.wicket.protocol.http.BufferedWebResponse; import org.apache.wicket.protocol.http.WebApplication; import org.apache.wicket.request.IRequestHandler; import org.apache.wicket.request.Request; -import org.apache.wicket.request.Response; import org.apache.wicket.request.Url; import org.apache.wicket.request.cycle.RequestCycle; import org.apache.wicket.request.handler.RenderPageRequestHandler; @@ -91,10 +90,10 @@ public class WebPageRenderer extends PageRenderer IRequestHandler scheduled = requestCycle.getRequestHandlerScheduledAfterCurrent(); // keep the original response - final Response originalResponse = requestCycle.getResponse(); + final WebResponse originalResponse = (WebResponse) requestCycle.getResponse(); // buffered web response for page - BufferedWebResponse response = new BufferedWebResponse((WebResponse)originalResponse); + BufferedWebResponse response = new BufferedWebResponse(originalResponse); // keep the original base URL Url originalBaseUrl = requestCycle.getUrlRenderer().setBaseUrl(targetUrl); @@ -106,9 +105,12 @@ public class WebPageRenderer extends PageRenderer if (scheduled == null && requestCycle.getRequestHandlerScheduledAfterCurrent() != null) { - // This is a special case. During page render another request handler got scheduled. - // The handler - // will want to overwrite the response, so we need to let it + // This is a special case. + // During page render another request handler got scheduled and will want to overwrite + // the response, so we need to let it. + // Just preserve the meta data headers + originalResponse.reset(); // clear the initial actions because they are already copied into the new response's actions + response.writeMetaData(originalResponse); return null; } else http://git-wip-us.apache.org/repos/asf/wicket/blob/a1c2814e/wicket-core/src/test/java/org/apache/wicket/response/PreserveCookieForTheNextHandlerTest.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/test/java/org/apache/wicket/response/PreserveCookieForTheNextHandlerTest.java b/wicket-core/src/test/java/org/apache/wicket/response/PreserveCookieForTheNextHandlerTest.java new file mode 100644 index 0000000..26cf1e0 --- /dev/null +++ b/wicket-core/src/test/java/org/apache/wicket/response/PreserveCookieForTheNextHandlerTest.java @@ -0,0 +1,90 @@ +/* + * 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.response; + +import java.util.List; + +import javax.servlet.http.Cookie; + +import org.apache.wicket.MarkupContainer; +import org.apache.wicket.WicketTestCase; +import org.apache.wicket.markup.IMarkupResourceStreamProvider; +import org.apache.wicket.markup.html.WebPage; +import org.apache.wicket.markup.html.link.BookmarkablePageLink; +import org.apache.wicket.util.cookies.CookieUtils; +import org.apache.wicket.util.resource.IResourceStream; +import org.apache.wicket.util.resource.StringResourceStream; +import org.junit.Test; + +/** + * @since 1.5.8 + */ +public class PreserveCookieForTheNextHandlerTest extends WicketTestCase +{ + /** + * Verifies that any meta data actions set to a BufferedWebResponse during page rendering + * wont be lost if at some point during the rendering a new IRequestHandler is scheduled. + * + * https://issues.apache.org/jira/browse/WICKET-4358 + */ + @Test + public void preserveCookie() + { + tester.startPage(StartPage.class); + tester.assertRenderedPage(StartPage.class); + assertEquals(0, tester.getLastResponse().getCookies().size()); + + tester.clickLink("link"); + tester.assertRenderedPage(StartPage.class); + List<Cookie> cookies = tester.getLastResponse().getCookies(); + assertEquals(1, cookies.size()); + assertEquals("value", cookies.get(0).getValue()); + } + + public static final class StartPage extends WebPage implements IMarkupResourceStreamProvider + { + public StartPage() + { + add(new BookmarkablePageLink<Void>("link", SetCookiePage.class)); + } + + public IResourceStream getMarkupResourceStream(MarkupContainer container, Class<?> containerClass) + { + return new StringResourceStream("<html><body><a wicket:id='link'>Link</a></body></html>"); + } + } + + public static final class SetCookiePage extends WebPage implements IMarkupResourceStreamProvider + { + @Override + protected void onBeforeRender() + { + super.onBeforeRender(); + + // set a cookie (BufferedWebResponse metadata action) + new CookieUtils().save("test-cookie", "value"); + + // and schedule a new IRequestHandler + setResponsePage(StartPage.class); + } + + public IResourceStream getMarkupResourceStream(MarkupContainer container, Class<?> containerClass) + { + return new StringResourceStream("<html/>"); + } + } +}