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 2011/04/21 20:20:09 UTC
svn commit: r1095790 - in /wicket/trunk/wicket-core/src:
main/java/org/apache/wicket/
main/java/org/apache/wicket/protocol/http/servlet/
main/java/org/apache/wicket/util/tester/
test/java/org/apache/wicket/protocol/http/
Author: pedro
Date: Thu Apr 21 18:20:08 2011
New Revision: 1095790
URL: http://svn.apache.org/viewvc?rev=1095790&view=rev
Log:
Improving default exception handler by differentiating IO exceptions occurred while writing or flushing the response and give up responding it
Issue: WICKET-3570
Added:
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/ResponseIOException.java
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/http/HeaderBufferingWebResponseTest.java
Modified:
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/DefaultExceptionMapper.java
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebResponse.java
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java
Modified: wicket/trunk/wicket-core/src/main/java/org/apache/wicket/DefaultExceptionMapper.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/DefaultExceptionMapper.java?rev=1095790&r1=1095789&r2=1095790&view=diff
==============================================================================
--- wicket/trunk/wicket-core/src/main/java/org/apache/wicket/DefaultExceptionMapper.java (original)
+++ wicket/trunk/wicket-core/src/main/java/org/apache/wicket/DefaultExceptionMapper.java Thu Apr 21 18:20:08 2011
@@ -19,6 +19,7 @@ package org.apache.wicket;
import org.apache.wicket.authorization.AuthorizationException;
import org.apache.wicket.markup.html.pages.ExceptionErrorPage;
import org.apache.wicket.protocol.http.PageExpiredException;
+import org.apache.wicket.protocol.http.servlet.ResponseIOException;
import org.apache.wicket.request.IExceptionMapper;
import org.apache.wicket.request.IRequestHandler;
import org.apache.wicket.request.Request;
@@ -93,6 +94,11 @@ public class DefaultExceptionMapper impl
.getApplicationSettings()
.getAccessDeniedPage()));
}
+ else if (e instanceof ResponseIOException)
+ {
+ logger.error("Connection lost, give up responding.", e);
+ return new EmptyRequestHandler();
+ }
else
{
Added: wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/ResponseIOException.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/ResponseIOException.java?rev=1095790&view=auto
==============================================================================
--- wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/ResponseIOException.java (added)
+++ wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/ResponseIOException.java Thu Apr 21 18:20:08 2011
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.protocol.http.servlet;
+
+import java.io.IOException;
+
+import org.apache.wicket.WicketRuntimeException;
+
+/**
+ * Distinct IO exceptions from the those triggered while responding a request. Wicket needs to be
+ * aware of this specific IO exception in order to give up from responding, since there are no more
+ * connection to client.
+ *
+ * @author Pedro Santos
+ */
+public class ResponseIOException extends WicketRuntimeException
+{
+ /** */
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * @param cause
+ */
+ public ResponseIOException(IOException cause)
+ {
+ super(cause);
+ }
+
+}
Modified: wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebResponse.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebResponse.java?rev=1095790&r1=1095789&r2=1095790&view=diff
==============================================================================
--- wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebResponse.java (original)
+++ wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebResponse.java Thu Apr 21 18:20:08 2011
@@ -102,7 +102,7 @@ public class ServletWebResponse extends
}
catch (IOException e)
{
- throw new WicketRuntimeException(e);
+ throw new ResponseIOException(e);
}
}
@@ -115,7 +115,7 @@ public class ServletWebResponse extends
}
catch (IOException e)
{
- throw new WicketRuntimeException(e);
+ throw new ResponseIOException(e);
}
}
@@ -266,7 +266,7 @@ public class ServletWebResponse extends
}
catch (IOException e)
{
- throw new WicketRuntimeException(e);
+ throw new ResponseIOException(e);
}
}
Modified: wicket/trunk/wicket-core/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java?rev=1095790&r1=1095789&r2=1095790&view=diff
==============================================================================
--- wicket/trunk/wicket-core/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java (original)
+++ wicket/trunk/wicket-core/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java Thu Apr 21 18:20:08 2011
@@ -102,6 +102,7 @@ import org.apache.wicket.request.IExcept
import org.apache.wicket.request.IRequestHandler;
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.cycle.RequestCycleContext;
@@ -336,7 +337,7 @@ public class BaseWicketTester
* @param servletWebRequest
* @return servlet web response
*/
- private ServletWebResponse newServletWebResponse(final ServletWebRequest servletWebRequest)
+ protected Response newServletWebResponse(final ServletWebRequest servletWebRequest)
{
return new WicketTesterServletWebResponse(servletWebRequest, response);
}
Added: wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/http/HeaderBufferingWebResponseTest.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/http/HeaderBufferingWebResponseTest.java?rev=1095790&view=auto
==============================================================================
--- wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/http/HeaderBufferingWebResponseTest.java (added)
+++ wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/http/HeaderBufferingWebResponseTest.java Thu Apr 21 18:20:08 2011
@@ -0,0 +1,124 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.protocol.http;
+
+import java.net.SocketException;
+
+import javax.servlet.http.HttpServletResponse;
+
+import junit.framework.TestCase;
+
+import org.apache.wicket.protocol.http.servlet.ResponseIOException;
+import org.apache.wicket.protocol.http.servlet.ServletWebRequest;
+import org.apache.wicket.protocol.http.servlet.ServletWebResponse;
+import org.apache.wicket.request.IRequestHandler;
+import org.apache.wicket.request.Response;
+import org.apache.wicket.request.cycle.AbstractRequestCycleListener;
+import org.apache.wicket.request.handler.EmptyRequestHandler;
+import org.apache.wicket.request.resource.ResourceStreamResource;
+import org.apache.wicket.util.resource.StringResourceStream;
+import org.apache.wicket.util.tester.WicketTester;
+
+
+/**
+ * @author Pedro Santos
+ */
+public class HeaderBufferingWebResponseTest extends TestCase
+{
+ private WicketTester tester;
+
+ @Override
+ protected void setUp() throws Exception
+ {
+ tester = new WicketTester()
+ {
+ @Override
+ protected Response newServletWebResponse(ServletWebRequest servletWebRequest)
+ {
+ return new HeaderBufferingWebResponse(new ProblematicResponse(servletWebRequest,
+ getResponse()));
+ }
+ };
+ tester.setExposeExceptions(false);
+ }
+
+ @Override
+ protected void tearDown() throws Exception
+ {
+ tester.destroy();
+ }
+
+ /**
+ * WICKET-3570
+ */
+ public void testGiveUpRespondingOnIOExceptions()
+ {
+ TestRequestCycleListener testRequestCycleListener = new TestRequestCycleListener();
+ tester.getApplication().getRequestCycleListeners().add(testRequestCycleListener);
+ tester.startResource(new ResourceStreamResource(new StringResourceStream("asdf")));
+ assertTrue(testRequestCycleListener.lastExceptionRquestHandlerResolved instanceof EmptyRequestHandler);
+ }
+
+ class TestRequestCycleListener extends AbstractRequestCycleListener
+ {
+ IRequestHandler lastExceptionRquestHandlerResolved;
+
+ @Override
+ public void onExceptionRequestHandlerResolved(IRequestHandler handler, Exception exception)
+ {
+ lastExceptionRquestHandlerResolved = handler;
+ }
+
+ }
+ /**
+ * Mock response simulating connection lost problems.
+ */
+ public static class ProblematicResponse extends ServletWebResponse
+ {
+
+ /**
+ * @param webRequest
+ * @param httpServletResponse
+ */
+ public ProblematicResponse(ServletWebRequest webRequest,
+ HttpServletResponse httpServletResponse)
+ {
+ super(webRequest, httpServletResponse);
+ }
+
+ @Override
+ public void flush()
+ {
+ throw new ResponseIOException(new SocketException(
+ "Connection reset by peer: socket write error"));
+ }
+
+ @Override
+ public void write(byte[] array)
+ {
+ throw new ResponseIOException(new SocketException(
+ "Connection reset by peer: socket write error"));
+ }
+
+ @Override
+ public void write(CharSequence sequence)
+ {
+ throw new ResponseIOException(new SocketException(
+ "Connection reset by peer: socket write error"));
+ }
+ }
+}