From 431627958c309652fbde1765a9713c2954a6cd54 Mon Sep 17 00:00:00 2001 From: Mikael Mengistu Date: Wed, 15 Aug 2018 11:35:24 -0700 Subject: [PATCH] Adding support for Close Message (#2793) --- .../aspnet/signalr/CloseMessage.java | 24 ++++++++++++++ .../aspnet/signalr/HubConnection.java | 32 ++++++++++++++----- .../aspnet/signalr/JsonHubProtocol.java | 9 +++++- .../src/test/java/HubConnectionTest.java | 15 +++++++++ .../src/test/java/JsonHubProtocolTest.java | 32 +++++++++++++++++++ 5 files changed, 103 insertions(+), 9 deletions(-) create mode 100644 clients/java/signalr/src/main/java/com/microsoft/aspnet/signalr/CloseMessage.java diff --git a/clients/java/signalr/src/main/java/com/microsoft/aspnet/signalr/CloseMessage.java b/clients/java/signalr/src/main/java/com/microsoft/aspnet/signalr/CloseMessage.java new file mode 100644 index 0000000000..e63821c66a --- /dev/null +++ b/clients/java/signalr/src/main/java/com/microsoft/aspnet/signalr/CloseMessage.java @@ -0,0 +1,24 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +package com.microsoft.aspnet.signalr; + +public class CloseMessage extends HubMessage { + String error; + + @Override + public HubMessageType getMessageType() { + return HubMessageType.CLOSE; + } + + public CloseMessage() { + } + + public CloseMessage(String error) { + this.error = error; + } + + public String getError() { + return this.error; + } +} diff --git a/clients/java/signalr/src/main/java/com/microsoft/aspnet/signalr/HubConnection.java b/clients/java/signalr/src/main/java/com/microsoft/aspnet/signalr/HubConnection.java index 7656f9e06b..f9ca982a37 100644 --- a/clients/java/signalr/src/main/java/com/microsoft/aspnet/signalr/HubConnection.java +++ b/clients/java/signalr/src/main/java/com/microsoft/aspnet/signalr/HubConnection.java @@ -71,17 +71,21 @@ public class HubConnection { logger.log(LogLevel.Warning, "Failed to find handler for %s method", invocationMessage.target); } break; + case CLOSE: + logger.log(LogLevel.Information, "Close message received from server."); + CloseMessage closeMessage = (CloseMessage)message; + stop(closeMessage.getError()); + break; + case PING: + // We don't need to do anything in the case of a ping message. + break; case STREAM_INVOCATION: case STREAM_ITEM: - case CLOSE: case CANCEL_INVOCATION: case COMPLETION: logger.log(LogLevel.Error, "This client does not support %s messages", message.getMessageType()); throw new UnsupportedOperationException(String.format("The message type %s is not supported yet.", message.getMessageType())); - case PING: - // We don't need to do anything in the case of a ping message. - break; } } }; @@ -142,17 +146,29 @@ public class HubConnection { String handshake = HandshakeProtocol.createHandshakeRequestMessage(new HandshakeRequestMessage(protocol.getName(), protocol.getVersion())); transport.send(handshake); connectionState = HubConnectionState.CONNECTED; - logger.log(LogLevel.Information, "HubConnected started"); + logger.log(LogLevel.Information, "HubConnected started."); } /** * Stops a connection to the server. */ - public void stop(){ - logger.log(LogLevel.Debug, "Stopping HubConnection"); + private void stop(String errorMessage) { + if(errorMessage != null){ + logger.log(LogLevel.Error , "HubConnection disconnected with an error %s.", errorMessage); + } else { + logger.log(LogLevel.Debug, "Stopping HubConnection."); + } + transport.stop(); connectionState = HubConnectionState.DISCONNECTED; - logger.log(LogLevel.Information, "HubConnection stopped"); + logger.log(LogLevel.Information, "HubConnection stopped."); + } + + /** + * Stops a connection to the server. + */ + public void stop() { + stop(null); } /** diff --git a/clients/java/signalr/src/main/java/com/microsoft/aspnet/signalr/JsonHubProtocol.java b/clients/java/signalr/src/main/java/com/microsoft/aspnet/signalr/JsonHubProtocol.java index 4bee9e089c..3703afb8d8 100644 --- a/clients/java/signalr/src/main/java/com/microsoft/aspnet/signalr/JsonHubProtocol.java +++ b/clients/java/signalr/src/main/java/com/microsoft/aspnet/signalr/JsonHubProtocol.java @@ -62,7 +62,14 @@ public class JsonHubProtocol implements HubProtocol { hubMessages.add(new PingMessage()); break; case CLOSE: - //Don't care yet; + CloseMessage closeMessage; + if (jsonMessage.has("error")){ + String error = jsonMessage.get("error").getAsString(); + closeMessage = new CloseMessage(error); + } else { + closeMessage = new CloseMessage(); + } + hubMessages.add(closeMessage); break; } } diff --git a/clients/java/signalr/src/test/java/HubConnectionTest.java b/clients/java/signalr/src/test/java/HubConnectionTest.java index 617871d443..59985a8b05 100644 --- a/clients/java/signalr/src/test/java/HubConnectionTest.java +++ b/clients/java/signalr/src/test/java/HubConnectionTest.java @@ -22,6 +22,21 @@ public class HubConnectionTest { assertEquals(HubConnectionState.DISCONNECTED, hubConnection.getConnectionState()); } + @Test + public void HubConnectionClosesAfterCloseMessage() throws Exception { + MockTransport mockTransport = new MockTransport(); + HubConnection hubConnection = new HubConnection("http://example.com", mockTransport); + + hubConnection.start(); + mockTransport.receiveMessage("{}" + RECORD_SEPARATOR); + + assertEquals(HubConnectionState.CONNECTED, hubConnection.getConnectionState()); + + mockTransport.receiveMessage("{\"type\":7,\"error\": \"There was an error\"}" + RECORD_SEPARATOR); + + assertEquals(HubConnectionState.DISCONNECTED, hubConnection.getConnectionState()); + } + @Test public void RegisteringMultipleHandlersAndBothGetTriggered() throws Exception { AtomicReference value = new AtomicReference<>(0.0); diff --git a/clients/java/signalr/src/test/java/JsonHubProtocolTest.java b/clients/java/signalr/src/test/java/JsonHubProtocolTest.java index 31c349e8e5..faa866700d 100644 --- a/clients/java/signalr/src/test/java/JsonHubProtocolTest.java +++ b/clients/java/signalr/src/test/java/JsonHubProtocolTest.java @@ -45,6 +45,38 @@ public class JsonHubProtocolTest { assertEquals(HubMessageType.PING, messages[0].getMessageType()); } + @Test + public void ParseCloseMessage() { + String stringifiedMessage = "{\"type\":7}\u001E"; + HubMessage[] messages = jsonHubProtocol.parseMessages(stringifiedMessage); + + //We know it's only one message + assertEquals(1, messages.length); + + assertEquals(HubMessageType.CLOSE, messages[0].getMessageType()); + + //We can safely cast here because we know that it's a close message. + CloseMessage closeMessage = (CloseMessage) messages[0]; + + assertEquals(null, closeMessage.getError()); + } + + @Test + public void ParseCloseMessageWithError() { + String stringifiedMessage = "{\"type\":7,\"error\": \"There was an error\"}\u001E"; + HubMessage[] messages = jsonHubProtocol.parseMessages(stringifiedMessage); + + //We know it's only one message + assertEquals(1, messages.length); + + assertEquals(HubMessageType.CLOSE, messages[0].getMessageType()); + + //We can safely cast here because we know that it's a close message. + CloseMessage closeMessage = (CloseMessage) messages[0]; + + assertEquals("There was an error", closeMessage.getError()); + } + @Test public void ParseSingleMessage() { String stringifiedMessage = "{\"type\":1,\"target\":\"test\",\"arguments\":[42]}\u001E";