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)