diff --git a/CrystalConnector/Connector/Packet/S2C/S2CAuthenticatedPacket.cs b/CrystalConnector/Connector/Packet/S2C/S2CAuthenticatedPacket.cs index 5166007..a5e6a55 100644 --- a/CrystalConnector/Connector/Packet/S2C/S2CAuthenticatedPacket.cs +++ b/CrystalConnector/Connector/Packet/S2C/S2CAuthenticatedPacket.cs @@ -7,6 +7,6 @@ public class S2CAuthenticatedPacket : PacketS2C { protected override void WriteData(CborWriter writer) { - writer.WriteTextString(HandlerConstants.ResponseAuthenticated); + writer.WriteTextString(HandlerConstants.ResponseErrorAuthenticated); } } \ No newline at end of file diff --git a/CrystalConnector/Connector/Packet/S2C/S2CMalformedPacket.cs b/CrystalConnector/Connector/Packet/S2C/S2CMalformedPacket.cs new file mode 100644 index 0000000..b46b4ff --- /dev/null +++ b/CrystalConnector/Connector/Packet/S2C/S2CMalformedPacket.cs @@ -0,0 +1,12 @@ +using System.Formats.Cbor; +using CrystalConnector.Handlers; + +namespace CrystalConnector.Connector.Packet.S2C; + +public class S2CMalformedPacket : PacketS2C +{ + protected override void WriteData(CborWriter writer) + { + writer.WriteTextString(HandlerConstants.ResponseErrorMalformed); + } +} \ No newline at end of file diff --git a/CrystalConnector/Handlers/HandlerConstants.cs b/CrystalConnector/Handlers/HandlerConstants.cs index 7d948f6..d373dec 100644 --- a/CrystalConnector/Handlers/HandlerConstants.cs +++ b/CrystalConnector/Handlers/HandlerConstants.cs @@ -5,11 +5,14 @@ public class HandlerConstants public static readonly string OperationAuthenticate = "Authenticate"; public static readonly string OperationRegisterChannel = "Register"; public static readonly string OperationPublish = "Publish"; + // Todo: qyl27: Does we need a exit message? + // public static readonly string OperationExit = "Bye"; public static readonly string ResponseSuccessful = "Successful"; - public static readonly string ResponseAuthenticated = "Authenticated"; - + public static readonly string ResponseErrorUnknownPacket = "Unknown"; + public static readonly string ResponseErrorMalformed = "Malformed"; + public static readonly string ResponseErrorAuthenticated = "Authenticated"; public static readonly string ResponseErrorUnauthenticated = "Unauthenticated"; public static readonly string ResponseErrorUndefinedDirection = "UndefinedDirection"; public static readonly string ResponseErrorUnregisteredDirection = "UnregisteredDirection"; diff --git a/CrystalConnector/Handlers/WebSocketHandler.cs b/CrystalConnector/Handlers/WebSocketHandler.cs index 1172ae3..ebbc39b 100644 --- a/CrystalConnector/Handlers/WebSocketHandler.cs +++ b/CrystalConnector/Handlers/WebSocketHandler.cs @@ -67,12 +67,21 @@ public class WebSocketHandler } var direction = (MessageDirection)directionValue; - - webSocket.GetConnectionInfo().RegisteredChannels.Add(channelId, new MessageChannel + + var channels = webSocket.GetConnectionInfo().RegisteredChannels; + if (channelId.Contains(channelId)) { - Id = channelId, - Direction = direction - }); + channels[channelId].Direction |= direction; + } + else + { + webSocket.GetConnectionInfo().RegisteredChannels.Add(channelId, new MessageChannel + { + Id = channelId, + Direction = direction + }); + } + Logger.LogInformation("Client {Name}({Id}) registered channel {Channel}(Direction: {Direction})", webSocket.GetConnectionInfo().Name, webSocket.GetConnectionInfo().Id, channelId, direction.ToString()); return new S2CSuccessfulPacket(); diff --git a/CrystalConnector/Utilities/WebSocketExtension.cs b/CrystalConnector/Utilities/WebSocketExtension.cs index 200158a..64c101f 100644 --- a/CrystalConnector/Utilities/WebSocketExtension.cs +++ b/CrystalConnector/Utilities/WebSocketExtension.cs @@ -30,8 +30,8 @@ public static class WebSocketExtension info.CompletionSource.SetResult(WebSocketHandleResult.Successful); webSocket.CloseOutputAsync(WebSocketCloseStatus.NormalClosure, "", CancellationToken.None); - - WebSocketConnectionManager.Info.Remove(webSocket); + + Purge(webSocket); } public static async Task Send(this WebSocket webSocket, PacketS2C packet) @@ -50,4 +50,9 @@ public static class WebSocketExtension { await webSocket.SendAsync(new ReadOnlyMemory(data, startIndex, length), WebSocketMessageType.Binary, true, CancellationToken.None); } + + public static void Purge(this WebSocket webSocket) + { + WebSocketConnectionManager.Info.Remove(webSocket); + } } \ No newline at end of file diff --git a/CrystalConnector/WebSockets/WebSocketManager.cs b/CrystalConnector/WebSockets/WebSocketManager.cs index 42e22c6..5cfffdf 100644 --- a/CrystalConnector/WebSockets/WebSocketManager.cs +++ b/CrystalConnector/WebSockets/WebSocketManager.cs @@ -2,6 +2,7 @@ using System.Net; using System.Net.WebSockets; using CrystalConnector.Configs; +using CrystalConnector.Connector.Packet.S2C; using CrystalConnector.Handlers; using CrystalConnector.Utilities; using Microsoft.AspNetCore.Http; @@ -49,26 +50,30 @@ public class WebSocketManager : IWebSocketManager { if (Config.IsDebug()) { - Logger.LogWarning(ex, "Malformed message!"); + Logger.LogWarning(ex, "Unknown message!"); } - Disconnect(webSocket); + + await webSocket.Send(new S2CUnknownPacket()); } catch (InvalidOperationException ex) { if (Config.IsDebug()) { - Logger.LogWarning(ex, "Bad message!"); + Logger.LogWarning(ex, "Malformed message!"); } - Disconnect(webSocket); + + await webSocket.Send(new S2CMalformedPacket()); } catch (MessageException ex) { Logger.LogWarning(ex, "Why do that?"); - Disconnect(webSocket); + await webSocket.Send(new S2CMalformedPacket()); } receiveResult = await webSocket.ReceiveAsync(new ArraySegment(buffer), CancellationToken.None); } + + webSocket.Purge(); } public void Disconnect(WebSocket webSocket)