Author: markt
Date: Tue Nov 26 19:56:54 2013
New Revision: 1545801
URL: http://svn.apache.org/r1545801
Log:
Avoid NPEs if asyncContext is completed by listener
Modified:
tomcat/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java
Modified: tomcat/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java?rev=1545801&r1=1545800&r2=1545801&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java
(original)
+++ tomcat/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java Tue Nov
26 19:56:54 2013
@@ -25,6 +25,7 @@ import java.util.concurrent.atomic.Atomi
import javax.servlet.ReadListener;
import javax.servlet.RequestDispatcher;
import javax.servlet.SessionTrackingMode;
+import javax.servlet.WriteListener;
import javax.servlet.http.HttpServletResponse;
import org.apache.catalina.Context;
@@ -313,14 +314,15 @@ public class CoyoteAdapter implements Ad
Throwable t = (Throwable)req.getAttribute(
RequestDispatcher.ERROR_EXCEPTION);
req.getAttributes().remove(RequestDispatcher.ERROR_EXCEPTION);
- if (req.getReadListener() != null) {
+ ReadListener readListener = req.getReadListener();
+ if (readListener != null) {
ClassLoader oldCL =
Thread.currentThread().getContextClassLoader();
ClassLoader newCL =
request.getContext().getLoader().getClassLoader();
try {
Thread.currentThread().setContextClassLoader(newCL);
- req.getReadListener().onError(t);
+ readListener.onError(t);
} finally {
Thread.currentThread().setContextClassLoader(oldCL);
}
@@ -355,8 +357,9 @@ public class CoyoteAdapter implements Ad
// Check to see if non-blocking writes or reads are being used
if (!request.isAsyncDispatching() && request.isAsync()) {
- if (res.getWriteListener() != null &&
- status == SocketStatus.OPEN_WRITE) {
+ WriteListener writeListener = res.getWriteListener();
+ ReadListener readListener = req.getReadListener();
+ if (writeListener != null && status ==
SocketStatus.OPEN_WRITE) {
ClassLoader oldCL =
Thread.currentThread().getContextClassLoader();
ClassLoader newCL =
@@ -364,32 +367,32 @@ public class CoyoteAdapter implements Ad
try {
Thread.currentThread().setContextClassLoader(newCL);
res.onWritePossible();
- if (request.isFinished() &&
req.sendAllDataReadEvent()) {
- req.getReadListener().onAllDataRead();
+ if (request.isFinished() && req.sendAllDataReadEvent()
&&
+ readListener != null) {
+ readListener.onAllDataRead();
}
} catch (Throwable t) {
ExceptionUtils.handleThrowable(t);
- res.getWriteListener().onError(t);
+ writeListener.onError(t);
throw t;
} finally {
Thread.currentThread().setContextClassLoader(oldCL);
}
success = true;
- } else if (req.getReadListener() != null &&
- status == SocketStatus.OPEN_READ) {
+ } else if (readListener != null && status ==
SocketStatus.OPEN_READ) {
ClassLoader oldCL =
Thread.currentThread().getContextClassLoader();
ClassLoader newCL =
request.getContext().getLoader().getClassLoader();
try {
Thread.currentThread().setContextClassLoader(newCL);
- req.getReadListener().onDataAvailable();
+ readListener.onDataAvailable();
if (request.isFinished() &&
req.sendAllDataReadEvent()) {
- req.getReadListener().onAllDataRead();
+ readListener.onAllDataRead();
}
} catch (Throwable t) {
ExceptionUtils.handleThrowable(t);
- req.getReadListener().onError(t);
+ readListener.onError(t);
throw t;
} finally {
Thread.currentThread().setContextClassLoader(oldCL);
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]