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/>");
+               }
+       }
+}

Reply via email to