diff options
| author | Luke Pulverenti <luke.pulverenti@gmail.com> | 2015-03-08 20:36:02 -0400 |
|---|---|---|
| committer | Luke Pulverenti <luke.pulverenti@gmail.com> | 2015-03-08 20:36:02 -0400 |
| commit | e70e06f0ac57efc66db5701f4f2a01d157eb8c8a (patch) | |
| tree | 7b265dfb50af11df997fc7b366924f0a39c9739b | |
| parent | ecc6df0b710d0a522b769b4744ec45ea9ed1d35b (diff) | |
fix web socket message parsing
3 files changed, 36 insertions, 15 deletions
diff --git a/MediaBrowser.Server.Implementations/HttpServer/SocketSharp/SharpWebSocket.cs b/MediaBrowser.Server.Implementations/HttpServer/SocketSharp/SharpWebSocket.cs index 9faf2bc47..8ab8b0215 100644 --- a/MediaBrowser.Server.Implementations/HttpServer/SocketSharp/SharpWebSocket.cs +++ b/MediaBrowser.Server.Implementations/HttpServer/SocketSharp/SharpWebSocket.cs @@ -2,6 +2,7 @@ using MediaBrowser.Controller.Net; using MediaBrowser.Model.Logging; using System; +using System.IO; using System.Threading; using System.Threading.Tasks; using WebSocketState = MediaBrowser.Model.Net.WebSocketState; @@ -149,7 +150,7 @@ namespace MediaBrowser.Server.Implementations.HttpServer.SocketSharp WebSocket.OnMessage -= socket_OnMessage; WebSocket.OnClose -= socket_OnClose; WebSocket.OnError -= socket_OnError; - + _cancellationTokenSource.Cancel(); WebSocket.Close(); diff --git a/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj b/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj index 81b47daff..923e57b9b 100644 --- a/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj +++ b/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj @@ -98,6 +98,9 @@ <Reference Include="ServiceStack.Text"> <HintPath>..\ThirdParty\ServiceStack.Text\ServiceStack.Text.dll</HintPath> </Reference> + <Reference Include="UniversalDetector"> + <HintPath>..\ThirdParty\UniversalDetector\UniversalDetector.dll</HintPath> + </Reference> </ItemGroup> <ItemGroup> <Compile Include="..\SharedVersion.cs"> diff --git a/MediaBrowser.Server.Implementations/ServerManager/WebSocketConnection.cs b/MediaBrowser.Server.Implementations/ServerManager/WebSocketConnection.cs index 738e82bd0..44d8cc437 100644 --- a/MediaBrowser.Server.Implementations/ServerManager/WebSocketConnection.cs +++ b/MediaBrowser.Server.Implementations/ServerManager/WebSocketConnection.cs @@ -1,4 +1,5 @@ -using MediaBrowser.Common.Events; +using System.Text; +using MediaBrowser.Common.Events; using MediaBrowser.Controller.Net; using MediaBrowser.Model.Logging; using MediaBrowser.Model.Net; @@ -8,6 +9,7 @@ using System.Collections.Specialized; using System.IO; using System.Threading; using System.Threading.Tasks; +using UniversalDetector; namespace MediaBrowser.Server.Implementations.ServerManager { @@ -132,28 +134,43 @@ namespace MediaBrowser.Server.Implementations.ServerManager { return; } + var charset = DetectCharset(bytes); + + if (string.Equals(charset, "utf-8", StringComparison.OrdinalIgnoreCase)) + { + OnReceiveInternal(Encoding.UTF8.GetString(bytes)); + } + else + { + OnReceiveInternal(Encoding.ASCII.GetString(bytes)); + } + } + private string DetectCharset(byte[] bytes) + { try { - //_logger.Debug(Encoding.UTF8.GetString(bytes)); - using (var memoryStream = new MemoryStream(bytes)) + using (var ms = new MemoryStream(bytes)) { - var info = (WebSocketMessageInfo)_jsonSerializer.DeserializeFromStream(memoryStream, typeof(WebSocketMessageInfo)); + var detector = new CharsetDetector(); + detector.Feed(ms); + detector.DataEnd(); - //info = new WebSocketMessageInfo - //{ - // MessageType = stub.MessageType, - // Data = stub.Data == null ? null : stub.Data.ToString() - //}; - info.Connection = this; + var charset = detector.Charset; - OnReceive(info); - } + if (!string.IsNullOrWhiteSpace(charset)) + { + //_logger.Debug("UniversalDetector detected charset {0}", charset); + } + return charset; + } } - catch (Exception ex) + catch (IOException ex) { - _logger.ErrorException("Error processing web socket message", ex); + _logger.ErrorException("Error attempting to determine web socket message charset", ex); } + + return null; } private void OnReceiveInternal(string message) |
