You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by pe...@apache.org on 2026/09/08 23:46:29 UTC

(wicket) 01/03: WICKET-7205: Resolve IRequestHandlerDelegate-Chain in CSP-Processing

This is an automated email from the ASF dual-hosted git repository.

pedrosans pushed a commit to branch wicket-10.x
in repository https://gitbox.apache.org/repos/asf/wicket.git

commit 00f2e01032023a67da610906094095317984eb5d
Author: Schäfer, H.H. (Hans Hosea) <Ha...@ing.de>
AuthorDate: Tue Sep 8 13:12:59 2026 +0200

    WICKET-7205: Resolve IRequestHandlerDelegate-Chain in CSP-Processing
---
 .../org/apache/wicket/csp/CSPHeaderWriterTest.java | 55 ++++++++++++++++++++++
 .../wicket/request/IRequestHandlerDelegate.java    |  6 +--
 2 files changed, 58 insertions(+), 3 deletions(-)

diff --git a/wicket-core-tests/src/test/java/org/apache/wicket/csp/CSPHeaderWriterTest.java b/wicket-core-tests/src/test/java/org/apache/wicket/csp/CSPHeaderWriterTest.java
index e491144992..ad3edefdcb 100644
--- a/wicket-core-tests/src/test/java/org/apache/wicket/csp/CSPHeaderWriterTest.java
+++ b/wicket-core-tests/src/test/java/org/apache/wicket/csp/CSPHeaderWriterTest.java
@@ -20,16 +20,24 @@ import org.apache.wicket.MarkupContainer;
 import org.apache.wicket.RestartResponseException;
 import org.apache.wicket.core.request.handler.PageProvider;
 import org.apache.wicket.core.request.handler.RenderPageRequestHandler;
+import org.apache.wicket.core.request.mapper.MountedMapper;
 import org.apache.wicket.markup.IMarkupResourceStreamProvider;
 import org.apache.wicket.markup.head.CssHeaderItem;
 import org.apache.wicket.markup.head.IHeaderResponse;
 import org.apache.wicket.markup.html.WebPage;
+import org.apache.wicket.markup.html.form.login.MockHomePage;
 import org.apache.wicket.markup.html.link.StatelessLink;
 import org.apache.wicket.protocol.http.BufferedWebResponse;
 import org.apache.wicket.protocol.http.WebApplication;
 import org.apache.wicket.protocol.http.mock.MockHttpServletResponse;
 import org.apache.wicket.protocol.http.servlet.ServletWebRequest;
+import org.apache.wicket.request.IRequestCycle;
+import org.apache.wicket.request.IRequestHandler;
+import org.apache.wicket.request.IRequestHandlerDelegate;
+import org.apache.wicket.request.IRequestMapper;
+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.http.WebResponse;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
@@ -115,6 +123,53 @@ class CSPHeaderWriterTest extends WicketTestCase
 			STYLE_SRC.getValue());
 	}
 
+	@Test
+	void addCspDirectiveToStatelessPageEvenIfWrappedInMultipleIRequestHandlerDelegates()
+	{
+		tester.getApplication().mount(new MountedMapper("withdelegate/page", NoopMockPage.class)
+		{
+			@Override
+			public IRequestHandler mapRequest(final Request request)
+			{
+				final IRequestHandler requestHandler = super.mapRequest(request);
+				final IRequestHandler result;
+				if (requestHandler instanceof RenderPageRequestHandler renderPageRequestHandler && NoopMockPage.class.equals(renderPageRequestHandler.getPageClass()))
+				{
+					result = new NoopIRequestHandlerDelegate(new NoopIRequestHandlerDelegate(renderPageRequestHandler));
+				} else {
+					result = requestHandler;
+				}
+				return result;
+			}
+		});
+		tester.startPage(NoopMockPage.class);
+
+		assertThat(tester.getLastRenderedPage()).isInstanceOf(NoopMockPage.class);
+		assertThat(tester.getLastResponse().getHeader("Content-Security-Policy")).contains(
+		  STYLE_SRC.getValue());
+	}
+
+	public static class NoopMockPage extends MockHomePage {
+	}
+
+	static class NoopIRequestHandlerDelegate implements IRequestHandlerDelegate {
+		private final IRequestHandler delegate;
+
+		NoopIRequestHandlerDelegate(final IRequestHandler delegate) {
+			this.delegate = delegate;
+		}
+
+		@Override
+		public IRequestHandler getDelegateHandler() {
+			return delegate;
+		}
+
+		@Override
+		public void respond(final IRequestCycle requestCycle) {
+			delegate.respond(requestCycle);
+		}
+	}
+
 	public static class Page extends WebPage implements IMarkupResourceStreamProvider
 	{
 		@Override
diff --git a/wicket-request/src/main/java/org/apache/wicket/request/IRequestHandlerDelegate.java b/wicket-request/src/main/java/org/apache/wicket/request/IRequestHandlerDelegate.java
index de3803dd99..9c4909332f 100644
--- a/wicket-request/src/main/java/org/apache/wicket/request/IRequestHandlerDelegate.java
+++ b/wicket-request/src/main/java/org/apache/wicket/request/IRequestHandlerDelegate.java
@@ -29,11 +29,11 @@ public interface IRequestHandlerDelegate extends IRequestHandler
 	/**
 	 * @return the innermost delegated {@link IRequestHandler}
 	 */
-	static IRequestHandler unwrap(IRequestHandler handler)
+	static IRequestHandler unwrap(final IRequestHandler handler)
 	{
-		if (handler instanceof IRequestHandlerDelegate)
+		if (handler instanceof IRequestHandlerDelegate requestHandlerDelegate)
 		{
-			return ((IRequestHandlerDelegate)handler).getDelegateHandler();
+			return unwrap(requestHandlerDelegate.getDelegateHandler());
 		}
 		return handler;
 	}