Adding support for Close Message (#2793)

This commit is contained in:
Mikael Mengistu 2018-08-15 11:35:24 -07:00 committed by GitHub
parent 85c934dcdd
commit 431627958c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 103 additions and 9 deletions

View File

@ -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;
}
}

View File

@ -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);
}
/**

View File

@ -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;
}
}

View File

@ -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<Double> value = new AtomicReference<>(0.0);

View File

@ -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";