You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by cm...@apache.org on 2012/07/03 14:22:29 UTC

[27/28] git commit: WICKET-4358 BufferedWebResponse fails to add/clear cookie in redirect

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/02ebc8ae
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/02ebc8ae
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/02ebc8ae

Branch: refs/heads/sandbox/resourcefinder
Commit: 02ebc8aebba076ac37a74e2a7c6ad3aa5cbc27de
Parents: df71f00
Author: Martin Tzvetanov Grigorov <mg...@apache.org>
Authored: Thu Jun 28 12:33:26 2012 +0300
Committer: Martin Tzvetanov Grigorov <mg...@apache.org>
Committed: Thu Jun 28 12:35:51 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/02ebc8ae/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 b92f3e3..a0dbfeb 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.core.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/02ebc8ae/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/>");
+		}
+	}
+}