<div dir="ltr"><div><div><div><div><div>Thanks Rostislav.<br></div>We&#39;ve been mentioning this briefly with Jim on IRC this morning. It looks like a bug in the way SSE is turned on on server side as a consequence of the specified acceptable media types, which clearly come from the accept header in the request.<br></div>So, I&#39;ve performed a preliminary analysis, I think the SseEventSinkInterceptor should avoid relying on the acceptable media types; instead it should be going through the container request context (which should be a PostMatchRequestContext instance in that case, given there&#39;s no @PreMatching annotation), extract the ResourceMethodInvoker instance from that and finally get access to the corresponding matched resource method/class. Those would then be used to look for <span class="gmail-pl-k">@Produces</span>(<span class="gmail-pl-smi">MediaType</span><span class="gmail-pl-c1"><span class="gmail-pl-k">.</span>SERVER_SENT_EVENTS</span>) and enable SSE.<br></div>Jim, can you work on this please?<br></div>Thanks<br></div>Alessio<br></div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Oct 11, 2017 at 10:26 AM, Rostislav Svoboda <span dir="ltr">&lt;<a href="mailto:rsvoboda@redhat.com" target="_blank">rsvoboda@redhat.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi.<br>
<br>
I played a bit with SSE, example based on <a href="https://www.youtube.com/watch?time_continue=8&amp;v=qQLVCgmiMgQ" rel="noreferrer" target="_blank">https://www.youtube.com/watch?<wbr>time_continue=8&amp;v=qQLVCgmiMgQ</a><br>
Code is here <a href="https://github.com/rsvoboda/rsvoboda-playground/tree/master/ee8-sample-sse" rel="noreferrer" target="_blank">https://github.com/rsvoboda/<wbr>rsvoboda-playground/tree/<wbr>master/ee8-sample-sse</a><br>
<br>
For GlassFish 5 I could do just: curl -i <a href="http://localhost:8080/ee8-sample-sse/resources/beats" rel="noreferrer" target="_blank">http://localhost:8080/ee8-<wbr>sample-sse/resources/beats</a><br>
<br>
But for WF I had to specify Accept header: curl -i -H &quot;Accept: text/event-stream&quot; <a href="http://localhost:8080/ee8-sample-sse/resources/beats" rel="noreferrer" target="_blank">http://localhost:8080/ee8-<wbr>sample-sse/resources/beats</a><br>
When I used curl command which was working on GlassFish 5 I received pretty nasty NPE stacktrace.<br>
<br>
These days people are playing quite a lot with new stuff in EE8, they are using GlassFish 5 and composing their clients (Java, JavaScript, curl / libcurl ) based on this experience (who reads the spec ? when you have RI you can trust;) ).<br>
RESTEasy requirement on Accept header can be pain you_know_where for migration towards JBoss world.<br>
<br>
For sure the error message should be more user friendly and more descriptive.<br>
And I would also vote for more RI like behavior in this case. WDYT ?<br>
<br>
<br>
NPE details:<br>
Error processing request<br>
Context Path:<br>
/ee8-sample<br>
<br>
Servlet Path:<br>
/resources<br>
<br>
Path Info:<br>
/beats<br>
<br>
Query String:<br>
null<br>
<br>
Stack Trace<br>
org.jboss.resteasy.spi.<wbr>UnhandledException: javax.ejb.EJBException: java.lang.NullPointerException<br>
org.jboss.resteasy.core.<wbr>ExceptionHandler.<wbr>handleApplicationException(<wbr>ExceptionHandler.java:78)<br>
org.jboss.resteasy.core.<wbr>ExceptionHandler.<wbr>handleException(<wbr>ExceptionHandler.java:222)<br>
org.jboss.resteasy.core.<wbr>SynchronousDispatcher.<wbr>writeException(<wbr>SynchronousDispatcher.java:<wbr>183)<br>
org.jboss.resteasy.core.<wbr>SynchronousDispatcher.invoke(<wbr>SynchronousDispatcher.java:<wbr>444)<br>
org.jboss.resteasy.core.<wbr>SynchronousDispatcher.lambda$<wbr>invoke$1(<wbr>SynchronousDispatcher.java:<wbr>219)<br>
org.jboss.resteasy.core.<wbr>SynchronousDispatcher.lambda$<wbr>preprocess$0(<wbr>SynchronousDispatcher.java:<wbr>132)<br>
org.jboss.resteasy.core.<wbr>interception.jaxrs.<wbr>PreMatchContainerRequestContex<wbr>t.filter(<wbr>PreMatchContainerRequestContex<wbr>t.java:367)<br>
org.jboss.resteasy.core.<wbr>SynchronousDispatcher.<wbr>preprocess(<wbr>SynchronousDispatcher.java:<wbr>135)<br>
org.jboss.resteasy.core.<wbr>SynchronousDispatcher.invoke(<wbr>SynchronousDispatcher.java:<wbr>205)<br>
org.jboss.resteasy.plugins.<wbr>server.servlet.<wbr>ServletContainerDispatcher.<wbr>service(<wbr>ServletContainerDispatcher.<wbr>java:227)<br>
org.jboss.resteasy.plugins.<wbr>server.servlet.<wbr>HttpServletDispatcher.service(<wbr>HttpServletDispatcher.java:56)<br>
org.jboss.resteasy.plugins.<wbr>server.servlet.<wbr>HttpServletDispatcher.service(<wbr>HttpServletDispatcher.java:51)<br>
javax.servlet.http.<wbr>HttpServlet.service(<wbr>HttpServlet.java:790)<br>
io.undertow.servlet.handlers.<wbr>ServletHandler.handleRequest(<wbr>ServletHandler.java:85)<br>
io.undertow.servlet.handlers.<wbr>security.<wbr>ServletSecurityRoleHandler.<wbr>handleRequest(<wbr>ServletSecurityRoleHandler.<wbr>java:62)<br>
io.undertow.servlet.handlers.<wbr>ServletDispatchingHandler.<wbr>handleRequest(<wbr>ServletDispatchingHandler.<wbr>java:36)<br>
org.wildfly.extension.<wbr>undertow.security.<wbr>SecurityContextAssociationHand<wbr>ler.handleRequest(<wbr>SecurityContextAssociationHand<wbr>ler.java:78)<br>
io.undertow.server.handlers.<wbr>PredicateHandler.<wbr>handleRequest(<wbr>PredicateHandler.java:43)<br>
io.undertow.servlet.handlers.<wbr>security.<wbr>SSLInformationAssociationHandl<wbr>er.handleRequest(<wbr>SSLInformationAssociationHandl<wbr>er.java:131)<br>
io.undertow.servlet.handlers.<wbr>security.<wbr>ServletAuthenticationCallHandl<wbr>er.handleRequest(<wbr>ServletAuthenticationCallHandl<wbr>er.java:57)<br>
io.undertow.server.handlers.<wbr>PredicateHandler.<wbr>handleRequest(<wbr>PredicateHandler.java:43)<br>
io.undertow.security.handlers.<wbr>AbstractConfidentialityHandler<wbr>.handleRequest(<wbr>AbstractConfidentialityHandler<wbr>.java:46)<br>
io.undertow.servlet.handlers.<wbr>security.<wbr>ServletConfidentialityConstrai<wbr>ntHandler.handleRequest(<wbr>ServletConfidentialityConstrai<wbr>ntHandler.java:64)<br>
io.undertow.security.handlers.<wbr>AuthenticationMechanismsHandle<wbr>r.handleRequest(<wbr>AuthenticationMechanismsHandle<wbr>r.java:60)<br>
io.undertow.servlet.handlers.<wbr>security.<wbr>CachedAuthenticatedSessionHand<wbr>ler.handleRequest(<wbr>CachedAuthenticatedSessionHand<wbr>ler.java:77)<br>
io.undertow.security.handlers.<wbr>NotificationReceiverHandler.<wbr>handleRequest(<wbr>NotificationReceiverHandler.<wbr>java:50)<br>
io.undertow.security.handlers.<wbr>AbstractSecurityContextAssocia<wbr>tionHandler.handleRequest(<wbr>AbstractSecurityContextAssocia<wbr>tionHandler.java:43)<br>
io.undertow.server.handlers.<wbr>PredicateHandler.<wbr>handleRequest(<wbr>PredicateHandler.java:43)<br>
org.wildfly.extension.<wbr>undertow.security.jacc.<wbr>JACCContextIdHandler.<wbr>handleRequest(<wbr>JACCContextIdHandler.java:61)<br>
io.undertow.server.handlers.<wbr>PredicateHandler.<wbr>handleRequest(<wbr>PredicateHandler.java:43)<br>
io.undertow.server.handlers.<wbr>PredicateHandler.<wbr>handleRequest(<wbr>PredicateHandler.java:43)<br>
io.undertow.servlet.handlers.<wbr>ServletInitialHandler.<wbr>handleFirstRequest(<wbr>ServletInitialHandler.java:<wbr>292)<br>
io.undertow.servlet.handlers.<wbr>ServletInitialHandler.access$<wbr>100(ServletInitialHandler.<wbr>java:81)<br>
io.undertow.servlet.handlers.<wbr>ServletInitialHandler$2.call(<wbr>ServletInitialHandler.java:<wbr>138)<br>
io.undertow.servlet.handlers.<wbr>ServletInitialHandler$2.call(<wbr>ServletInitialHandler.java:<wbr>135)<br>
io.undertow.servlet.core.<wbr>ServletRequestContextThreadSet<wbr>upAction$1.call(<wbr>ServletRequestContextThreadSet<wbr>upAction.java:48)<br>
io.undertow.servlet.core.<wbr>ContextClassLoaderSetupAction$<wbr>1.call(<wbr>ContextClassLoaderSetupAction.<wbr>java:43)<br>
io.undertow.servlet.api.<wbr>LegacyThreadSetupActionWrapper<wbr>$1.call(<wbr>LegacyThreadSetupActionWrapper<wbr>.java:44)<br>
io.undertow.servlet.api.<wbr>LegacyThreadSetupActionWrapper<wbr>$1.call(<wbr>LegacyThreadSetupActionWrapper<wbr>.java:44)<br>
io.undertow.servlet.api.<wbr>LegacyThreadSetupActionWrapper<wbr>$1.call(<wbr>LegacyThreadSetupActionWrapper<wbr>.java:44)<br>
io.undertow.servlet.api.<wbr>LegacyThreadSetupActionWrapper<wbr>$1.call(<wbr>LegacyThreadSetupActionWrapper<wbr>.java:44)<br>
io.undertow.servlet.api.<wbr>LegacyThreadSetupActionWrapper<wbr>$1.call(<wbr>LegacyThreadSetupActionWrapper<wbr>.java:44)<br>
io.undertow.servlet.handlers.<wbr>ServletInitialHandler.<wbr>dispatchRequest(<wbr>ServletInitialHandler.java:<wbr>272)<br>
io.undertow.servlet.handlers.<wbr>ServletInitialHandler.access$<wbr>000(ServletInitialHandler.<wbr>java:81)<br>
io.undertow.servlet.handlers.<wbr>ServletInitialHandler$1.<wbr>handleRequest(<wbr>ServletInitialHandler.java:<wbr>104)<br>
io.undertow.server.Connectors.<wbr>executeRootHandler(Connectors.<wbr>java:202)<br>
io.undertow.server.<wbr>HttpServerExchange$1.run(<wbr>HttpServerExchange.java:805)<br>
java.util.concurrent.<wbr>ThreadPoolExecutor.runWorker(<wbr>ThreadPoolExecutor.java:1142)<br>
java.util.concurrent.<wbr>ThreadPoolExecutor$Worker.run(<wbr>ThreadPoolExecutor.java:617)<br>
java.lang.Thread.run(Thread.<wbr>java:748)<br>
<br>
<br>
<br>
Rostislav<br>
<br>
______________________________<wbr>_________________<br>
resteasy-dev mailing list<br>
<a href="mailto:resteasy-dev@lists.jboss.org">resteasy-dev@lists.jboss.org</a><br>
<a href="https://lists.jboss.org/mailman/listinfo/resteasy-dev" rel="noreferrer" target="_blank">https://lists.jboss.org/<wbr>mailman/listinfo/resteasy-dev</a><br>
</blockquote></div><br></div>