On Tue, Nov 12, 2019 at 8:44 AM Joakim Erdfelt <[email protected]> wrote:
> AsyncContext within a Filter is not brittle. > > We have a DoSFilter that uses it just fine. > > https://github.com/eclipse/jetty.project/blob/jetty-9.4.x/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/DoSFilter.java > > AsyncContext itself has many rules that you have to follow. > > > Basically, how do I know when the filter chain has completed? I need to > set a cookie, but only at the very end of the request. > > "At the very end of the request" would be well after the committed state > has been reached. > Once you have a committed response you cannot change the headers any more > as the response headers have been sent already, this is normal servlet > behavior, and applies to all usages (async or not). > I wasn't clear enough, before committing obviously. > > Unfortunately, there's no servlet mechanism to hook into the "about to go > committed" event. > My solution, which may fail in certain edge cases, was to wrap the response and set the cookie when `setStatus` is called, which generally only happens when result is about to be committed. This works fine (for now), but obviously is also a little brittle, as it relies on assumptions that doesn't always hold. > Cookies are special and will be applied regardless of the dispatch > (normal, async, error, include, forward, etc). > They will never be cleared / rewritten by servlet container behaviors once > set. > Why do you want to wait till the end of the request to set it? > Why not set the Cookie before you execute the filter chain? > The content is dependent on what happens in multiple steps in the servlet(s), as I explained in my response to Simon. > > While the HTTP spec has a concept of Trailers, which would allow for > setting Cookies after the request, using Trailers from within the Servlet > spec isn't easy. > And not all HTTP clients (some browsers included) support Trailers. > Right, isn't that the problem with getting gRPC to work natively in browsers? > > Joakim Erdfelt / [email protected] > > > On Tue, Nov 12, 2019 at 8:26 AM Nils Kilden-Pedersen <[email protected]> > wrote: > >> I did try that, but it failed: >> >> java.lang.IllegalStateException: s=HANDLING rs=BLOCKING os=OPEN is=READY >> awp=false se=false i=true al=0 >> at org.eclipse.jetty.server.Request.getAsyncContext(Request.java:592) >> >> I didn’t pursue this much further, because it seemed to be fundamentally >> brittle. >> >> Also, isn’t the response fully committed when AsyncContext.complete() is >> called, i.e. it’s too late to set headers, such as cookies? >> >> >> On Mon, Nov 11, 2019 at 4:42 PM Simone Bordet <[email protected]> >> wrote: >> >>> Hi, >>> >>> On Mon, Nov 11, 2019 at 5:25 PM Nils Kilden-Pedersen <[email protected]> >>> wrote: >>> > >>> > I can't seem to find much information on how to code async filters. >>> > >>> > Basically, how do I know when the filter chain has completed? I need >>> to set a cookie, but only at the very end of the request. >>> >>> You use Servlet's AsyncListener and implement onComplete(). >>> >>> -- >>> Simone Bordet >>> ---- >>> http://cometd.org >>> http://webtide.com >>> Developer advice, training, services and support >>> from the Jetty & CometD experts. >>> _______________________________________________ >>> jetty-users mailing list >>> [email protected] >>> To change your delivery options, retrieve your password, or unsubscribe >>> from this list, visit >>> https://www.eclipse.org/mailman/listinfo/jetty-users >>> >> _______________________________________________ >> jetty-users mailing list >> [email protected] >> To change your delivery options, retrieve your password, or unsubscribe >> from this list, visit >> https://www.eclipse.org/mailman/listinfo/jetty-users > > _______________________________________________ > jetty-users mailing list > [email protected] > To change your delivery options, retrieve your password, or unsubscribe > from this list, visit > https://www.eclipse.org/mailman/listinfo/jetty-users
_______________________________________________ jetty-users mailing list [email protected] To change your delivery options, retrieve your password, or unsubscribe from this list, visit https://www.eclipse.org/mailman/listinfo/jetty-users
