From: Artur Signell Date: Fri, 20 Feb 2015 13:56:30 +0000 (+0200) Subject: Ensure resource is valid before writing to it (#16862) X-Git-Tag: 7.4.1~54 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=e317772cca009d00d0959f8df7c650e8422bb548;p=vaadin-framework.git Ensure resource is valid before writing to it (#16862) Change-Id: I61e0003a2301100a5f0bfc18581a279207c4e812 --- diff --git a/server/src/com/vaadin/server/communication/PushHandler.java b/server/src/com/vaadin/server/communication/PushHandler.java index 6ee81270cd..7e7183193a 100644 --- a/server/src/com/vaadin/server/communication/PushHandler.java +++ b/server/src/com/vaadin/server/communication/PushHandler.java @@ -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) {