Push (manual, long-polling transport) throws exeption in Safari

I am using Vaadin 7.2.5 on Tomcat 8.0.9 with push enabled manual with the transport of long-polling. It seems to work okay on most browsers, but on my Windows Safari browser (5.1.7) I get many ongoing exceptions (with slow UI, but rarely an actual error shown though that seems related as there’s an exception in my Notification.show too).

No exceptions are thrown with the latest Firefox, Chrome, IE or Opera, just Safari.

These same 3 exceptions are thrown repeatedly when using Safari.

[size=2]
[font=courier new]
Jul 31, 2014 9:15:46 AM org.atmosphere.cpr.AtmosphereFramework doCometSupport
SEVERE: AtmosphereFramework exception
java.lang.IllegalStateException: A filter or servlet of the current chain does not support asynchronous operations.
at org.apache.catalina.connector.Request.startAsync(Request.java:1604)
at org.apache.catalina.connector.RequestFacade.startAsync(RequestFacade.java:1037)
at javax.servlet.ServletRequestWrapper.startAsync(ServletRequestWrapper.java:384)
at org.atmosphere.cpr.AtmosphereRequest.startAsync(AtmosphereRequest.java:678)
at org.atmosphere.container.Servlet30CometSupport.suspend(Servlet30CometSupport.java:93)
at org.atmosphere.container.Servlet30CometSupport.service(Servlet30CometSupport.java:68)
at org.atmosphere.cpr.AtmosphereFramework.doCometSupport(AtmosphereFramework.java:1802)
at com.vaadin.server.communication.PushRequestHandler.handleRequest(PushRequestHandler.java:144)
at com.vaadin.server.VaadinService.handleRequest(VaadinService.java:1408)
at com.vaadin.server.VaadinServlet.service(VaadinServlet.java:237)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.filters.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:108)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.filters.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:108)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:615)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:136)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:526)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1078)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:655)
at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:222)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1566)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1523)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)

Jul 31, 2014 9:15:46 AM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [OpenESignFormsVaadin7Application]
in context with path
[/demo] threw exception
java.lang.NullPointerException
at com.vaadin.ui.Notification.show(Notification.java:378)
at com.vaadin.ui.Notification.show(Notification.java:436)
at com.esignforms.open.vaadin.EsfVaadinUI.showError(EsfVaadinUI.java:648)
at com.esignforms.open.vaadin.EsfVaadinUI.showPlatformError(EsfVaadinUI.java:145)
at com.esignforms.open.vaadin.EsfVaadinUI$1.error(EsfVaadinUI.java:120)
at com.vaadin.server.VaadinService.handleExceptionDuringRequest(VaadinService.java:1462)
at com.vaadin.server.VaadinService.handleRequest(VaadinService.java:1420)
at com.vaadin.server.VaadinServlet.service(VaadinServlet.java:237)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.filters.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:108)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.filters.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:108)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:615)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:136)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:526)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1078)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:655)
at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:222)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1566)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1523)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)

Jul 31, 2014 9:15:46 AM org.apache.catalina.core.ApplicationDispatcher invoke
SEVERE: Servlet.service() for servlet jsp threw exception
java.lang.IllegalStateException: getOutputStream() has already been called for this response
at org.apache.catalina.connector.Response.getWriter(Response.java:548)
at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:212)
at javax.servlet.ServletResponseWrapper.getWriter(ServletResponseWrapper.java:103)
at org.apache.jasper.runtime.JspWriterImpl.initOut(JspWriterImpl.java:115)
at org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:108)
at org.apache.jasper.runtime.PageContextImpl.release(PageContextImpl.java:173)
at org.apache.jasper.runtime.JspFactoryImpl.internalReleasePageContext(JspFactoryImpl.java:120)
at org.apache.jasper.runtime.JspFactoryImpl.releasePageContext(JspFactoryImpl.java:75)
at org.apache.jsp.error.exception_jsp._jspService(exception_jsp.java:173)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:405)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:349)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:721)
at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:584)
at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:523)
at org.apache.catalina.core.StandardHostValve.custom(StandardHostValve.java:417)
at org.apache.catalina.core.StandardHostValve.throwable(StandardHostValve.java:367)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:166)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:526)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1078)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:655)
at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:222)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1566)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1523)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)
[/font]
[/size]

I am doing UI.push() manually after a 250msec delay in my VaadinServletService’s requestEnd() callback:

            @Override
            public void requestEnd(VaadinRequest request, VaadinResponse response, final VaadinSession session) {
                if ( session != null ) {
                    for( com.vaadin.ui.UI vaadin : session.getUIs() ) {
                        if ( vaadin instanceof EsfVaadinUI ) {
                            final EsfVaadinUI vaadinUi = (EsfVaadinUI)vaadin;
                            MainView mainView = vaadinUi.getMainView();
                            if ( mainView != null ) {
                                String localRequestUrl = ServletUtil.getLocalRequestUrl((HttpServletRequest)request);
                                if ( ! localRequestUrl.contains("/HEARTBEAT/") ) { // Heartbeats don't count for a client update
                                    mainView.updateLastServerCommunications(vaadinUi);
                                }
                                // TODO: Hack to see if we can use manual push and download PDFs!
                                if ( vaadinUi.getPushConfiguration().getPushMode() != PushMode.DISABLED ) {
                                    vaadinUi.access(new Runnable() {
                                        @Override
                                        public void run() {
                                            if ( session.getState() == VaadinSession.State.OPEN ) {
                                                vaadinUi.getEsfapp().sleep(250);
                                                vaadinUi.push();
                                            }
                                        }
                                    });
                                }
                            }
                        }
                    }
                }
                
                super.requestEnd(request, response, session);
            }

With no workaround or response, I now test for Safari and disable push in our UI.init().

        if ( Page.getCurrent().getWebBrowser().isSafari() && getPushConfiguration().getPushMode().isEnabled() ) {
            _logger.warn("init() - Turning off PUSH for the Safari browser...");
            getPushConfiguration().setPushMode(PushMode.DISABLED);
        }

Hi,

You might want to upgrade that Safari as Vaadin 7 only supports Safari 6 or newer. Have you tested Safari 6 or 7 on Mac to see if you have the same issue there? Based on the stack traces it’s hard to see how this could be related to Safari at all.

I don’t have a Mac, but my Safari is version 5.1.7 on Windows. I hadn’t realized that it appears that Apple no longer supports Safari on Windows, hence the old version. I’ll have to abandon Safari testing on Windows as a stopgap. I wonder if I can convince the company to get me a new Macbook Pro so I can!

I’m not sure about the browser (Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/600.1.17 (KHTML, like Gecko) Version/7.1 Safari/537.85.10), but we’re still seeing this exception being logged when we enable push:

2014-12-07 19:15:19,473 ERROR (com.esignforms.open.vaadin.EsfVaadinUI) init().VaadinSession.ErrorHandler.error()
java.lang.IllegalStateException: A filter or servlet of the current chain does not support asynchronous operations.
        at org.apache.catalina.connector.Request.startAsync(Request.java:1604)
        at org.apache.catalina.connector.RequestFacade.startAsync(RequestFacade.java:1037)
        at javax.servlet.ServletRequestWrapper.startAsync(ServletRequestWrapper.java:392)
        at org.atmosphere.cpr.AtmosphereRequest.startAsync(AtmosphereRequest.java:678)
        at org.atmosphere.container.Servlet30CometSupport.suspend(Servlet30CometSupport.java:93)
        at org.atmosphere.container.Servlet30CometSupport.service(Servlet30CometSupport.java:68)
        at org.atmosphere.cpr.AtmosphereFramework.doCometSupport(AtmosphereFramework.java:1802)
        at com.vaadin.server.communication.PushRequestHandler.handleRequest(PushRequestHandler.java:144)
        at com.vaadin.server.VaadinService.handleRequest(VaadinService.java:1406)
        at com.vaadin.server.VaadinServlet.service(VaadinServlet.java:305)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:725)

Hi same problem here,
using vaadin7.6beta2 with tomcat7 and chrome. any solutions ?

Caused by: java.lang.IllegalStateException: A filter or servlet of the current chain does not support asynchronous operations.
at org.apache.catalina.connector.Request.startAsync(Request.java:1658)
at org.apache.catalina.connector.RequestFacade.startAsync(RequestFacade.java:1029)
at javax.servlet.ServletRequestWrapper.startAsync(ServletRequestWrapper.java:379)
at org.atmosphere.cpr.AtmosphereRequest.startAsync(AtmosphereRequest.java:723)
at org.atmosphere.container.Servlet30CometSupport.suspend(Servlet30CometSupport.java:93)
at org.atmosphere.container.Servlet30CometSupport.service(Servlet30CometSupport.java:68)
at org.atmosphere.container.Tomcat7Servlet30SupportWithWebSocket.doService(Tomcat7Servlet30SupportWithWebSocket.java:67)
at org.atmosphere.container.TomcatWebSocketUtil.doService(TomcatWebSocketUtil.java:98)
at org.atmosphere.container.Tomcat7Servlet30SupportWithWebSocket.service(Tomcat7Servlet30SupportWithWebSocket.java:62)
at org.atmosphere.cpr.AtmosphereFramework.doCometSupport(AtmosphereFramework.java:2075)
at com.vaadin.server.communication.PushRequestHandler.handleRequest(PushRequestHandler.java:247)
at com.vaadin.server.VaadinService.handleRequest(VaadinService.java:1409)
… 22 more

Make sure that your servlet and any possible servlet filters support asynchronous operations, i.e. have set to true

Thanks for the quick response
Sure, my bad, I thought i did it right already. but I miss-spelled and totally overlooked
true

Hi Artur,
I am having following Problem with PUSH und Tomcat
7.0.55
. I am Using Vaadin
7.5.10

Tranport :

Websocket

= everything works ok except i can’t invalidate session (i.e. FakeHttpSession)
Tranport :

Streaming/



LongPooling

: I get following error. the error has been mentioned in
vaadin

Wiki
as well :

Apperantly, the following error occurs while using Firefox. Everything seems to be fine in Chrome.


Duplicate resource


xyz
[b]

[/b]
abc

-def-ghi-

jkl

. Could be caused by a dead connection not detected by your server. Replacing the old one with the fresh one

I am not intentionally using any Proxy. I test it under eclipse.
Do you have any tips for me. I need to use session. invalidate() at logout. otherwise websocket would have been a fine choice for us.

Do you have any way of reproducing the duplicate resource problem with Firefox?

Vaadin 7.6 will have a new transport WEBSOCKET_XHR, which means that it will use websockets only to push data and a standard XHR request for everything else. That might help if you want to invalidate the session as a result of a user action and not from a background thread.

Unfortunately, I can’t reporduce it in the normal example project. But I can easily reproduce it using our application in Firefox. I can only offer a remote debugging session per Teamviewer or so…