[
https://issues.apache.org/jira/browse/CXF-8215?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17059381#comment-17059381
]
Markus Rathgeb commented on CXF-8215:
-------------------------------------
[~csierra] Do you plan to add the latest snapshot into an Aries JAX-RS
Whiteboard snapshot build?
> SSE breaks Pipeline Processing
> ------------------------------
>
> Key: CXF-8215
> URL: https://issues.apache.org/jira/browse/CXF-8215
> Project: CXF
> Issue Type: Bug
> Components: JAX-RS
> Affects Versions: 3.3.5, 3.2.12
> Reporter: Markus Rathgeb
> Assignee: Andriy Redko
> Priority: Major
> Fix For: 3.4.0, 3.3.6, 3.2.13
>
> Time Spent: 20m
> Remaining Estimate: 0h
>
> Hi,
> I am using the Aries JAX-RS Whiteboard implementation that is using CXF
> internally.
> I realized a behavior that does not match my expectation, so I checked the
> JAX-RS specification and IMHO the current behavior is wrong.
> I opened an issue for Aires JAX-RS Whiteboard and have been told that it
> should be filled for CXF.
> I could copy the whole initial description of the other issue to this one or
> link it (https://issues.apache.org/jira/browse/ARIES-1968)... I assume that
> all information should be added to the issue for the specific project, so I
> copy it:
>
> 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)