using System; using System.Collections.Generic; using Microsoft.Owin.Hosting; using NLog; using NzbDrone.Common.Security; using NzbDrone.Core.Configuration; using NzbDrone.Owin.MiddleWare; using Owin; using System.Linq; namespace NzbDrone.Owin { public class OwinHostController : IHostController { private readonly IConfigFileProvider _configFileProvider; private readonly IEnumerable _owinMiddleWares; private readonly Logger _logger; private IDisposable _host; public OwinHostController(IConfigFileProvider configFileProvider, IEnumerable owinMiddleWares, Logger logger) { _configFileProvider = configFileProvider; _owinMiddleWares = owinMiddleWares; _logger = logger; } public void StartServer() { IgnoreCertErrorPolicy.Register(); var url = "http://*:" + _configFileProvider.Port; var options = new StartOptions(url) { ServerFactory = "Microsoft.Owin.Host.HttpListener" }; _logger.Info("starting server on {0}", url); _host = WebApp.Start(options, BuildApp); } private void BuildApp(IAppBuilder appBuilder) { appBuilder.Properties["host.AppName"] = "NzbDrone"; foreach (var middleWare in _owinMiddleWares.OrderBy(c => c.Order)) { _logger.Debug("Attaching {0} to host", middleWare.GetType().Name); middleWare.Attach(appBuilder); } } public string AppUrl { get { return string.Format("http://localhost:{0}", _configFileProvider.Port); } } public void RestartServer() { _logger.Warn("Attempting to restart server."); StopServer(); StartServer(); } public void StopServer() { if (_host == null) return; _logger.Info("Attempting to stop Nancy host"); _host.Dispose(); _host = null; _logger.Info("Host has stopped"); } } }