diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/websocket/WebSocketConnection.java b/service/src/main/java/org/whispersystems/textsecuregcm/websocket/WebSocketConnection.java index d2e0cc4e..c7a58247 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/websocket/WebSocketConnection.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/websocket/WebSocketConnection.java @@ -53,6 +53,7 @@ import org.whispersystems.textsecuregcm.storage.MessagesManager; import org.whispersystems.textsecuregcm.util.Constants; import org.whispersystems.textsecuregcm.util.HeaderUtils; import org.whispersystems.websocket.WebSocketClient; +import org.whispersystems.websocket.WebSocketResourceProvider; import org.whispersystems.websocket.messages.WebSocketResponseMessage; import reactor.core.Disposable; import reactor.core.observability.micrometer.Micrometer; @@ -395,6 +396,8 @@ public class WebSocketConnection implements MessageAvailabilityListener, Displac errorType = "timeout"; } else if (e instanceof java.nio.channels.ClosedChannelException) { errorType = "closedChannel"; + } else if (e == WebSocketResourceProvider.CONNECTION_CLOSED_EXCEPTION) { + errorType = "connectionClosed"; } else { logger.warn(terminal ? "Send message failure terminated stream" : "Send message failed", e); errorType = "other"; diff --git a/websocket-resources/src/main/java/org/whispersystems/websocket/WebSocketResourceProvider.java b/websocket-resources/src/main/java/org/whispersystems/websocket/WebSocketResourceProvider.java index 32db3851..31faeaef 100644 --- a/websocket-resources/src/main/java/org/whispersystems/websocket/WebSocketResourceProvider.java +++ b/websocket-resources/src/main/java/org/whispersystems/websocket/WebSocketResourceProvider.java @@ -47,6 +47,11 @@ import java.util.concurrent.ConcurrentHashMap; @SuppressWarnings("OptionalUsedAsFieldOrParameterType") public class WebSocketResourceProvider implements WebSocketListener { + /** + * A static exception instance passed to outstanding requests (via {@code completeExceptionally} in + * {@link #onWebSocketClose(int, String)} + */ + public static final IOException CONNECTION_CLOSED_EXCEPTION = new IOException("Connection closed!"); private static final Logger logger = LoggerFactory.getLogger(WebSocketResourceProvider.class); private final Map> requestMap = new ConcurrentHashMap<>(); @@ -141,7 +146,7 @@ public class WebSocketResourceProvider implements WebSocket CompletableFuture outstandingRequest = requestMap.remove(requestId); if (outstandingRequest != null) { - outstandingRequest.completeExceptionally(new IOException("Connection closed!")); + outstandingRequest.completeExceptionally(CONNECTION_CLOSED_EXCEPTION); } } }