Repository: wicket Updated Branches: refs/heads/wicket-8.x b1d099db8 -> c01c22bd1
WICKET-6599: unwrap ResponseIOException before leaving WicketFilter Project: http://git-wip-us.apache.org/repos/asf/wicket/repo Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/c01c22bd Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/c01c22bd Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/c01c22bd Branch: refs/heads/wicket-8.x Commit: c01c22bd1d61ec670eae926dfafdf261f63e0521 Parents: b1d099d Author: Emond Papegaaij <[email protected]> Authored: Thu Oct 18 13:40:11 2018 +0200 Committer: Emond Papegaaij <[email protected]> Committed: Thu Oct 18 13:40:11 2018 +0200 ---------------------------------------------------------------------- .../wicket/protocol/http/WicketFilter.java | 37 +++++++++---- .../http/servlet/ResponseIOException.java | 5 ++ .../wicket/protocol/http/WicketFilterTest.java | 58 ++++++++++++++++++++ 3 files changed, 88 insertions(+), 12 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/wicket/blob/c01c22bd/wicket-core/src/main/java/org/apache/wicket/protocol/http/WicketFilter.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/protocol/http/WicketFilter.java b/wicket-core/src/main/java/org/apache/wicket/protocol/http/WicketFilter.java index 0b5f5bb..99428a3 100644 --- a/wicket-core/src/main/java/org/apache/wicket/protocol/http/WicketFilter.java +++ b/wicket-core/src/main/java/org/apache/wicket/protocol/http/WicketFilter.java @@ -33,6 +33,7 @@ import javax.servlet.http.HttpServletResponse; import org.apache.wicket.ThreadContext; import org.apache.wicket.WicketRuntimeException; +import org.apache.wicket.protocol.http.servlet.ResponseIOException; import org.apache.wicket.request.cycle.RequestCycle; import org.apache.wicket.request.http.WebRequest; import org.apache.wicket.request.http.WebResponse; @@ -151,6 +152,7 @@ public class WicketFilter implements Filter HttpServletRequest httpServletRequest = (HttpServletRequest)request; HttpServletResponse httpServletResponse = (HttpServletResponse)response; + boolean ioExceptionOccurred = false; try { if (previousClassLoader != newClassLoader) @@ -211,18 +213,21 @@ public class WicketFilter implements Filter redirectURL += "?" + httpServletRequest.getQueryString(); } - try - { - // send redirect - this will discard POST parameters if the request is POST - // - still better than getting an error because of lacking trailing slash - httpServletResponse.sendRedirect(httpServletResponse.encodeRedirectURL(redirectURL)); - } - catch (IOException e) - { - throw new RuntimeException(e); - } + // send redirect - this will discard POST parameters if the request is POST + // - still better than getting an error because of lacking trailing slash + httpServletResponse.sendRedirect(httpServletResponse.encodeRedirectURL(redirectURL)); } } + catch (IOException e) + { + ioExceptionOccurred = true; + throw e; + } + catch (ResponseIOException e) + { + ioExceptionOccurred = true; + throw e.getCause(); + } finally { ThreadContext.restore(previousThreadContext); @@ -232,9 +237,17 @@ public class WicketFilter implements Filter Thread.currentThread().setContextClassLoader(previousClassLoader); } - if (response.isCommitted() && httpServletRequest.isAsyncStarted() == false) + if (!ioExceptionOccurred && response.isCommitted() && + !httpServletRequest.isAsyncStarted()) { - response.flushBuffer(); + try + { + response.flushBuffer(); + } + catch (ResponseIOException e) + { + throw e.getCause(); + } } } return res; http://git-wip-us.apache.org/repos/asf/wicket/blob/c01c22bd/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/ResponseIOException.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/ResponseIOException.java b/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/ResponseIOException.java index e6b3691..c033ba7 100644 --- a/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/ResponseIOException.java +++ b/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/ResponseIOException.java @@ -41,4 +41,9 @@ public class ResponseIOException extends WicketRuntimeException implements IWick super(cause); } + @Override + public synchronized IOException getCause() + { + return (IOException)super.getCause(); + } } http://git-wip-us.apache.org/repos/asf/wicket/blob/c01c22bd/wicket-core/src/test/java/org/apache/wicket/protocol/http/WicketFilterTest.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/test/java/org/apache/wicket/protocol/http/WicketFilterTest.java b/wicket-core/src/test/java/org/apache/wicket/protocol/http/WicketFilterTest.java index f0560b0..ced6a2a 100644 --- a/wicket-core/src/test/java/org/apache/wicket/protocol/http/WicketFilterTest.java +++ b/wicket-core/src/test/java/org/apache/wicket/protocol/http/WicketFilterTest.java @@ -51,14 +51,20 @@ import org.apache.wicket.mock.MockApplication; import org.apache.wicket.protocol.http.mock.MockHttpServletRequest; import org.apache.wicket.protocol.http.mock.MockHttpServletResponse; import org.apache.wicket.protocol.http.mock.MockServletContext; +import org.apache.wicket.protocol.http.servlet.ResponseIOException; import org.apache.wicket.request.http.WebRequest; import org.apache.wicket.request.resource.AbstractResource; +import org.apache.wicket.request.resource.ContentDisposition; import org.apache.wicket.request.resource.DynamicImageResource; import org.apache.wicket.request.resource.IResource; +import org.apache.wicket.request.resource.AbstractResource.ResourceResponse; +import org.apache.wicket.request.resource.AbstractResource.WriteCallback; +import org.apache.wicket.request.resource.IResource.Attributes; import org.apache.wicket.util.SlowTests; import org.apache.wicket.util.file.WebXmlFile; import org.apache.wicket.util.string.Strings; import org.apache.wicket.util.tester.DummyHomePage; +import org.apache.wicket.util.time.Time; import org.junit.After; import org.junit.Assert; import org.junit.Test; @@ -210,6 +216,58 @@ public class WicketFilterTest extends Assert } } + /** + * @throws IOException + * @throws ServletException + * @throws ParseException + */ + @Test(expected = IOException.class) + public void ioExceptionNotWrapped() throws IOException, ServletException, ParseException + { + try + { + application = new MockApplication(); + WicketFilter filter = new WicketFilter(); + filter.init(new FilterTestingConfig()); + ThreadContext.setApplication(application); + IResource resource = new AbstractResource() + { + private static final long serialVersionUID = 1L; + + @Override + protected ResourceResponse newResourceResponse(Attributes attributes) + { + return new ResourceResponse(); + } + }; + application.getSharedResources().add("foo.txt", resource); + MockHttpServletRequest request = new MockHttpServletRequest(application, null, null); + request.setURL(request.getContextPath() + request.getServletPath() + + "/wicket/resource/" + Application.class.getName() + "/foo.txt"); + setIfModifiedSinceToNextWeek(request); + MockHttpServletResponse response = new MockHttpServletResponse(request) + { + @Override + public void flushBuffer() throws IOException + { + throw new IOException("caused by test"); + } + }; + filter.doFilter(request, response, new FilterChain() + { + @Override + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse) + throws IOException, ServletException + { + } + }); + } + finally + { + ThreadContext.detach(); + } + } + @Test public void options() throws IOException, ServletException, ParseException {
