You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by "Bertrand Guay-Paquet (JIRA)" <ji...@apache.org> on 2012/07/03 15:50:20 UTC

[jira] [Updated] (WICKET-4637) HeaderBufferingWebResponse#writeMetaData(WebResponse) throws ConcurrentModificationException when invoked in a link handler

     [ https://issues.apache.org/jira/browse/WICKET-4637?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Bertrand Guay-Paquet updated WICKET-4637:
-----------------------------------------

    Attachment: wicket-4637.zip

Set of test pages to test the different ways to redirect to a page from a page constructor, a link handler and a form submit handler. They all set a cookie and a session message to validate the behaviors
                
> HeaderBufferingWebResponse#writeMetaData(WebResponse) throws ConcurrentModificationException when invoked in a link handler
> ---------------------------------------------------------------------------------------------------------------------------
>
>                 Key: WICKET-4637
>                 URL: https://issues.apache.org/jira/browse/WICKET-4637
>             Project: Wicket
>          Issue Type: Bug
>          Components: wicket
>    Affects Versions: 1.5.7
>            Reporter: Bertrand Guay-Paquet
>              Labels: response
>         Attachments: wicket-4637.zip
>
>
> This ticket follows from the email thread http://markmail.org/thread/uk5y4ddoopntmkgd
> I use the following ReplaceHandlerException to trigger a redirect which restarts the response but does not discard the response's meta data (e.g. cookies).
> /**
>  * Response restarting exception which does not reset the header meta data.
>  */
> public class NonResettingRestartException extends ReplaceHandlerException {
> 	public NonResettingRestartException(final Class<? extends Page> pageClass,
> 			final PageParameters params, final RequestCycle cycle) {
> 		super(createRequestHandler(pageClass, params), true);
> 		Response response = cycle.getResponse();
> 		if (response instanceof IMetaDataBufferingWebResponse) {
> 			IMetaDataBufferingWebResponse bufferingWebResponse = (IMetaDataBufferingWebResponse) response;
> 			WebResponse originalResponse = (WebResponse) cycle
> 					.getOriginalResponse();
> 			bufferingWebResponse.writeMetaData(originalResponse);
> 		}
> 	}
> 	private static IRequestHandler createRequestHandler(
> 			Class<? extends Page> pageClass, PageParameters params) {
> 		return new RenderPageRequestHandler(new PageProvider(pageClass, params));
> 	}
> }
> When this exception is thrown from a link handler, a ConcurrentModificationException occurs with the following stack trace:
> HeaderBufferingWebResponse.addCookie(Cookie) line: 72
> BufferedWebResponse$AddCookieAction.invoke(WebResponse) line: 240
> BufferedWebResponse.writeMetaData(WebResponse) line: 75
> HeaderBufferingWebResponse.writeMetaData(WebResponse) line: 205
> NonResettingRestartException.<init>(Class<Page>, PageParameters, RequestCycle) line: 28
> LinkPage$4.onClick() line: 38 
> Analysis:
> 1) HeaderBufferingWebResponse delegates #writeMetaData() to its bufferedResponse (a BufferedWebResponse instance).
> 2) BufferedWebResponse iterates its action list with the single "AddCookieAction" and invoke()s it
> 3) BufferedWebResponse$AddCookieAction.invoke does "response.addCookie(cookie)"
> 4) The addCookie is executed with this==BufferedWebResponse from 2) which modifies the action list illegally 

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira