From 2e4db7554041ecf481d3a38656fccc309e13eb5b Mon Sep 17 00:00:00 2001 From: LukePulverenti Date: Sat, 23 Feb 2013 17:31:51 -0500 Subject: extracted http server, web socket server and udp server dependancies --- MediaBrowser.Common/Kernel/BaseKernel.cs | 4 +- MediaBrowser.Common/Kernel/IApplicationHost.cs | 16 +++- MediaBrowser.Common/Kernel/TcpManager.cs | 114 +++++++++---------------- 3 files changed, 55 insertions(+), 79 deletions(-) (limited to 'MediaBrowser.Common/Kernel') diff --git a/MediaBrowser.Common/Kernel/BaseKernel.cs b/MediaBrowser.Common/Kernel/BaseKernel.cs index 08e8c3e75f..28ccd8602d 100644 --- a/MediaBrowser.Common/Kernel/BaseKernel.cs +++ b/MediaBrowser.Common/Kernel/BaseKernel.cs @@ -504,8 +504,8 @@ namespace MediaBrowser.Common.Kernel /// The container. protected virtual void RegisterExportedValues() { - ApplicationHost.Register(this); - ApplicationHost.Register(TaskManager); + ApplicationHost.RegisterSingleInstance(this); + ApplicationHost.RegisterSingleInstance(TaskManager); } /// diff --git a/MediaBrowser.Common/Kernel/IApplicationHost.cs b/MediaBrowser.Common/Kernel/IApplicationHost.cs index dccb65b2aa..fe2f00a126 100644 --- a/MediaBrowser.Common/Kernel/IApplicationHost.cs +++ b/MediaBrowser.Common/Kernel/IApplicationHost.cs @@ -56,8 +56,22 @@ namespace MediaBrowser.Common.Kernel /// /// /// The obj. - void Register(T obj) where T : class; + void RegisterSingleInstance(T obj) where T : class; + /// + /// Registers the single instance. + /// + /// + /// The func. + void RegisterSingleInstance(Func func) where T : class; + + /// + /// Registers the specified func. + /// + /// + /// The func. + void Register(Func func) where T : class; + /// /// Registers the specified service type. /// diff --git a/MediaBrowser.Common/Kernel/TcpManager.cs b/MediaBrowser.Common/Kernel/TcpManager.cs index 0b171c4929..9a998823f4 100644 --- a/MediaBrowser.Common/Kernel/TcpManager.cs +++ b/MediaBrowser.Common/Kernel/TcpManager.cs @@ -1,6 +1,4 @@ -using Alchemy; -using Alchemy.Classes; -using MediaBrowser.Common.Net; +using MediaBrowser.Common.Net; using MediaBrowser.Common.Serialization; using MediaBrowser.Model.Configuration; using MediaBrowser.Model.Logging; @@ -28,20 +26,14 @@ namespace MediaBrowser.Common.Kernel /// This is the udp server used for server discovery by clients /// /// The UDP server. - private UdpServer UdpServer { get; set; } - - /// - /// Gets or sets the UDP listener. - /// - /// The UDP listener. - private IDisposable UdpListener { get; set; } + private IUdpServer UdpServer { get; set; } /// /// Both the Ui and server will have a built-in HttpServer. /// People will inevitably want remote control apps so it's needed in the Ui too. /// /// The HTTP server. - public HttpServer HttpServer { get; private set; } + private IHttpServer HttpServer { get; set; } /// /// This subscribes to HttpListener requests and finds the appropriate BaseHandler to process it @@ -58,7 +50,7 @@ namespace MediaBrowser.Common.Kernel /// Gets or sets the external web socket server. /// /// The external web socket server. - private WebSocketServer ExternalWebSocketServer { get; set; } + private IWebSocketServer ExternalWebSocketServer { get; set; } /// /// The _logger @@ -69,46 +61,24 @@ namespace MediaBrowser.Common.Kernel /// The _network manager /// private readonly INetworkManager _networkManager; - + /// /// The _application host /// private readonly IApplicationHost _applicationHost; - - /// - /// The _supports native web socket - /// - private bool? _supportsNativeWebSocket; /// /// The _kernel /// private readonly IKernel _kernel; - + /// /// Gets a value indicating whether [supports web socket]. /// /// true if [supports web socket]; otherwise, false. internal bool SupportsNativeWebSocket { - get - { - if (!_supportsNativeWebSocket.HasValue) - { - try - { - new ClientWebSocket(); - - _supportsNativeWebSocket = true; - } - catch (PlatformNotSupportedException) - { - _supportsNativeWebSocket = false; - } - } - - return _supportsNativeWebSocket.Value; - } + get { return HttpServer != null && HttpServer.SupportsWebSockets; } } /// @@ -145,7 +115,7 @@ namespace MediaBrowser.Common.Kernel { throw new ArgumentNullException("logger"); } - + _logger = logger; _kernel = kernel; _applicationHost = applicationHost; @@ -178,26 +148,10 @@ namespace MediaBrowser.Common.Kernel DisposeExternalWebSocketServer(); - ExternalWebSocketServer = new WebSocketServer(_kernel.Configuration.LegacyWebSocketPortNumber, IPAddress.Any) - { - OnConnected = OnAlchemyWebSocketClientConnected, - TimeOut = TimeSpan.FromMinutes(60) - }; - - ExternalWebSocketServer.Start(); + ExternalWebSocketServer = _applicationHost.Resolve(); - _logger.Info("Alchemy Web Socket Server started"); - } - - /// - /// Called when [alchemy web socket client connected]. - /// - /// The context. - private void OnAlchemyWebSocketClientConnected(UserContext context) - { - var connection = new WebSocketConnection(new AlchemyWebSocket(context, _logger), context.ClientAddress, ProcessWebSocketMessageReceived, _logger); - - _webSocketConnections.Add(connection); + ExternalWebSocketServer.Start(_kernel.Configuration.LegacyWebSocketPortNumber); + ExternalWebSocketServer.WebSocketConnected += HttpServer_WebSocketConnected; } /// @@ -218,7 +172,9 @@ namespace MediaBrowser.Common.Kernel try { - HttpServer = new HttpServer(_kernel.HttpServerUrlPrefix, "Media Browser", _applicationHost, _kernel, _logger); + HttpServer = _applicationHost.Resolve(); + HttpServer.EnableHttpRequestLogging = _kernel.Configuration.EnableHttpLevelLogging; + HttpServer.Start(_kernel.HttpServerUrlPrefix); } catch (HttpListenerException ex) { @@ -295,7 +251,8 @@ namespace MediaBrowser.Common.Kernel try { // The port number can't be in configuration because we don't want it to ever change - UdpServer = new UdpServer(new IPEndPoint(IPAddress.Any, _kernel.UdpServerPortNumber)); + UdpServer = _applicationHost.Resolve(); + UdpServer.Start(_kernel.UdpServerPortNumber); } catch (SocketException ex) { @@ -303,21 +260,28 @@ namespace MediaBrowser.Common.Kernel return; } - UdpListener = UdpServer.Subscribe(async res => - { - var expectedMessage = String.Format("who is MediaBrowser{0}?", _kernel.KernelContext); - var expectedMessageBytes = Encoding.UTF8.GetBytes(expectedMessage); + UdpServer.MessageReceived += UdpServer_MessageReceived; + } - if (expectedMessageBytes.SequenceEqual(res.Buffer)) - { - _logger.Info("Received UDP server request from " + res.RemoteEndPoint.ToString()); + /// + /// Handles the MessageReceived event of the UdpServer control. + /// + /// The source of the event. + /// The instance containing the event data. + async void UdpServer_MessageReceived(object sender, UdpMessageReceivedEventArgs e) + { + var expectedMessage = String.Format("who is MediaBrowser{0}?", _kernel.KernelContext); + var expectedMessageBytes = Encoding.UTF8.GetBytes(expectedMessage); - // Send a response back with our ip address and port - var response = String.Format("MediaBrowser{0}|{1}:{2}", _kernel.KernelContext, _networkManager.GetLocalIpAddress(), _kernel.UdpServerPortNumber); + if (expectedMessageBytes.SequenceEqual(e.Bytes)) + { + _logger.Info("Received UDP server request from " + e.RemoteEndPoint); - await UdpServer.SendAsync(response, res.RemoteEndPoint); - } - }); + // Send a response back with our ip address and port + var response = String.Format("MediaBrowser{0}|{1}:{2}", _kernel.KernelContext, _networkManager.GetLocalIpAddress(), _kernel.UdpServerPortNumber); + + await UdpServer.SendAsync(Encoding.UTF8.GetBytes(response), e.RemoteEndPoint); + } } /// @@ -407,13 +371,9 @@ namespace MediaBrowser.Common.Kernel { if (UdpServer != null) { + UdpServer.MessageReceived -= UdpServer_MessageReceived; UdpServer.Dispose(); } - - if (UdpListener != null) - { - UdpListener.Dispose(); - } } /// @@ -523,6 +483,8 @@ namespace MediaBrowser.Common.Kernel /// The new config. public void OnApplicationConfigurationChanged(BaseApplicationConfiguration oldConfig, BaseApplicationConfiguration newConfig) { + HttpServer.EnableHttpRequestLogging = newConfig.EnableHttpLevelLogging; + if (oldConfig.HttpServerPortNumber != newConfig.HttpServerPortNumber) { ReloadHttpServer(); -- cgit v1.2.3