Пример #1
0
        static async Task RunHttpApplication(HttpApplication application, int port)
        {
            var socketTransportOptions = new SocketTransportOptions();
            var socketTransportFactory = new SocketTransportFactory(Options.Create(socketTransportOptions), NullLoggerFactory.Instance);
            var kestrelServerOptions   = new KestrelServerOptions();

            kestrelServerOptions.ListenLocalhost(port);
            kestrelServerOptions.ApplicationServices = new ServiceProvider();

            using var kestrelServer = new KestrelServer(Options.Create(kestrelServerOptions), socketTransportFactory, NullLoggerFactory.Instance);

            await kestrelServer.StartAsync(application, CancellationToken.None);

            Console.WriteLine("Listening on:");
            foreach (var address in kestrelServer.Features.Get <IServerAddressesFeature>().Addresses)
            {
                Console.WriteLine(" - " + address);
            }

            Console.WriteLine("Process CTRL+C to quit");
            var wh = new ManualResetEventSlim();

            Console.CancelKeyPress += (sender, e) => wh.Set();
            wh.Wait();
        }
Пример #2
0
        /// <summary>
        /// Starts listening for new Websocket stream connections
        /// </summary>
        /// <param name="endpoint">The endpoint to listen to</param>
        /// <param name="connectionAdded">A connection delegate that is called when a new client is connected</param>
        /// <param name="bufferSize">Buffer sized used for receiving</param>
        /// <param name="defaultPage">Default response to clients like browsers</param>
        /// <returns></returns>
        public Task StartAsync(IPEndPoint endpoint, Func <WsStream, Task> connectionAdded, int bufferSize = Config.InternalBufferSize, string defaultPage = Config.Version)
        {
            if (IsListening)
            {
                throw new InvalidOperationException("WsServer is already running!");
            }
            _stopSource = new CancellationTokenSource();
            IsListening = true;
            // setup kestrel parameters
            var logger                 = new NullLoggerFactory();
            var kestrelOptions         = new KestrelServerOptions();
            var lifetime               = new ApplicationLifetime(logger.CreateLogger <ApplicationLifetime>());
            var socketTransportFactory = new SocketTransportFactory(Options.Create(new SocketTransportOptions()), lifetime, logger);

            // start kestrel
            _server = new KestrelServer(Options.Create(kestrelOptions), socketTransportFactory, logger);
            _server.Options.Listen(endpoint);
            return(_server
                   .StartAsync(new KestrelRequestHandler(connectionAdded, bufferSize, _stopSource.Token, defaultPage),
                               CancellationToken.None).ContinueWith(
                       x =>
            {
                var addr = _server.Features.Get <IServerAddressesFeature>();
                ListeningAddresses = addr.Addresses.ToArray();
            }));
        }
Пример #3
0
        static async Task Main(string[] args)
        {
            NullLoggerFactory      nullLoggerFactory      = new NullLoggerFactory();
            SocketTransportOptions socketTransportOptions = new SocketTransportOptions();
            SocketTransportFactory socketTransportFactory = new SocketTransportFactory(
                new OptionsWrapper <SocketTransportOptions>(socketTransportOptions), nullLoggerFactory);
            KestrelServerOptions kestrelServerOptions = new KestrelServerOptions();

            //kestrelServerOptions.AllowSynchronousIO = true;
            kestrelServerOptions.ListenLocalhost(5000);
            kestrelServerOptions.ApplicationServices = new ServiceProvider();
            kestrelServerOptions.ListenLocalhost(5001, listenOptions =>
            {
                X509Certificate2 serverCertificate = new X509Certificate2("certificate.pfx", "xxxx");
                listenOptions.UseHttps(serverCertificate);
            });

            using (KestrelServer kestrelServer =
                       new KestrelServer(new OptionsWrapper <KestrelServerOptions>(kestrelServerOptions),
                                         socketTransportFactory,
                                         nullLoggerFactory
                                         )
                   )
            {
                await kestrelServer.StartAsync(new HttpApplication(), CancellationToken.None);

                Console.ReadLine();
            }
        }
Пример #4
0
        static async Task Main(string[] args)
        {
            var socketTransportOptions = new SocketTransportOptions();
            var socketTransportFactory = new SocketTransportFactory(Options.Create(socketTransportOptions), NullLoggerFactory.Instance);
            var kestrelServerOptions   = new KestrelServerOptions();

            kestrelServerOptions.Listen(IPAddress.Any, 8080);
            kestrelServerOptions.AddServerHeader = false;

            using var kestrelServer = new KestrelServer(Options.Create(kestrelServerOptions), socketTransportFactory, NullLoggerFactory.Instance);

            await kestrelServer.StartAsync(new HttpApplication(), CancellationToken.None);

            Console.WriteLine("Listening on:");

            foreach (var address in kestrelServer.Features.Get <IServerAddressesFeature>().Addresses)
            {
                Console.WriteLine(" - " + address);
            }

            Console.WriteLine("Process CTRL+C to quit");
            var wh = new ManualResetEventSlim();

            Console.CancelKeyPress += (sender, e) => wh.Set();
            wh.Wait();
        }
        public async ValueTask <IConnectionListener> BindAsync(EndPoint endpoint, CancellationToken cancellationToken = default)
        {
            IPEndPoint iPEndPoint = null;

            switch (endpoint)
            {
            // Kestrel doesn't natively support UriEndpoints as yet
            case UriEndPoint uriEndPoint:
                IPAddress address = null;
                if (uriEndPoint.Uri.Host == "localhost")
                {
                    address = IPAddress.Loopback;
                }
                else
                {
                    IPAddress.Parse(uriEndPoint.Uri.Host);
                }
                iPEndPoint = new IPEndPoint(address, uriEndPoint.Uri.Port);
                break;

            case IPEndPoint ip:
                iPEndPoint = ip;
                break;

            default:
                throw new NotSupportedException($"{endpoint} not supported");
            }

            var services = new ServiceCollection();

            services.AddSingleton(_loggerFactory);
            services.AddLogging();
            var serverOptions = Options.Create(new KestrelServerOptions()
            {
                ApplicationServices = services.BuildServiceProvider()
            });;
            var           socketOptions          = Options.Create(new SocketTransportOptions());
            var           socketTransportFactory = new SocketTransportFactory(socketOptions, _loggerFactory);
            var           server        = new KestrelServer(serverOptions, socketTransportFactory, _loggerFactory);
            ListenOptions listenOptions = null;

            // Bind an HTTP/2 endpoint
            server.Options.Listen(iPEndPoint, options =>
            {
                options.UseHttps();
                options.Protocols = HttpProtocols.Http2;
                // Storing the options so we can get the resolved EndPoint later
                listenOptions = options;
            });

            var listener = new Http2ConnectionListener(server);

            await listener.BindAsync(cancellationToken).ConfigureAwait(false);

            listener.EndPoint = listenOptions.IPEndPoint;

            return(listener);
        }
Пример #6
0
        private SocketTransportFactory CreatSocketTransportFactory(ApplicationLifetime lifeTime,
                                                                   LoggerFactory loggerFactory)
        {
            var configureOptions = new ConfigureOptions <SocketTransportOptions>(transportOptions =>
                                                                                 transportOptions.IOQueueCount = _serverSettings.IOQueueCount);
            var optionsFactory = new OptionsFactory <SocketTransportOptions>(new[] { configureOptions },
                                                                             new List <IPostConfigureOptions <SocketTransportOptions> >());
            var optionsManager         = new OptionsManager <SocketTransportOptions>(optionsFactory);
            var socketTransportFactory = new SocketTransportFactory(optionsManager, lifeTime, loggerFactory);

            return(socketTransportFactory);
        }
Пример #7
0
        public KestrelWebServer(int port, List <IKoobooMiddleWare> middlewares, bool forcessl = false)
        {
            var life = new ApplicationLifetime(null);

            var log = new Microsoft.Extensions.Logging.Abstractions.NullLoggerFactory();

            SocketTransportFactory usesocket = new SocketTransportFactory(new koobooSocketOption(), life, log);

            _server = new KestrelServer(new KoobooServerOption(port, forcessl), usesocket, log);

            SetMiddleWares(middlewares);
        }
Пример #8
0
        private SocketTransportFactory GetSocketTransportFactory()
        {
            var transportFactory = new SocketTransportFactory(
                Options.Create(new SocketTransportOptions
            {
                IOQueueCount = 42
            }),
                this,
                this
                );

            return(transportFactory);
        }
Пример #9
0
 public Task Load(JObject config, Core.Logging.Abstractions.ILogger logger)
 {
     _logger = logger;
     Configure(config);
     UrlMapper.RegisterIndexFile("index.html");
     UrlMapper.RegisterIndexFile("index.htm");
     _serviceProvider = SetupServiceCollection().BuildServiceProvider();
     _loggerFactory   = LoggerFactory.Create(builder => {
         builder.AddProvider(new HtcLoggerProvider(_logger));
     });
     _socketTransportFactory = new SocketTransportFactory(GetSocketTransportOptions(config), _loggerFactory);
     _kestrelServer          = new KestrelServer(GetKestrelServerOptions(config, _serviceProvider), _socketTransportFactory, _loggerFactory);
     return(Task.CompletedTask);
 }
Пример #10
0
        static async Task Main(string[] args)
        {
            var serverOptions = new KestrelServerOptions();

            serverOptions.ListenAnyIP(8080);

            var transportOptions    = new SocketTransportOptions();
            var loggerFactory       = new NullLoggerFactory();
            var applicationLifetime = new ApplicationLifetime();

            var transportFactory = new SocketTransportFactory(
                new OptionsWrapper <SocketTransportOptions>(transportOptions), applicationLifetime, loggerFactory);

            using (var server = new KestrelServer(new OptionsWrapper <KestrelServerOptions>(serverOptions),
                                                  transportFactory, loggerFactory))
            {
                await server.StartAsync(new Application(), CancellationToken.None);

                Console.ReadLine();
            }
        }
Пример #11
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 Task Start()
        {
            IHttpApplication <HostingApplication.Context> app;

            try
            {
                if (_handler == null)
                {
                    throw new Exception("Missing Handler - Call SetHandler()");
                }

                ILoggerFactory loggerFactory = new LoggerFactory();
                loggerFactory.AddProvider(new KestrelLoggerProvider());
                var services = new ServiceCollection();
                services.AddSingleton(loggerFactory);
                services.AddLogging();

                var serviceProvider      = GetProviderFromFactory(services);
                var kestrelServerOptions = Options.Create(new KestrelServerOptions());
                kestrelServerOptions.Value.ApplicationServices = serviceProvider;

                foreach (uint httpPort in _setting.HttpPorts)
                {
                    kestrelServerOptions.Value.ListenAnyIP((int)httpPort);
                }

                if (_setting.HttpsEnabled)
                {
                    kestrelServerOptions.Value.ListenAnyIP(_setting.HttpsPort,
                                                           listenOptions =>
                    {
                        var cert = new X509Certificate2(_setting.HttpsCertPath,
                                                        _setting.HttpsCertPw);
                        listenOptions.UseHttps(new HttpsConnectionAdapterOptions
                        {
                            ServerCertificate = cert
                                                //  SslProtocols = SslProtocols.Tls12 | SslProtocols.Tls11 | SslProtocols.Tls
                        });
                    });
                }
                // kestrelServerOptions.Value.ListenAnyIP(_setting.WebSetting.HttpsPort);

                kestrelServerOptions.Value.AddServerHeader = false;

                var socketTransportOptions = Options.Create(new SocketTransportOptions());
                _applicationLifetime = new ApplicationLifetime(
                    loggerFactory.CreateLogger <ApplicationLifetime>()
                    );
                ITransportFactory transportFactory = new SocketTransportFactory(
                    socketTransportOptions, _applicationLifetime, loggerFactory
                    );


                _server = new KestrelServer(kestrelServerOptions, transportFactory, loggerFactory);
                var diagnosticListener = new DiagnosticListener("a");
                var formOptions        = Options.Create(new FormOptions());
                IHttpContextFactory httpContextFactory = new HttpContextFactory(formOptions);
                app = new HostingApplication(
                    RequestDelegate,
                    loggerFactory.CreateLogger <KestrelWebServer>(),
                    diagnosticListener,
                    httpContextFactory
                    );
            }
            catch (Exception ex)
            {
                Logger.Exception(ex);
                return;
            }

            var   kestrelStartup = _server.StartAsync(app, _cancellationTokenSource.Token);
            await kestrelStartup;

            _cancellationTokenSource.Token.Register(
                state => ((IApplicationLifetime)state).StopApplication(),
                _applicationLifetime
                );
            var completionSource = new TaskCompletionSource <object>(
                TaskCreationOptions.RunContinuationsAsynchronously
                );

            _applicationLifetime.ApplicationStopping.Register(
                obj => ((TaskCompletionSource <object>)obj).TrySetResult(null),
                completionSource
                );
            var   kestrelCompleted       = completionSource.Task;
            var   kestrelCompletedResult = await kestrelCompleted;
            var   kestrelShutdown        = _server.StopAsync(new CancellationToken());
            await kestrelShutdown;
        }
Пример #13
0
 public LibraryModeServer(Protocol.IProcessorFactory processorFactory, SocketTransportFactory transportFactory) :
     base(processorFactory, transportFactory)
 {
 }
 public async Task ThrowsNotImplementedExceptionWhenBindingToUriEndPoint()
 {
     var socketTransportFactory = new SocketTransportFactory(Options.Create(new SocketTransportOptions()), new LoggerFactory());
     await Assert.ThrowsAsync <NotImplementedException>(async() => await socketTransportFactory.BindAsync(new UriEndPoint(new Uri("http://127.0.0.1:5554"))));
 }
Пример #15
0
        public async ValueTask <IConnectionListener> BindAsync(EndPoint endpoint, CancellationToken cancellationToken = default)
        {
            IPEndPoint iPEndPoint = null;
            var        path       = "";

            switch (endpoint)
            {
            // Kestrel doesn't natively support UriEndpoints as yet
            case UriEndPoint uriEndPoint:
                IPAddress address = null;
                if (uriEndPoint.Uri.Host == "localhost")
                {
                    address = IPAddress.Loopback;
                }
                else
                {
                    IPAddress.Parse(uriEndPoint.Uri.Host);
                }
                iPEndPoint = new IPEndPoint(address, uriEndPoint.Uri.Port);
                path       = uriEndPoint.Uri.LocalPath != "/" ? uriEndPoint.Uri.LocalPath : "";
                break;

            case IPEndPoint ip:
                iPEndPoint = ip;
                break;

            default:
                throw new NotSupportedException($"{endpoint} not supported");
            }

            var services = new ServiceCollection();

            services.AddOptions();
            services.AddSingleton(_loggerFactory);
            services.AddLogging();
            services.AddConnections();
            services.AddSingleton <IHostApplicationLifetime>(this);
            var diagnosticListener = new DiagnosticListener("WebSocketServer");

            services.AddSingleton(diagnosticListener);
            var serverOptions = Options.Create(new KestrelServerOptions()
            {
                ApplicationServices = services.BuildServiceProvider()
            });;
            var socketOptions = Options.Create(new SocketTransportOptions());
            IConnectionListenerFactory transportFactories = new SocketTransportFactory(socketOptions, _loggerFactory);

            var           server        = new KestrelServer(serverOptions, transportFactories, _loggerFactory);
            ListenOptions listenOptions = null;

            // Bind an HTTP/1 endpoint
            server.Options.Listen(iPEndPoint, o =>
            {
                o.UseHttps();
                o.Protocols = HttpProtocols.Http1;
                // Storing the options so we can get the resolved EndPoint later
                listenOptions = o;
            });

            var listener = new WebSocketConnectionListener(server, _configure, serverOptions.Value.ApplicationServices, path);

            await listener.BindAsync(cancellationToken);

            listener.EndPoint = listenOptions.IPEndPoint;

            return(listener);
        }
 public TrialSocketTransportFactory(SocketTransportFactory factory)
 {
     _factory = factory;
 }
Пример #17
0
 public async Task ThrowsNotSupportedExceptionWhenBindingToFileHandleEndPoint()
 {
     var socketTransportFactory = new SocketTransportFactory(Options.Create(new SocketTransportOptions()), Mock.Of <ILoggerFactory>());
     await Assert.ThrowsAsync <NotSupportedException>(async() => await socketTransportFactory.BindAsync(new FileHandleEndPoint(0, FileHandleType.Auto)));
 }