public async Task StopAsyncCallsCompleteWithThrownException()
        {
            var options = new KestrelServerOptions
            {
                ListenOptions =
                {
                    new ListenOptions(new IPEndPoint(IPAddress.Loopback, 0))
                }
            };

            var unbind          = new SemaphoreSlim(0);
            var unbindException = new InvalidOperationException();

            var mockTransport = new Mock <ITransport>();

            mockTransport
            .Setup(transport => transport.BindAsync())
            .Returns(Task.CompletedTask);
            mockTransport
            .Setup(transport => transport.UnbindAsync())
            .Returns(async() =>
            {
                await unbind.WaitAsync();
                throw unbindException;
            });
            mockTransport
            .Setup(transport => transport.StopAsync())
            .Returns(Task.CompletedTask);

            var mockTransportFactory = new Mock <ITransportFactory>();

            mockTransportFactory
            .Setup(transportFactory => transportFactory.Create(It.IsAny <IEndPointInformation>(), It.IsAny <IConnectionDispatcher>()))
            .Returns(mockTransport.Object);

            var mockLoggerFactory = new Mock <ILoggerFactory>();
            var mockLogger        = new Mock <ILogger>();

            mockLoggerFactory.Setup(m => m.CreateLogger(It.IsAny <string>())).Returns(mockLogger.Object);
            var server = new KestrelServer(Options.Create(options), mockTransportFactory.Object, mockLoggerFactory.Object);
            await server.StartAsync(new DummyApplication(), CancellationToken.None);

            var stopTask1 = server.StopAsync(default(CancellationToken));
            var stopTask2 = server.StopAsync(default(CancellationToken));
            var stopTask3 = server.StopAsync(default(CancellationToken));

            Assert.False(stopTask1.IsCompleted);
            Assert.False(stopTask2.IsCompleted);
            Assert.False(stopTask3.IsCompleted);

            unbind.Release();

            var timeout = TestConstants.DefaultTimeout;

            Assert.Same(unbindException, await Assert.ThrowsAsync <InvalidOperationException>(() => stopTask1.TimeoutAfter(timeout)));
            Assert.Same(unbindException, await Assert.ThrowsAsync <InvalidOperationException>(() => stopTask2.TimeoutAfter(timeout)));
            Assert.Same(unbindException, await Assert.ThrowsAsync <InvalidOperationException>(() => stopTask3.TimeoutAfter(timeout)));

            mockTransport.Verify(transport => transport.UnbindAsync(), Times.Once);
        }
        public async Task StopAsyncCallsCompleteWhenFirstCallCompletes()
        {
            var options = new KestrelServerOptions
            {
                ListenOptions =
                {
                    new ListenOptions(new IPEndPoint(IPAddress.Loopback, 0))
                }
            };

            var unbind = new SemaphoreSlim(0);
            var stop   = new SemaphoreSlim(0);

            var mockTransport = new Mock <ITransport>();

            mockTransport
            .Setup(transport => transport.BindAsync())
            .Returns(Task.CompletedTask);
            mockTransport
            .Setup(transport => transport.UnbindAsync())
            .Returns(async() => await unbind.WaitAsync());
            mockTransport
            .Setup(transport => transport.StopAsync())
            .Returns(async() => await stop.WaitAsync());

            var mockTransportFactory = new Mock <ITransportFactory>();

            mockTransportFactory
            .Setup(transportFactory => transportFactory.Create(It.IsAny <IEndPointInformation>(), It.IsAny <IConnectionDispatcher>()))
            .Returns(mockTransport.Object);

            var mockLoggerFactory = new Mock <ILoggerFactory>();
            var mockLogger        = new Mock <ILogger>();

            mockLoggerFactory.Setup(m => m.CreateLogger(It.IsAny <string>())).Returns(mockLogger.Object);
            var server = new KestrelServer(Options.Create(options), mockTransportFactory.Object, mockLoggerFactory.Object);
            await server.StartAsync(new DummyApplication(), CancellationToken.None);

            var stopTask1 = server.StopAsync(default(CancellationToken));
            var stopTask2 = server.StopAsync(default(CancellationToken));
            var stopTask3 = server.StopAsync(default(CancellationToken));

            Assert.False(stopTask1.IsCompleted);
            Assert.False(stopTask2.IsCompleted);
            Assert.False(stopTask3.IsCompleted);

            unbind.Release();
            stop.Release();

            await Task.WhenAll(new[] { stopTask1, stopTask2, stopTask3 }).DefaultTimeout();

            mockTransport.Verify(transport => transport.UnbindAsync(), Times.Once);
            mockTransport.Verify(transport => transport.StopAsync(), Times.Once);
        }
Example #3
0
        public static async Task Main(string[] args)
        {
            shutdown = new ManualResetEventSlim();
            Console.CancelKeyPress += Console_CancelKeyPress;

            var options = new KestrelServerOptions();

            options.ListenAnyIP(5000, c =>
            {
                c.UseHttpApplication <Application>();
            });

            var server = new KestrelServer(
                Options.Create(options),
                new SocketTransportFactory(
                    Options.Create(new SocketTransportOptions()),
                    NullLoggerFactory.Instance),
                NullLoggerFactory.Instance);

            var application = new HostingApplication((context) => Task.CompletedTask, new DefaultHttpContextFactory(new ServiceProvider()));
            await server.StartAsync(application, CancellationToken.None);

            Console.WriteLine("Application started.");
            shutdown.Wait();

            Console.WriteLine("Shutting down...");
            server.Dispose();
            await server.StopAsync(CancellationToken.None);
        }
Example #4
0
        public async Task RunAsync(int port, int threadCount)
        {
            var lifetime = new ApplicationLifetime(NullLoggerFactory.Instance.CreateLogger <ApplicationLifetime>());

            Console.CancelKeyPress += (sender, e) => lifetime.StopApplication();

            var libuvOptions = new LibuvTransportOptions
            {
                ThreadCount = threadCount
            };
            var libuvTransport = new LibuvTransportFactory(
                Options.Create(libuvOptions),
                lifetime,
                NullLoggerFactory.Instance);

            var serverOptions = new KestrelServerOptions();

            serverOptions.Listen(IPAddress.Any, port);

            var server = new KestrelServer(Options.Create(serverOptions),
                                           libuvTransport,
                                           NullLoggerFactory.Instance);

            await server.StartAsync(this, CancellationToken.None);

            Console.WriteLine($"Server listening on http://*:{port} with {libuvOptions.ThreadCount} thread(s)");

            lifetime.ApplicationStopping.WaitHandle.WaitOne();

            await server.StopAsync(CancellationToken.None);
        }
Example #5
0
        public static void Main(string[] args)
        {
            var loggerFactory = new NoOpLoggerFactory();
            var kestrelServer = new KestrelServer(new ConfigureKestrelServerOptions(), new SocketTransportFactory(new ConfigureSocketTransportOptions(), loggerFactory), loggerFactory);

            kestrelServer.Options.ListenLocalhost(8080);
            kestrelServer.StartAsync(new HttpApp(), CancellationToken.None).GetAwaiter().GetResult();

            // todo: you can update this code to do some other processing on this thread, and you can remove the call to StopAsync() if you don't need it.
            Thread.Sleep(60000);
            Console.WriteLine("shutting down");
            kestrelServer.StopAsync(CancellationToken.None).GetAwaiter().GetResult();
        }
Example #6
0
        /// <summary>
        /// Shuts down the server
        /// </summary>
        public async Task StopAsync()
        {
            if (IsListening)
            {
                IsListening = false;
                _stopSource.Cancel();
                var cts = new CancellationTokenSource(500);
                await _server.StopAsync(cts.Token);

                _stopSource.Dispose();
                _server.Dispose();
            }
        }
        public async Task RunAsync(ITransportFactory transportFactory, IEndPointInformation endPointInformation, ApplicationLifetime lifetime)
        {
            Console.CancelKeyPress += (sender, e) => lifetime.StopApplication();

            var serverOptions = new KestrelServerOptions();

            serverOptions.Listen(endPointInformation.IPEndPoint);

            var server = new KestrelServer(Options.Create(serverOptions),
                                           transportFactory,
                                           NullLoggerFactory.Instance);

            await server.StartAsync(this, CancellationToken.None);

            Console.WriteLine($"Server ({nameof(PlainTextApplication)}) listening on http://{endPointInformation.IPEndPoint}");

            lifetime.ApplicationStopping.WaitHandle.WaitOne();

            await server.StopAsync(CancellationToken.None);
        }
Example #8
0
        public void Run()
        {
            var serviceCollection = new ServiceCollection();

            serviceCollection.AddTransient <IHttpContextFactory, DefaultHttpContextFactory>();
            serviceCollection.AddTransient <ILogger, Logger <KestrelServer> >();
            var listener = new DiagnosticListener("HtcSharpServer");

            serviceCollection.AddSingleton <DiagnosticListener>(listener);
            serviceCollection.AddSingleton <DiagnosticSource>(listener);
            serviceCollection.AddOptions();
            serviceCollection.AddLogging();
            var serviceProvider = serviceCollection.BuildServiceProvider();

            var loggerFactory  = LoggerFactory.Create(DoSomething);
            var socketListener = new SocketTransportFactory(GetSocketTransportOptions(), loggerFactory);
            var kestrelServer  = new KestrelServer(GetKestrelServerOptions(serviceProvider), socketListener, loggerFactory);

            while (true)
            {
                Console.Write(@"> ");
                var msg = Console.ReadLine();
                if (msg == null)
                {
                    continue;
                }
                if (msg.Equals("exit", StringComparison.CurrentCultureIgnoreCase))
                {
                    kestrelServer.StopAsync(CancellationToken.None).GetAwaiter().GetResult();
                    return;
                }
                else if (msg.Equals("start", StringComparison.CurrentCultureIgnoreCase))
                {
                    Start(kestrelServer, serviceProvider, loggerFactory);
                }
            }
        }
 public async ValueTask UnbindAsync(CancellationToken cancellationToken = default)
 {
     await _server.StopAsync(cancellationToken);
 }
Example #10
0
        public async ValueTask UnbindAsync(CancellationToken cancellationToken = default)
        {
            await _server.StopAsync(cancellationToken).ConfigureAwait(false);

            _acceptQueue.Writer.TryComplete();
        }
Example #11
0
 public async Task Stop()
 {
     _stopCancellationToken = new CancellationTokenSource();
     await _kestrelServer.StopAsync(_stopCancellationToken.Token);
 }
Example #12
0
 public async Task StopAsync(CancellationToken cancellationToken)
 {
     await _server.StopAsync(cancellationToken);
 }