From 9224fae4cd71ffdd4cfeaf56ddf296745e1fc86a Mon Sep 17 00:00:00 2001 From: RogueException Date: Fri, 21 Jul 2017 23:09:03 -0300 Subject: [PATCH] Fixed compressed message handling --- src/Discord.Net.WebSocket/DiscordSocketApiClient.cs | 18 +++++++++++------- src/Discord.Net.WebSocket/DiscordVoiceApiClient.cs | 16 ++++++++++------ 2 files changed, 21 insertions(+), 13 deletions(-) diff --git a/src/Discord.Net.WebSocket/DiscordSocketApiClient.cs b/src/Discord.Net.WebSocket/DiscordSocketApiClient.cs index fc8f010c2..117d1c123 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketApiClient.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketApiClient.cs @@ -27,7 +27,7 @@ namespace Discord.API private readonly AsyncEvent> _disconnectedEvent = new AsyncEvent>(); private readonly MemoryStream _decompressionStream; - private readonly JsonTextReader _decompressionJsonReader; + private readonly StreamReader _decompressionReader; private CancellationTokenSource _connectCancelToken; private string _gatewayUrl; private bool _isExplicitUrl; @@ -43,8 +43,8 @@ namespace Discord.API _gatewayUrl = url; if (url != null) _isExplicitUrl = true; - _decompressionStream = new MemoryStream(10 * 1024); //10 KB - _decompressionJsonReader = new JsonTextReader(new StreamReader(_decompressionStream)); + _decompressionStream = new MemoryStream(10 * 1024); //10 KB + _decompressionReader = new StreamReader(_decompressionStream); WebSocketClient = webSocketProvider(); //WebSocketClient.SetHeader("user-agent", DiscordConfig.UserAgent); (Causes issues in .NET Framework 4.6+) @@ -55,11 +55,15 @@ namespace Discord.API _decompressionStream.Position = 0; using (var zlib = new DeflateStream(compressed, CompressionMode.Decompress)) zlib.CopyTo(_decompressionStream); - + _decompressionStream.Position = 0; - var msg = _serializer.Deserialize(_decompressionJsonReader); - if (msg != null) - await _receivedGatewayEvent.InvokeAsync((GatewayOpCode)msg.Operation, msg.Sequence, msg.Type, msg.Payload).ConfigureAwait(false); + using (var jsonReader = new JsonTextReader(_decompressionReader) { CloseInput = false }) + { + var msg = _serializer.Deserialize(jsonReader); + if (msg != null) + await _receivedGatewayEvent.InvokeAsync((GatewayOpCode)msg.Operation, msg.Sequence, msg.Type, msg.Payload).ConfigureAwait(false); + } + _decompressionStream.SetLength(0); } }; WebSocketClient.TextMessage += async text => diff --git a/src/Discord.Net.WebSocket/DiscordVoiceApiClient.cs b/src/Discord.Net.WebSocket/DiscordVoiceApiClient.cs index a4d6daaeb..764bf5807 100644 --- a/src/Discord.Net.WebSocket/DiscordVoiceApiClient.cs +++ b/src/Discord.Net.WebSocket/DiscordVoiceApiClient.cs @@ -40,7 +40,7 @@ namespace Discord.Audio private readonly JsonSerializer _serializer; private readonly SemaphoreSlim _connectionLock; private readonly MemoryStream _decompressionStream; - private readonly JsonTextReader _decompressionJsonReader; + private readonly StreamReader _decompressionReader; private CancellationTokenSource _connectCancelToken; private IUdpSocket _udp; private bool _isDisposed; @@ -59,7 +59,7 @@ namespace Discord.Audio _udp = udpSocketProvider(); _udp.ReceivedDatagram += (data, index, count) => _receivedPacketEvent.InvokeAsync(data, index, count); _decompressionStream = new MemoryStream(10 * 1024); //10 KB - _decompressionJsonReader = new JsonTextReader(new StreamReader(_decompressionStream)); + _decompressionReader = new StreamReader(_decompressionStream); WebSocketClient = webSocketProvider(); //_gatewayClient.SetHeader("user-agent", DiscordConfig.UserAgent); //(Causes issues in .Net 4.6+) @@ -72,9 +72,13 @@ namespace Discord.Audio zlib.CopyTo(_decompressionStream); _decompressionStream.Position = 0; - var msg = _serializer.Deserialize(_decompressionJsonReader); - if (msg != null) - await _receivedEvent.InvokeAsync((VoiceOpCode)msg.Operation, msg.Payload).ConfigureAwait(false); + using (var jsonReader = new JsonTextReader(_decompressionReader) { CloseInput = false }) + { + var msg = _serializer.Deserialize(jsonReader); + if (msg != null) + await _receivedEvent.InvokeAsync((VoiceOpCode)msg.Operation, msg.Payload).ConfigureAwait(false); + } + _decompressionStream.SetLength(0); } }; WebSocketClient.TextMessage += async text => @@ -231,7 +235,7 @@ namespace Discord.Audio } public async Task SendKeepaliveAsync() { - var value = _nextKeepalive++; + ulong value = _nextKeepalive++; var packet = new byte[8]; packet[0] = (byte)(value >> 0); packet[1] = (byte)(value >> 8);