diff --git a/jetty-continuation/src/main/java/org/eclipse/jetty/continuation/Continuation.java b/jetty-continuation/src/main/java/org/eclipse/jetty/continuation/Continuation.java index f4043ef23b4..b1ff48aef47 100644 --- a/jetty-continuation/src/main/java/org/eclipse/jetty/continuation/Continuation.java +++ b/jetty-continuation/src/main/java/org/eclipse/jetty/continuation/Continuation.java @@ -203,5 +203,23 @@ public interface Continuation * @param listener */ void addContinuationListener(ContinuationListener listener); + + + /* ------------------------------------------------------------ */ + /** Get the associated servlet request. + *

+ * Not all request methods are valid to be called outside of the + * scope of a filter/servlet. Specifically servletPath methods will + * not return correct values. The request attribute methods are suitable + * to be called from an asynchronous scope. + * @return The associated servlet request + */ + ServletRequest getServletRequest(); + + /* ------------------------------------------------------------ */ + /** + * @return The associated servlet response. + */ + ServletResponse getServletResponse(); } diff --git a/jetty-continuation/src/main/java/org/eclipse/jetty/continuation/ContinuationFilter.java b/jetty-continuation/src/main/java/org/eclipse/jetty/continuation/ContinuationFilter.java index a8d7a85e366..5797c178d65 100644 --- a/jetty-continuation/src/main/java/org/eclipse/jetty/continuation/ContinuationFilter.java +++ b/jetty-continuation/src/main/java/org/eclipse/jetty/continuation/ContinuationFilter.java @@ -26,7 +26,7 @@ public class ContinuationFilter implements Filter { if (_faux) { - final FauxContinuation fc = new FauxContinuation(); + final FauxContinuation fc = new FauxContinuation(request,response); request.setAttribute(Continuation.ATTRIBUTE,fc); boolean complete=false; @@ -69,17 +69,24 @@ public class ContinuationFilter implements Filter private static final int __SUSPENDED=5; // Suspended and parked private static final int __UNSUSPENDING=6; private static final int __COMPLETE=7; + + private final ServletRequest _request; + private final ServletResponse _response; private int _state=__HANDLING; private boolean _initial=true; private boolean _resumed=false; private boolean _timeout=false; private boolean _keepWrappers=false; - private long _timeoutMs=30000; // TODO configure private ArrayList _listeners; + FauxContinuation(final ServletRequest request,final ServletResponse response) + { + _request=request; + _response=response; + } /* ------------------------------------------------------------ */ /** @@ -255,6 +262,24 @@ public class ContinuationFilter implements Filter } + + /* ------------------------------------------------------------ */ + /** + * @see org.eclipse.jetty.continuation.Continuation#getServletRequest() + */ + public ServletRequest getServletRequest() + { + return _request; + } + + /* ------------------------------------------------------------ */ + /** + * @see org.eclipse.jetty.continuation.Continuation#getServletResponse() + */ + public ServletResponse getServletResponse() + { + return _response; + } void handling() diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/AsyncRequest.java b/jetty-server/src/main/java/org/eclipse/jetty/server/AsyncRequest.java index cdaf86957c3..820a2351b05 100644 --- a/jetty-server/src/main/java/org/eclipse/jetty/server/AsyncRequest.java +++ b/jetty-server/src/main/java/org/eclipse/jetty/server/AsyncRequest.java @@ -744,6 +744,24 @@ public class AsyncRequest implements AsyncContext, Continuation AsyncRequest.this.suspend(_connection.getRequest().getServletContext(),_connection.getRequest(),_connection.getResponse()); } + /* ------------------------------------------------------------ */ + /** + * @see org.eclipse.jetty.continuation.Continuation#getServletRequest() + */ + public ServletRequest getServletRequest() + { + return _connection.getRequest(); + } + + /* ------------------------------------------------------------ */ + /** + * @see org.eclipse.jetty.continuation.Continuation#getServletResponse() + */ + public ServletResponse getServletResponse() + { + return _connection.getResponse(); + } + /* ------------------------------------------------------------ */ /* ------------------------------------------------------------ */ public class AsyncEventState implements ContinuationEvent