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) <[email protected]> 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; }
