From: fhanik Date: Tue, 30 Mar 2010 16:03:32 +0000 (+0000) Subject: Clear up state handling a bit X-Git-Url: https://git.internetallee.de/?a=commitdiff_plain;h=68ff50491508e4f0e4452aae3eea15e62e6feb79;p=tomcat7.0 Clear up state handling a bit git-svn-id: https://svn.apache.org/repos/asf/tomcat/trunk@929181 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/java/org/apache/catalina/connector/CoyoteAdapter.java b/java/org/apache/catalina/connector/CoyoteAdapter.java index b71fe1d00..7ba0610e0 100644 --- a/java/org/apache/catalina/connector/CoyoteAdapter.java +++ b/java/org/apache/catalina/connector/CoyoteAdapter.java @@ -280,7 +280,7 @@ public class CoyoteAdapter implements Adapter { AsyncContextImpl asyncConImpl = (AsyncContextImpl)request.getAsyncContext(); //TODO SERVLET3 - async //configure settings for timed out - asyncConImpl.setErrorState(); + asyncConImpl.setErrorState(new IOException("Socket error.")); } while (success) { AsyncContextImpl impl = (AsyncContextImpl)request.getAsyncContext(); @@ -302,12 +302,15 @@ public class CoyoteAdapter implements Adapter { //TODO SERVLET3 - async async = false; break; + } else if (impl.getState()==AsyncContextImpl.AsyncState.ERROR_DISPATCHING) { + async = false; + success = false; + connector.getContainer().getPipeline().getFirst().invoke(request, response); } else { try { connector.getContainer().getPipeline().getFirst().invoke(request, response); - }catch (RuntimeException x) { - success = false; - } finally { + } catch (RuntimeException x) { + impl.setErrorState(x); } } } @@ -394,7 +397,7 @@ public class CoyoteAdapter implements Adapter { } boolean comet = false; - boolean async = request.isAsyncStarted(); + boolean async = false; try { @@ -431,12 +434,12 @@ public class CoyoteAdapter implements Adapter { if (asyncConImpl!=null && asyncConImpl.getState()==AsyncContextImpl.AsyncState.STARTED) { res.action(ActionCode.ACTION_ASYNC_START, request.getAsyncContext()); async = true; - } else if (asyncConImpl!=null && - (asyncConImpl.getState()==AsyncContextImpl.AsyncState.DISPATCHING || - asyncConImpl.getState()==AsyncContextImpl.AsyncState.COMPLETING || - asyncConImpl.getState()==AsyncContextImpl.AsyncState.TIMING_OUT || - asyncConImpl.getState()==AsyncContextImpl.AsyncState.ERROR_DISPATCHING)) { + } else if (request.isAsyncDispatching()) { asyncDispatch(req, res, SocketStatus.OPEN); + if (request.isAsyncStarted()) { + async = true; + res.action(ActionCode.ACTION_ASYNC_START, request.getAsyncContext()); + } } else if (!comet) { response.finishResponse(); req.action(ActionCode.ACTION_POST_REQUEST , null); diff --git a/java/org/apache/catalina/core/AsyncContextImpl.java b/java/org/apache/catalina/core/AsyncContextImpl.java index c699bdede..b3c800f8a 100644 --- a/java/org/apache/catalina/core/AsyncContextImpl.java +++ b/java/org/apache/catalina/core/AsyncContextImpl.java @@ -389,7 +389,8 @@ public class AsyncContextImpl implements AsyncContext { state.set(AsyncState.TIMING_OUT); } - public void setErrorState() { + public void setErrorState(Throwable t) { + if (t!=null) request.setAttribute(RequestDispatcher.ERROR_EXCEPTION, t); state.set(AsyncState.ERROR_DISPATCHING); } diff --git a/java/org/apache/coyote/http11/Http11Processor.java b/java/org/apache/coyote/http11/Http11Processor.java index 54bd9a907..a881746ce 100644 --- a/java/org/apache/coyote/http11/Http11Processor.java +++ b/java/org/apache/coyote/http11/Http11Processor.java @@ -318,21 +318,19 @@ public class Http11Processor extends AbstractHttp11Processor implements ActionHo } rp.setStage(org.apache.coyote.Constants.STAGE_ENDED); - if (async) { - if (error) { - recycle(); - return SocketState.CLOSED; - } else { - return SocketState.LONG; - } + if (error) { + recycle(); + return SocketState.CLOSED; + } else if (async) { + return SocketState.LONG; } else { - if ( error || (!keepAlive)) { + if (!keepAlive) { recycle(); return SocketState.CLOSED; } else { return SocketState.OPEN; } - } + } } @@ -353,15 +351,13 @@ public class Http11Processor extends AbstractHttp11Processor implements ActionHo rp.setStage(org.apache.coyote.Constants.STAGE_ENDED); - if (async) { - if (error) { - recycle(); - return SocketState.CLOSED; - } else { - return SocketState.LONG; - } + if (error) { + recycle(); + return SocketState.CLOSED; + } else if (async) { + return SocketState.LONG; } else { - if ( error || (!keepAlive)) { + if (!keepAlive) { recycle(); return SocketState.CLOSED; } else {