[ https://issues.apache.org/jira/browse/ARIES-1968?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17075882#comment-17075882 ]
ASF subversion and git services commented on ARIES-1968: -------------------------------------------------------- Commit 14b8acaf0d70069813ee7ffd1f9d9943305385d6 in aries-jax-rs-whiteboard's branch refs/heads/master from Raymond Auge [ https://gitbox.apache.org/repos/asf?p=aries-jax-rs-whiteboard.git;h=14b8aca ] [ARIES-1968] use released version Signed-off-by: Raymond Auge <rotty3...@apache.org> > SSE breaks Pipeline Processing > ------------------------------ > > Key: ARIES-1968 > URL: https://issues.apache.org/jira/browse/ARIES-1968 > Project: Aries > Issue Type: Bug > Components: jax-rs-whiteboard > Affects Versions: jax-rs-whiteboard-1.0.5, jax-rs-whiteboard-1.0.7, > jax-rs-whiteboard-1.0.6 > Reporter: Markus Rathgeb > Priority: Major > > The JAX-RS Specification 2.1 contains the chapter 9 for "Server-Sent Events". > The chapter 9.5 "Pipeline Processing" declares: > {quote}For compatibility purposes, implementations MUST initiate processing > of an SSE response when either the first message is sent or when the resource > method returns, whichever happens first. The initial SSE response, which may > only include the HTTP headers, is processed using the standard JAX-RS > pipeline as described in Appendix C. Each subsequent SSE event may include a > different payload and thus require the use of a specific message body writer. > Note that since this use case differs slightly from the normal JAX-RS > pipeline, implementations SHOULD NOT call entity interceptors on each > individual event (1). > {quote} > So, the initial SSE response is processes using the standard JAX-RS pipeline > (Appendix C). > Appendix C indicates that in front of the method invocation the "Container > Request Chain" is handled and after the method invocation the "Container > Response Chain" is handled. > > The container response chain is currently not handled for the first response! > It is also not handled for the other reponses, but this is expected. > > I checked v1.0.5, v1.0.6 and v1.0.7 all seems to be broken for me. > > h2. Test code: > > {code:java} > @Component(service = Application.class) > @JaxrsName("rest") > @JaxrsApplicationBase("rest") > public class RESTApplicationImpl extends Application { > }{code} > > > {code:java} > @Component(service = { RESTResource.class }) > @JaxrsResource > @JaxrsName("foo") > @JaxrsApplicationSelect("(" + JaxrsWhiteboardConstants.JAX_RS_NAME + "=rest)") > @Path("/foo") > public class RESTResource { > @GET > @Path("normal") > public Response normal() { > System.out.println("handle endpoint \"normal\""); > return Response.ok().build(); > } > @GET > @Path("sse") > @Produces(MediaType.SERVER_SENT_EVENTS) > public void sse(@Context final SseEventSink eventSink, @Context final Sse > sse) { > System.out.println("handle endpoint \"sse\""); > final ExecutorService executor = Executors.newSingleThreadExecutor(); > executor.execute(() -> { > try (SseEventSink sink = eventSink) { > eventSink.send(sse.newEvent("event1")); > eventSink.send(sse.newEvent("event2")); > } > }); > executor.shutdown(); > } > } > {code} > > > {code:java} > @Component > @JaxrsExtension > @JaxrsApplicationSelect("(" + JaxrsWhiteboardConstants.JAX_RS_NAME + "=rest)") > public class SimpleRequestFilter implements ContainerRequestFilter { > @Override > public void filter(final ContainerRequestContext context) { > System.out.println("simple request filter"); > } > } > {code} > > > {code:java} > @Component > @JaxrsExtension > @JaxrsApplicationSelect("(" + JaxrsWhiteboardConstants.JAX_RS_NAME + "=rest)") > public class SimpleResponseFilter implements ContainerResponseFilter { > @Override > public void filter(final ContainerRequestContext requestContext, final > ContainerResponseContext responseContext) > throws IOException { > System.out.println("simple response filter"); > } > } > {code} > > > h2. Test: > On a GET request to "http://127.0.0.1:8080/rest/foo/normal" is see (on the > server console): > > {noformat} > simple request filter > handle endpoint "normal" > simple response filter{noformat} > > On a GET request to "http://127.0.0.1:8080/rest/foo/sse" is see (on the > server console): > {noformat} > simple request filter > handle endpoint "sse"{noformat} > > As the normal processing pipeline must be applied for the first SSE reponse I > would expect "simple response filter" is shown once, too. > > In my application there is a ContainerResponseFilter to allow (configurable) > CORS. If it is enabled, the headers that allow the cross-origin access are > added. > This needs to be added to the initial header (first response) of the SSE > connection, too. -- This message was sent by Atlassian Jira (v8.3.4#803005)