]> source.dussan.org Git - vaadin-framework.git/commitdiff
Ensure resource is valid before writing to it (#16862)
authorArtur Signell <artur@vaadin.com>
Fri, 20 Feb 2015 13:56:30 +0000 (15:56 +0200)
committerArtur Signell <artur@vaadin.com>
Fri, 20 Feb 2015 18:03:42 +0000 (20:03 +0200)
Change-Id: I61e0003a2301100a5f0bfc18581a279207c4e812

server/src/com/vaadin/server/communication/PushHandler.java

index 6ee81270cdb5981e4490afc2333c0d7a40249d72..7e7183193a3270e3aada9f578919eddc97f0f0b7 100644 (file)
@@ -28,6 +28,7 @@ import org.atmosphere.cpr.AtmosphereResource;
 import org.atmosphere.cpr.AtmosphereResource.TRANSPORT;
 import org.atmosphere.cpr.AtmosphereResourceEvent;
 import org.atmosphere.cpr.AtmosphereResourceEventListenerAdapter;
+import org.atmosphere.cpr.AtmosphereResourceImpl;
 import org.atmosphere.handler.AbstractReflectorAtmosphereHandler;
 
 import com.vaadin.server.ErrorEvent;
@@ -45,6 +46,7 @@ import com.vaadin.server.VaadinSession;
 import com.vaadin.shared.ApplicationConstants;
 import com.vaadin.shared.communication.PushMode;
 import com.vaadin.ui.UI;
+
 import elemental.json.JsonException;
 
 /**
@@ -472,6 +474,15 @@ public class PushHandler extends AtmosphereResourceEventListenerAdapter {
      */
     private static void sendRefreshAndDisconnect(AtmosphereResource resource)
             throws IOException {
+        if (resource instanceof AtmosphereResourceImpl
+                && !((AtmosphereResourceImpl) resource).isInScope()) {
+            // The resource is no longer valid so we should not write
+            // anything to it
+            getLogger()
+                    .fine("sendRefreshAndDisconnect called for resource no longer in scope");
+            return;
+        }
+
         AtmospherePushConnection connection = new AtmospherePushConnection(null);
         connection.connect(resource);
         try {
@@ -490,6 +501,14 @@ public class PushHandler extends AtmosphereResourceEventListenerAdapter {
             AtmosphereResource resource, String notificationJson) {
         // TODO Implemented differently from sendRefreshAndDisconnect
         try {
+            if (resource instanceof AtmosphereResourceImpl
+                    && !((AtmosphereResourceImpl) resource).isInScope()) {
+                // The resource is no longer valid so we should not write
+                // anything to it
+                getLogger()
+                        .fine("sendNotificationAndDisconnect called for resource no longer in scope");
+                return;
+            }
             resource.getResponse().getWriter().write(notificationJson);
             resource.resume();
         } catch (Exception e) {