public static void ConfigureEndpoints(this KestrelServerOptions options)
        {
            var configuration = options.ApplicationServices.GetRequiredService <IConfiguration>();

            var endpoints = configuration.GetSection("HttpServer:Endpoints")
                            .GetChildren()
                            .ToDictionary(section => section.Key, section => {
                var endpoint = new EndpointConfigurationSettings();
                section.Bind(endpoint);
                return(endpoint);
            });

            foreach (var endpoint in endpoints)
            {
                CreateEndPoint(options, endpoint.Value);
            }
        }
        private static void CreateEndPoint(KestrelServerOptions options, EndpointConfigurationSettings endpoint)
        {
            var environment = options.ApplicationServices.GetRequiredService <IHostEnvironment>();
            var port        = endpoint.Port ?? (endpoint.Scheme == "https" ? 443 : 80);
            var ipAddresses = new List <IPAddress>();

            if (endpoint.Host == "localhost")
            {
                Log.Logger.Information("Binding to localhost:{port}.", port);
                ipAddresses.Add(IPAddress.Loopback);
            }
            else if (IPAddress.TryParse(endpoint.Host, out var address))
            {
                Log.Logger.Information("Binding to {ipAddress}:{port}.", address.ToString(), port);
                ipAddresses.Add(address);
            }
            else
            {
                Log.Logger.Information("Binding to IPAddress.Any:{port}", port);
                ipAddresses.Add(IPAddress.Any);
            }

            foreach (var address in ipAddresses)
            {
                options.Listen(address, port,
                               listenOptions => {
                    listenOptions.Protocols = GetHttpVersion(endpoint);

                    if (endpoint.Scheme != "https")
                    {
                        return;
                    }

                    var certificate = LoadCertificate(endpoint, environment);
                    listenOptions.UseHttps(certificate);
                });
            }
        }
 private static HttpProtocols GetHttpVersion(EndpointConfigurationSettings options)
 {
     return(options.Version switch {
         2 => HttpProtocols.Http2,
         _ => HttpProtocols.Http1
     });