aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Server.Implementations/ServerManager
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.Server.Implementations/ServerManager')
-rw-r--r--MediaBrowser.Server.Implementations/ServerManager/ServerManager.cs15
-rw-r--r--MediaBrowser.Server.Implementations/ServerManager/WebSocketConnection.cs58
2 files changed, 56 insertions, 17 deletions
diff --git a/MediaBrowser.Server.Implementations/ServerManager/ServerManager.cs b/MediaBrowser.Server.Implementations/ServerManager/ServerManager.cs
index ef2fef746..8719f5448 100644
--- a/MediaBrowser.Server.Implementations/ServerManager/ServerManager.cs
+++ b/MediaBrowser.Server.Implementations/ServerManager/ServerManager.cs
@@ -1,12 +1,14 @@
-using MediaBrowser.Common.Net;
+using MediaBrowser.Common.Events;
using MediaBrowser.Controller;
using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Net;
+using MediaBrowser.Model.Events;
using MediaBrowser.Model.Logging;
using MediaBrowser.Model.Net;
using MediaBrowser.Model.Serialization;
using System;
using System.Collections.Generic;
+using System.Collections.Specialized;
using System.Linq;
using System.Net.Sockets;
using System.Threading;
@@ -45,6 +47,8 @@ namespace MediaBrowser.Server.Implementations.ServerManager
get { return _webSocketConnections; }
}
+ public event EventHandler<GenericEventArgs<IWebSocketConnection>> WebSocketConnected;
+
/// <summary>
/// The _logger
/// </summary>
@@ -141,10 +145,17 @@ namespace MediaBrowser.Server.Implementations.ServerManager
{
var connection = new WebSocketConnection(e.WebSocket, e.Endpoint, _jsonSerializer, _logger)
{
- OnReceive = ProcessWebSocketMessageReceived
+ OnReceive = ProcessWebSocketMessageReceived,
+ Url = e.Url,
+ QueryString = new NameValueCollection(e.QueryString ?? new NameValueCollection())
};
_webSocketConnections.Add(connection);
+
+ if (WebSocketConnected != null)
+ {
+ EventHelper.FireEventIfNotNull(WebSocketConnected, this, new GenericEventArgs<IWebSocketConnection> (connection), _logger);
+ }
}
/// <summary>
diff --git a/MediaBrowser.Server.Implementations/ServerManager/WebSocketConnection.cs b/MediaBrowser.Server.Implementations/ServerManager/WebSocketConnection.cs
index 9f75d522c..44d8cc437 100644
--- a/MediaBrowser.Server.Implementations/ServerManager/WebSocketConnection.cs
+++ b/MediaBrowser.Server.Implementations/ServerManager/WebSocketConnection.cs
@@ -1,12 +1,15 @@
-using MediaBrowser.Common.Events;
+using System.Text;
+using MediaBrowser.Common.Events;
using MediaBrowser.Controller.Net;
using MediaBrowser.Model.Logging;
using MediaBrowser.Model.Net;
using MediaBrowser.Model.Serialization;
using System;
+using System.Collections.Specialized;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
+using UniversalDetector;
namespace MediaBrowser.Server.Implementations.ServerManager
{
@@ -66,6 +69,17 @@ namespace MediaBrowser.Server.Implementations.ServerManager
public Guid Id { get; private set; }
/// <summary>
+ /// Gets or sets the URL.
+ /// </summary>
+ /// <value>The URL.</value>
+ public string Url { get; set; }
+ /// <summary>
+ /// Gets or sets the query string.
+ /// </summary>
+ /// <value>The query string.</value>
+ public NameValueCollection QueryString { get; set; }
+
+ /// <summary>
/// Initializes a new instance of the <see cref="WebSocketConnection" /> class.
/// </summary>
/// <param name="socket">The socket.</param>
@@ -120,29 +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
{
- WebSocketMessageInfo info;
-
- using (var memoryStream = new MemoryStream(bytes))
+ using (var ms = new MemoryStream(bytes))
{
- var stub = (WebSocketMessage<object>)_jsonSerializer.DeserializeFromStream(memoryStream, typeof(WebSocketMessage<object>));
+ var detector = new CharsetDetector();
+ detector.Feed(ms);
+ detector.DataEnd();
- info = new WebSocketMessageInfo
- {
- MessageType = stub.MessageType,
- Data = stub.Data == null ? null : stub.Data.ToString()
- };
- }
+ var charset = detector.Charset;
- info.Connection = this;
+ if (!string.IsNullOrWhiteSpace(charset))
+ {
+ //_logger.Debug("UniversalDetector detected charset {0}", charset);
+ }
- OnReceive(info);
+ 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)