Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
import org.apache.wicket.Application;
import org.apache.wicket.core.request.handler.PageProvider;
import org.apache.wicket.core.request.handler.RenderPageRequestHandler;
import org.apache.wicket.core.request.handler.RenderPageRequestHandler.RedirectPolicy;
import org.apache.wicket.core.request.mapper.StalePageException;
import org.apache.wicket.request.IRequestHandler;
import org.apache.wicket.request.Url;
import org.apache.wicket.request.component.IRequestablePage;
Expand Down Expand Up @@ -49,6 +51,14 @@ public IRequestHandler onException(RequestCycle cycle, Exception ex) {
REQUEST_LOGGER.trace("REQUEST CYCLE: Exception: {}, handler {}", ex,
WebComponentUtil.debugHandler(cycle.getActiveRequestHandler()), ex);
}
if (ex instanceof StalePageException stalePageException) {
// Wicket uses this exception for stale render-count recovery, e.g. after browser view-source.
// Do not convert it to PageError/500, recover by re-rendering the stale page.
LOGGER.debug("Recovering stale Wicket page request by re-rendering page {}", stalePageException.getPage());
return new RenderPageRequestHandler(
new PageProvider(stalePageException.getPage()),
RedirectPolicy.ALWAYS_REDIRECT);
}
LoggingUtils.logUnexpectedException(LOGGER, "Error occurred during page rendering", ex);
return new RenderPageRequestHandler(new PageProvider(new PageError(ex)));
}
Expand Down Expand Up @@ -136,4 +146,3 @@ public void onUrlMapped(RequestCycle cycle, IRequestHandler handler, Url url) {
}
}
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
/*
* Copyright (C) 2010-2026 Evolveum and contributors
*
* This work is dual-licensed under the Apache License 2.0
* and European Union Public License. See LICENSE file for details.
*/

package com.evolveum.midpoint.web;

import com.evolveum.midpoint.web.security.LoggingRequestCycleListener;
import org.apache.wicket.core.request.handler.RenderPageRequestHandler;
import org.apache.wicket.core.request.handler.RenderPageRequestHandler.RedirectPolicy;
import org.apache.wicket.core.request.mapper.StalePageException;
import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.request.IRequestHandler;
import org.apache.wicket.util.tester.WicketTester;
import org.testng.Assert;
import org.testng.annotations.Test;

/**
* Tests exception handling behavior in {@link LoggingRequestCycleListener}.
*/
public class LoggingRequestCycleListenerTest {

/**
* MID-9998: Verifies that Wicket stale page recovery, e.g. after browser
* view-source, is handled by re-rendering the stale page instead of being
* converted to the error page / HTTP 500.
*/
@Test

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please add comment with issue number & short description

public void testStalePageExceptionIsRecoveredInsteadOfConvertedToPageError() {
WicketTester tester = new WicketTester();
try {
LoggingRequestCycleListener listener = new LoggingRequestCycleListener(tester.getApplication());
TestPage page = new TestPage();

IRequestHandler handler = listener.onException(null, new StalePageException(page));

Assert.assertTrue(handler instanceof RenderPageRequestHandler);

RenderPageRequestHandler renderHandler = (RenderPageRequestHandler) handler;
Assert.assertSame(renderHandler.getPage(), page);
Assert.assertSame(renderHandler.getRedirectPolicy(), RedirectPolicy.ALWAYS_REDIRECT);
} finally {
tester.destroy();
}
}

private static class TestPage extends WebPage {
}
}
1 change: 1 addition & 0 deletions gui/admin-gui/testng-unit.xml
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
<class name="com.evolveum.midpoint.web.TestXmlGregorianCalendarModel"/>
<class name="com.evolveum.midpoint.gui.SelectableBeanDataProviderCountCacheTest"/>
<class name="com.evolveum.midpoint.gui.FocusDefinitionsMappingProviderTest"/>
<class name="com.evolveum.midpoint.web.LoggingRequestCycleListenerTest"/>
</classes>
</test>
</suite>
1 change: 1 addition & 0 deletions release-notes.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,7 @@ Overall, midPoint 4.10 opens up the world of identity management and governance
* Fixed missing .zip extension when downloading tracing report files. See bug:MID-11096[]
* Fixed resource wizard mapping property autocomplete to find partial matches regardless of letter case. See bug:MID-10415[]
* Fixed missing input variable in resource activation existence mappings. See bug:MID-10905[]
* Fixed stale page recovery after viewing page source causing internal server error. See bug:MID-9998[]

=== Releases Of Other Components

Expand Down
Loading