Version 2

    RESTEasy Interceptors (Proposed Feature)

    A number of new ideas have cropped up on the RESTEasy developers list that indicate that adding some type of request/response interceptor API to RESTEasy could aid in adding these features. Such features include:

     

    1. RESTEasy Server-Side Caching API Ideas
    2. Content Negotiation customization
    3. GZip Input/Output streams
    4. Security

     

    There could more, but you get the point. Below are a few approaches we could take.

    Filter-Style Interceptor

    This type of interceptor looks similar to a Servelt Filter and provides access to the raw request and response. more details TDB.

     

    Annotation-based Interceptor

    The annotation approach allows the developer to define specific points in the request/response lifecycle where we can alter the process. There are a few directions we could take this such as having really broad point cuts like @BeforeRequest and @AfterRequest. Or, we could have more fine grained pointcuts such as:

     

    • @BeforeResresource: executes after the request has been processed, but before the resource method has been invoked
    • @AfterResource: executes after the resource method has been executed, but before the MessageBodyWriter is invoked
    • @BeforeWriter: after the request has been provecces and the resource method has been executed, but before the invocation of the MessgaeBodyWriter
    • @AfterWriter: executed after the message body reader
    • @BeforeReader: executed before the MessageBodyReader is executed
    • @AfterReader: executed after the MessageBodyReade, but before the resource method
    • Perhaps more? (some of these maybe redundant, but we'll work that out)

     

    An interceptor might end up looking something like this:

     

     

    @Provider

    @Interceptor

    public class CacheControlInterceptor

    {

       @BeforeResource

       public Response checkCache(@Context HttpRequest request,

                  @Context HttpResponse response,

                  @Context RequestContext ctx)

       {

          ...check the cache...

       }



       @BeforeWriter

       public void addCacheControlHeaders(@Context HttpResponse response

                                          @Context RequestContext ctx)

       {

          ... write some cache control headers...

       }


       @AfterWriter

       public void grabBytesToMarshall(@Context HttpResponse response

                                       @Context RequestContext) {

       }

    }

     

     

    Unresolved Issues

    One thing that still needs to get worked out if how to declare precedence of interceptors, what gets executed first, etc.