diff --git a/MediaBrowser.Server.Implementations/HttpServer/SocketSharp/SharpWebSocket.cs b/MediaBrowser.Server.Implementations/HttpServer/SocketSharp/SharpWebSocket.cs index 9faf2bc473..8ab8b02151 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 81b47daff0..923e57b9b3 100644 --- a/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj +++ b/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj @@ -98,6 +98,9 @@ ..\ThirdParty\ServiceStack.Text\ServiceStack.Text.dll + + ..\ThirdParty\UniversalDetector\UniversalDetector.dll + diff --git a/MediaBrowser.Server.Implementations/ServerManager/WebSocketConnection.cs b/MediaBrowser.Server.Implementations/ServerManager/WebSocketConnection.cs index 738e82bd02..44d8cc4371 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)