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"));
+		}
+	}
+}