public void ReturnsRoutesAndLogsWithInclusions() { //ReflectionTypeLoadException exception = null; //var attempts = 0; //do //{ // attempts++; // exception = null; // try // { var logger = new InMemoryLogger(); var scanner = new RouteScanner { Logger = logger }; scanner.Include(Assembly.GetExecutingAssembly()); logger.Logs.ShouldBeEmpty(); var routes = scanner.Scan(); routes.ShouldNotBeNull(); routes.Count.ShouldBe(2); logger.Logs.ShouldNotBeEmpty(); // } // catch (ReflectionTypeLoadException ex) // { // exception = ex; // Thread.Sleep(231); // } //} while (exception != null || attempts > 5); //if (exception != null) throw exception; }
public void ScannerShouldInstantiateScannerControllerWithInjectedDependencies() { const string TestRoute = "/scannercontroller/get2"; var test = new TestDependency(); IoC.RegisterInstance <ITestDependency>(nameof(ITestDependency), test); var logger = new TestLogger(); IoC.RegisterInstance <IChromelyLogger>(nameof(IChromelyLogger), logger); var scanner = new RouteScanner(Assembly.GetExecutingAssembly()); var routeCommands = scanner.Scan(); foreach (var route in routeCommands.Item1) { ServiceRouteProvider.AddRoute(route.Key, route.Value); } foreach (var command in routeCommands.Item2) { ServiceRouteProvider.AddCommand(command.Key, command.Value); } var request = new ChromelyRequest(new RoutePath(Method.GET, TestRoute), null, null); var routePath = new RoutePath(Method.GET, TestRoute); var get2 = ServiceRouteProvider.GetRoute(routePath); var getResponse = get2.Invoke(request); Assert.Equal(TestDependency.TestDependencyResponse, getResponse.Data.ToString()); Assert.Equal(ScannerControllerWithDependencyInjection.Get2Response, logger.Message); }
public void ReturnsRoutesAndLogs() { //ReflectionTypeLoadException exception = null; //var attempts = 0; //do //{ // attempts++; // exception = null; // try // { var logger = new InMemoryLogger(); var scanner = new RouteScanner { Logger = logger }; logger.Logs.ShouldBeEmpty(); var routes = scanner.Scan(); routes.ShouldNotBeNull(); routes.ShouldNotBeEmpty(); routes.Count.ShouldBeGreaterThanOrEqualTo(2); logger.Logs.ShouldNotBeEmpty(); // } // catch (ReflectionTypeLoadException ex) // { // exception = ex; // Thread.Sleep(417); // } //} while (exception != null || attempts > 5); //if (exception != null) throw exception; }
public void AllAdminRoutesHaveCorrectAuthorizationStatus() { var routes = RouteScanner.Scan(attr => attr.Path.Contains("/admin/") && (attr.RequiredAuthorization != AuthorizationStatus.ClusterAdmin && attr.RequiredAuthorization != AuthorizationStatus.Operator && attr.RequiredAuthorization != AuthorizationStatus.DatabaseAdmin)); Assert.Empty(routes); }
public void AllAdminAuthorizationStatusHaveCorrectRoutes() { var routes = RouteScanner.Scan(attr => !attr.Path.Contains("/admin/") && (attr.RequiredAuthorization == AuthorizationStatus.Operator || attr.RequiredAuthorization == AuthorizationStatus.Operator || attr.RequiredAuthorization == AuthorizationStatus.DatabaseAdmin)); Assert.Empty(routes); }
public void FullScan() { var sampleDataStream = TestUtils.LoadResourceStream("TestData.MapBuilder_PartialMapRead.txt"); var dataRoot = new DefReader().LoadDataFromStream(sampleDataStream, CancellationToken.None); var mapResult = new TradeMapBuilder().Build(dataRoot, CancellationToken.None); var routeScanner = new RouteScanner(); routeScanner.SetLogging(TestUtils.GetTraceLogger()); var scanResult = routeScanner.Scan(mapResult, new RouteScannerOptions(), CancellationToken.None); }
public void ReturnsRoutesAndLogsWithExclusions() { var logger = new InMemoryLogger(); var scanner = new RouteScanner { Logger = logger }; logger.Logs.ShouldBeEmpty(); var routesBefore = scanner.Scan(); scanner.Exclude(Assembly.GetExecutingAssembly()); var routesAfter = scanner.Scan(); routesBefore.ShouldNotBeNull(); routesAfter.ShouldNotBeNull(); (routesBefore.Count - routesAfter.Count).ShouldBe(2); logger.Logs.ShouldNotBeEmpty(); }
/// <summary> /// The scan assemblies. /// </summary> public void ScanAssemblies() { if ((HostConfig?.ServiceAssemblies == null) || (HostConfig?.ServiceAssemblies.Count == 0)) { return; } foreach (var assembly in HostConfig?.ServiceAssemblies) { if (!assembly.IsScanned) { var scanner = new RouteScanner(assembly.Assembly); var currentRouteDictionary = scanner.Scan().Item1; var currentCommandDictionary = scanner.Scan().Item2; ServiceRouteProvider.MergeRoutes(currentRouteDictionary); ServiceRouteProvider.MergeCommands(currentCommandDictionary); assembly.IsScanned = true; } } }
public void ScanAssemblies() { if ((ServiceAssemblies == null) || (ServiceAssemblies.Count == 0)) { return; } foreach (var assembly in ServiceAssemblies) { RouteScanner scanner = new RouteScanner(assembly); Dictionary <string, Route> currentRouteDictionary = scanner.Scan(); ServiceRouteProvider.MergeRoutes(currentRouteDictionary); } }
public void ScanTest() { // Note that the current assembly scan will include this file // And all other routes defined in other files in the assembly var scanner = new RouteScanner(Assembly.GetExecutingAssembly()); Assert.NotNull(scanner); var result = scanner.Scan(); Assert.NotNull(result); Assert.Equal(9, result.Count); }
/// <summary> /// The scan assemblies. /// </summary> public void ScanAssemblies() { if ((this.ServiceAssemblies == null) || (this.ServiceAssemblies.Count == 0)) { return; } foreach (var assembly in this.ServiceAssemblies) { var scanner = new RouteScanner(assembly); var currentRouteDictionary = scanner.Scan(); ServiceRouteProvider.MergeRoutes(currentRouteDictionary); } }
public void ReturnsRoutesAndLogsWithInclusions() { var logger = new InMemoryLogger(); var scanner = new RouteScanner { Logger = logger }; scanner.Include(Assembly.GetExecutingAssembly()); logger.Logs.ShouldBeEmpty(); var routes = scanner.Scan(); routes.ShouldNotBeNull(); routes.Count.ShouldBe(2); logger.Logs.ShouldNotBeEmpty(); }
public void ReturnsRoutesAndLogs() { var logger = new InMemoryLogger(); var scanner = new RouteScanner { Logger = logger }; logger.Logs.ShouldBeEmpty(); var routes = scanner.Scan(); routes.ShouldNotBeNull(); routes.ShouldNotBeEmpty(); routes.Count.ShouldBeGreaterThanOrEqualTo(2); logger.Logs.ShouldNotBeEmpty(); }
public void AllAdminAuthorizationStatusHaveCorrectRoutes() { var routesToIgnore = new HashSet <string> { "/monitoring/snmp/oids", "/monitoring/snmp" }; var routes = RouteScanner.Scan(attr => routesToIgnore.Contains(attr.Path) == false && !attr.Path.Contains("/admin/") && (attr.RequiredAuthorization == AuthorizationStatus.ClusterAdmin || attr.RequiredAuthorization == AuthorizationStatus.Operator || attr.RequiredAuthorization == AuthorizationStatus.DatabaseAdmin)); Assert.Empty(routes); }
/// <summary> /// The scan assemblies. /// </summary> public void ScanAssemblies() { if ((this.HostConfig?.ServiceAssemblies == null) || (this.HostConfig?.ServiceAssemblies.Count == 0)) { return; } foreach (var assembly in this.HostConfig?.ServiceAssemblies) { if (!assembly.IsScanned) { RouteScanner scanner = new RouteScanner(assembly.Assembly); Dictionary <string, Route> currentRouteDictionary = scanner.Scan(); ServiceRouteProvider.MergeRoutes(currentRouteDictionary); assembly.IsScanned = true; } } }
public void ScanAssemblies() { if ((_config?.ControllerAssemblies == null) || (_config?.ControllerAssemblies.Count == 0)) { return; } foreach (var assembly in _config?.ControllerAssemblies) { if (!assembly.IsScanned) { var scanner = new RouteScanner(assembly.Assembly, _container); var scanResult = scanner.Scan(); var actionRoutes = scanResult?.Item1; var commandRoutes = scanResult?.Item2; ServiceRouteProvider.RegisterActionRoutes(_container, actionRoutes); ServiceRouteProvider.RegisterCommnandRoutes(_container, commandRoutes); assembly.IsScanned = true; } } }
//public Task<RouteScannerResults> Scan(CancellationToken ct) public RouteScannerResults Scan(CancellationToken ct) { State = ScanWorkerState.Working; try { ct.ThrowIfCancellationRequested(); // Make the root node var rootNode = new DefNode(); // Read def files var defReader = new DefReader(); defReader.ProgressEvents.ProgressEvent += new EventHandler <ProgressEventArgs>((sender, args) => { DoProgressEvent(sender, args); }); foreach (var filepath in _defFiles) { ct.ThrowIfCancellationRequested(); defReader.LoadDataFromFile(filepath, rootNode, ct); } // Build map var mapBuilder = new TradeMapBuilder(); mapBuilder.ProgressEvents.ProgressEvent += new EventHandler <ProgressEventArgs>((sender, args) => { DoProgressEvent(sender, args); }); ct.ThrowIfCancellationRequested(); var map = mapBuilder.Build(rootNode, ct); // Check that there are systems in the map if (map.Systems.Count == 0) { DoProgressEvent(this, new ProgressEventArgs(ProgressEventStatus.Error, "No systems were found. Are the correct def files selected?")); //return Task.FromResult(new RouteScannerResults() { Successful = false }); return(new RouteScannerResults() { Successful = false }); } // Scan for runs & routes var tradeScanner = new RouteScanner(); tradeScanner.ProgressEvents.ProgressEvent += new EventHandler <ProgressEventArgs>((sender, args) => { DoProgressEvent(sender, args); }); ct.ThrowIfCancellationRequested(); var results = tradeScanner.Scan(map, _options, ct); DoProgressEvent(this, new ProgressEventArgs(ProgressEventStatus.Complete, "Route scanning complete")); // Done //return Task.FromResult(results); return(results); } catch (OperationCanceledException) { // Operation was cancelled. Stop gracefully. DoProgressEvent(this, new ProgressEventArgs(ProgressEventStatus.Complete, "Cancelled")); //return Task.FromResult(new RouteScannerResults() { Successful = false }); return(new RouteScannerResults() { Successful = false }); } catch (Exception ex) { DoProgressEvent(this, new ProgressEventArgs(ProgressEventStatus.Error, $"An error occurred: {ex.GetType().ToString()}\n{ex.Message}")); //return Task.FromResult(new RouteScannerResults() { Successful = false }); return(new RouteScannerResults() { Successful = false }); } finally { State = ScanWorkerState.Idle; } }
public void Initialize() { var sp = Stopwatch.StartNew(); try { ServerStore.Initialize(); } catch (Exception e) { if (_logger.IsOperationsEnabled) { _logger.Operations("Could not open the server store", e); } throw; } if (_logger.IsInfoEnabled) { _logger.Info(string.Format("Server store started took {0:#,#;;0} ms", sp.ElapsedMilliseconds)); } sp.Restart(); Router = new RequestRouter(RouteScanner.Scan(), this); try { _webHost = new WebHostBuilder() .CaptureStartupErrors(captureStartupErrors: true) .UseKestrel(options => { options.ShutdownTimeout = TimeSpan.FromSeconds(1); }) .UseUrls(Configuration.Core.ServerUrl) .UseStartup <RavenServerStartup>() .ConfigureServices(services => { services.AddSingleton(Router); services.AddSingleton(this); services.Configure <FormOptions>(options => { options.MultipartBodyLengthLimit = long.MaxValue; }); }) // ReSharper disable once AccessToDisposedClosure .Build(); if (_logger.IsInfoEnabled) { _logger.Info("Initialized Server..."); } } catch (Exception e) { if (_logger.IsInfoEnabled) { _logger.Info("Could not configure server", e); } throw; } if (_logger.IsInfoEnabled) { _logger.Info(string.Format("Configuring HTTP server took {0:#,#;;0} ms", sp.ElapsedMilliseconds)); } try { _webHost.Start(); _tcpListenerTask = StartTcpListener(); } catch (Exception e) { if (_logger.IsOperationsEnabled) { _logger.Operations("Could not start server", e); } throw; } try { _latestVersionCheck.Initialize(); } catch (Exception e) { if (_logger.IsInfoEnabled) { _logger.Info("Could not setup latest version check.", e); } } try { LicenseManager.Initialize(); } catch (Exception e) { if (_logger.IsInfoEnabled) { _logger.Info("Could not setup license check.", e); } ServerStore.Alerts.AddAlert(new Alert { Type = AlertType.LicenseManagerInitializationError, Key = nameof(AlertType.LicenseManagerInitializationError), Severity = AlertSeverity.Info, Content = new LicenseManager.InitializationErrorAlertContent(e), Message = LicenseManager.InitializationErrorAlertContent.FormatMessage() }); } }
public void Initialize() { var sp = Stopwatch.StartNew(); var clusterCert = InitializeClusterCertificate(out var httpsCert); try { ServerStore.Initialize(); } catch (Exception e) { if (Logger.IsOperationsEnabled) { Logger.Operations("Could not open the server store", e); } throw; } if (Logger.IsInfoEnabled) { Logger.Info(string.Format("Server store started took {0:#,#;;0} ms", sp.ElapsedMilliseconds)); } sp.Restart(); ListenToPipes().IgnoreUnobservedExceptions(); Router = new RequestRouter(RouteScanner.Scan(), this); try { void ConfigureKestrel(KestrelServerOptions options) { options.Limits.MaxRequestLineSize = (int)Configuration.Http.MaxRequestLineSize.GetValue(SizeUnit.Bytes); options.Limits.MaxRequestBodySize = null; // no limit! options.Limits.MinResponseDataRate = null; // no limit! options.Limits.MinRequestBodyDataRate = null; // no limit! if (Configuration.Http.MinDataRatePerSecond.HasValue && Configuration.Http.MinDataRateGracePeriod.HasValue) { options.Limits.MinResponseDataRate = new MinDataRate(Configuration.Http.MinDataRatePerSecond.Value.GetValue(SizeUnit.Bytes), Configuration.Http.MinDataRateGracePeriod.Value.AsTimeSpan); options.Limits.MinRequestBodyDataRate = new MinDataRate(Configuration.Http.MinDataRatePerSecond.Value.GetValue(SizeUnit.Bytes), Configuration.Http.MinDataRateGracePeriod.Value.AsTimeSpan); } if (Configuration.Http.MaxRequestBufferSize.HasValue) { options.Limits.MaxRequestBufferSize = Configuration.Http.MaxRequestBufferSize.Value.GetValue(SizeUnit.Bytes); } var actualCert = httpsCert ?? clusterCert; if (actualCert != null) { var adapterOptions = new HttpsConnectionAdapterOptions { ServerCertificate = actualCert.Certificate, CheckCertificateRevocation = true, ClientCertificateMode = ClientCertificateMode.AllowCertificate, SslProtocols = SslProtocols.Tls12, ClientCertificateValidation = (cert, chain, errors) => // Here we are explicitly ignoring trust chain issues for client certificates // this is because we don't actually require trust, we just use the certificate // as a way to authenticate. The admin is going to tell us which specific certs // we can trust anyway, so we can ignore such errors. errors == SslPolicyErrors.RemoteCertificateChainErrors || errors == SslPolicyErrors.None }; var uri = new Uri(Configuration.Core.ServerUrl); var host = uri.DnsSafeHost; var ipAddresses = GetListenIpAddresses(host); var loggerFactory = options.ApplicationServices.GetRequiredService <ILoggerFactory>(); var adapter = new AuthenticatingAdapter(this, new HttpsConnectionAdapter(adapterOptions, loggerFactory)); foreach (var address in ipAddresses) { options.Listen(address, uri.Port, listenOptions => { listenOptions.ConnectionAdapters.Add(adapter); }); } } } _webHost = new WebHostBuilder() .CaptureStartupErrors(captureStartupErrors: true) .UseKestrel(ConfigureKestrel) .UseUrls(Configuration.Core.ServerUrl) .UseStartup <RavenServerStartup>() .UseShutdownTimeout(TimeSpan.FromSeconds(1)) .ConfigureServices(services => { if (Configuration.Http.UseResponseCompression) { services.Configure <ResponseCompressionOptions>(options => { options.EnableForHttps = Configuration.Http.AllowResponseCompressionOverHttps; options.Providers.Add(typeof(GzipCompressionProvider)); options.Providers.Add(typeof(DeflateCompressionProvider)); }); services.Configure <GzipCompressionProviderOptions>(options => { options.Level = Configuration.Http.GzipResponseCompressionLevel; }); services.Configure <DeflateCompressionProviderOptions>(options => { options.Level = Configuration.Http.DeflateResponseCompressionLevel; }); services.AddResponseCompression(); } services.AddSingleton(Router); services.AddSingleton(this); services.Configure <FormOptions>(options => { options.MultipartBodyLengthLimit = long.MaxValue; }); }) // ReSharper disable once AccessToDisposedClosure .Build(); ClusterCertificateHolder = ClusterCertificateHolder ?? httpsCert ?? new CertificateHolder(); } catch (Exception e) { if (Logger.IsInfoEnabled) { Logger.Info("Could not configure server", e); } throw; } if (Logger.IsInfoEnabled) { Logger.Info(string.Format("Configuring HTTP server took {0:#,#;;0} ms", sp.ElapsedMilliseconds)); } try { _webHost.Start(); var serverAddressesFeature = _webHost.ServerFeatures.Get <IServerAddressesFeature>(); WebUrl = GetWebUrl(serverAddressesFeature.Addresses.First()).TrimEnd('/'); if (Logger.IsInfoEnabled) { Logger.Info($"Initialized Server... {WebUrl}"); } ServerStore.TriggerDatabases(); _tcpListenerStatus = StartTcpListener(); StartSnmp(); } catch (Exception e) { if (Logger.IsOperationsEnabled) { Logger.Operations("Could not start server", e); } throw; } }