aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Server.Implementations/ServerManager
diff options
context:
space:
mode:
author7illusions <z@7illusions.com>2014-08-30 19:06:58 +0200
committer7illusions <z@7illusions.com>2014-08-30 19:06:58 +0200
commit66ad1699e22029b605e17735e8d9450285d8748a (patch)
treeffc92c88d24850b2f82b6b3a8bdd904a2ccc77a5 /MediaBrowser.Server.Implementations/ServerManager
parent34bc54263e886aae777a3537dc50a6535b51330a (diff)
parent9d36f518182bc075c19d78084870f5115fa62d1e (diff)
Merge pull request #1 from MediaBrowser/master
Update to latest
Diffstat (limited to 'MediaBrowser.Server.Implementations/ServerManager')
-rw-r--r--MediaBrowser.Server.Implementations/ServerManager/ServerManager.cs75
-rw-r--r--MediaBrowser.Server.Implementations/ServerManager/WebSocketConnection.cs54
2 files changed, 47 insertions, 82 deletions
diff --git a/MediaBrowser.Server.Implementations/ServerManager/ServerManager.cs b/MediaBrowser.Server.Implementations/ServerManager/ServerManager.cs
index e66b87b0c..7a23d8e08 100644
--- a/MediaBrowser.Server.Implementations/ServerManager/ServerManager.cs
+++ b/MediaBrowser.Server.Implementations/ServerManager/ServerManager.cs
@@ -46,12 +46,6 @@ namespace MediaBrowser.Server.Implementations.ServerManager
}
/// <summary>
- /// Gets or sets the external web socket server.
- /// </summary>
- /// <value>The external web socket server.</value>
- private IWebSocketServer ExternalWebSocketServer { get; set; }
-
- /// <summary>
/// The _logger
/// </summary>
private readonly ILogger _logger;
@@ -68,24 +62,6 @@ namespace MediaBrowser.Server.Implementations.ServerManager
private IServerConfigurationManager ConfigurationManager { get; set; }
/// <summary>
- /// Gets a value indicating whether [supports web socket].
- /// </summary>
- /// <value><c>true</c> if [supports web socket]; otherwise, <c>false</c>.</value>
- public bool SupportsNativeWebSocket
- {
- get { return HttpServer != null && HttpServer.SupportsWebSockets; }
- }
-
- /// <summary>
- /// Gets the web socket port number.
- /// </summary>
- /// <value>The web socket port number.</value>
- public int WebSocketPortNumber
- {
- get { return SupportsNativeWebSocket ? ConfigurationManager.Configuration.HttpServerPortNumber : ConfigurationManager.Configuration.LegacyWebSocketPortNumber; }
- }
-
- /// <summary>
/// Gets the web socket listeners.
/// </summary>
/// <value>The web socket listeners.</value>
@@ -123,43 +99,21 @@ namespace MediaBrowser.Server.Implementations.ServerManager
/// <summary>
/// Starts this instance.
/// </summary>
- public void Start(IEnumerable<string> urlPrefixes, bool enableHttpLogging)
+ public void Start(IEnumerable<string> urlPrefixes)
{
- ReloadHttpServer(urlPrefixes, enableHttpLogging);
- }
-
- public void StartWebSocketServer()
- {
- if (!SupportsNativeWebSocket)
- {
- ReloadExternalWebSocketServer(ConfigurationManager.Configuration.LegacyWebSocketPortNumber);
- }
- }
-
- /// <summary>
- /// Starts the external web socket server.
- /// </summary>
- private void ReloadExternalWebSocketServer(int portNumber)
- {
- DisposeExternalWebSocketServer();
-
- ExternalWebSocketServer = _applicationHost.Resolve<IWebSocketServer>();
-
- ExternalWebSocketServer.Start(portNumber);
- ExternalWebSocketServer.WebSocketConnected += HttpServer_WebSocketConnected;
+ ReloadHttpServer(urlPrefixes);
}
/// <summary>
/// Restarts the Http Server, or starts it if not currently running
/// </summary>
- private void ReloadHttpServer(IEnumerable<string> urlPrefixes, bool enableHttpLogging)
+ private void ReloadHttpServer(IEnumerable<string> urlPrefixes)
{
_logger.Info("Loading Http Server");
try
{
HttpServer = _applicationHost.Resolve<IHttpServer>();
- HttpServer.EnableHttpRequestLogging = enableHttpLogging;
HttpServer.StartServer(urlPrefixes);
}
catch (SocketException ex)
@@ -199,6 +153,8 @@ namespace MediaBrowser.Server.Implementations.ServerManager
/// <param name="result">The result.</param>
private async void ProcessWebSocketMessageReceived(WebSocketMessageInfo result)
{
+ //_logger.Debug("Websocket message received: {0}", result.MessageType);
+
var tasks = _webSocketListeners.Select(i => Task.Run(async () =>
{
try
@@ -286,13 +242,13 @@ namespace MediaBrowser.Server.Implementations.ServerManager
_logger.Info("Sending web socket message {0}", messageType);
var message = new WebSocketMessage<T> { MessageType = messageType, Data = dataFunction() };
- var bytes = _jsonSerializer.SerializeToBytes(message);
+ var json = _jsonSerializer.SerializeToString(message);
var tasks = connectionsList.Select(s => Task.Run(() =>
{
try
{
- s.SendAsync(bytes, cancellationToken);
+ s.SendAsync(json, cancellationToken);
}
catch (OperationCanceledException)
{
@@ -302,7 +258,8 @@ namespace MediaBrowser.Server.Implementations.ServerManager
{
_logger.ErrorException("Error sending web socket message {0} to {1}", ex, messageType, s.RemoteEndPoint);
}
- }));
+
+ }, cancellationToken));
await Task.WhenAll(tasks).ConfigureAwait(false);
}
@@ -326,8 +283,6 @@ namespace MediaBrowser.Server.Implementations.ServerManager
HttpServer.WebSocketConnected -= HttpServer_WebSocketConnected;
HttpServer.Dispose();
}
-
- DisposeExternalWebSocketServer();
}
/// <summary>
@@ -352,18 +307,6 @@ namespace MediaBrowser.Server.Implementations.ServerManager
}
/// <summary>
- /// Disposes the external web socket server.
- /// </summary>
- private void DisposeExternalWebSocketServer()
- {
- if (ExternalWebSocketServer != null)
- {
- _logger.Info("Disposing {0}", ExternalWebSocketServer.GetType().Name);
- ExternalWebSocketServer.Dispose();
- }
- }
-
- /// <summary>
/// Adds the web socket listeners.
/// </summary>
/// <param name="listeners">The listeners.</param>
diff --git a/MediaBrowser.Server.Implementations/ServerManager/WebSocketConnection.cs b/MediaBrowser.Server.Implementations/ServerManager/WebSocketConnection.cs
index 2b60f3116..3c3d7740a 100644
--- a/MediaBrowser.Server.Implementations/ServerManager/WebSocketConnection.cs
+++ b/MediaBrowser.Server.Implementations/ServerManager/WebSocketConnection.cs
@@ -194,9 +194,9 @@ namespace MediaBrowser.Server.Implementations.ServerManager
throw new ArgumentNullException("message");
}
- var bytes = _jsonSerializer.SerializeToBytes(message);
+ var json = _jsonSerializer.SerializeToString(message);
- return SendAsync(bytes, cancellationToken);
+ return SendAsync(json, cancellationToken);
}
/// <summary>
@@ -205,24 +205,46 @@ namespace MediaBrowser.Server.Implementations.ServerManager
/// <param name="buffer">The buffer.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns>Task.</returns>
- public Task SendAsync(byte[] buffer, CancellationToken cancellationToken)
+ public async Task SendAsync(byte[] buffer, CancellationToken cancellationToken)
{
- return SendAsync(buffer, WebSocketMessageType.Text, cancellationToken);
+ if (buffer == null)
+ {
+ throw new ArgumentNullException("buffer");
+ }
+
+ cancellationToken.ThrowIfCancellationRequested();
+
+ // Per msdn docs, attempting to send simultaneous messages will result in one failing.
+ // This should help us workaround that and ensure all messages get sent
+ await _sendSemaphore.WaitAsync(cancellationToken).ConfigureAwait(false);
+
+ try
+ {
+ await _socket.SendAsync(buffer, true, cancellationToken);
+ }
+ catch (OperationCanceledException)
+ {
+ _logger.Info("WebSocket message to {0} was cancelled", RemoteEndPoint);
+
+ throw;
+ }
+ catch (Exception ex)
+ {
+ _logger.ErrorException("Error sending WebSocket message {0}", ex, RemoteEndPoint);
+
+ throw;
+ }
+ finally
+ {
+ _sendSemaphore.Release();
+ }
}
- /// <summary>
- /// Sends a message asynchronously.
- /// </summary>
- /// <param name="buffer">The buffer.</param>
- /// <param name="type">The type.</param>
- /// <param name="cancellationToken">The cancellation token.</param>
- /// <returns>Task.</returns>
- /// <exception cref="System.ArgumentNullException">buffer</exception>
- public async Task SendAsync(byte[] buffer, WebSocketMessageType type, CancellationToken cancellationToken)
+ public async Task SendAsync(string text, CancellationToken cancellationToken)
{
- if (buffer == null)
+ if (string.IsNullOrWhiteSpace(text))
{
- throw new ArgumentNullException("buffer");
+ throw new ArgumentNullException("text");
}
cancellationToken.ThrowIfCancellationRequested();
@@ -233,7 +255,7 @@ namespace MediaBrowser.Server.Implementations.ServerManager
try
{
- await _socket.SendAsync(buffer, type, true, cancellationToken);
+ await _socket.SendAsync(text, true, cancellationToken);
}
catch (OperationCanceledException)
{