Example #1
0
        /// <summary>
        /// Starts the HTTP listener.
        /// </summary>
        private void StartHttpListener()
        {
            try
            {
                //create http listener
                _logger.WriteMessage("Service", $"Creating HTTP listener..");
                _httpListener = new SimpleHttpListener(_config.ListenPort, _errorHandler);

                //add statistics handler
                _logger.WriteMessage("Service", $"Registering 'Statistics' HTTP handler..");
                StatisticsHandler statisticsHandler = new StatisticsHandler(_errorHandler, _config, _logger, _serviceStats, _statsWriters);
                _httpListener.RegisterHandler("statistics", statisticsHandler);

                //add config handler
                _logger.WriteMessage("Service", $"Registering 'Config' HTTP handler..");
                ConfigHandler configHandler = new ConfigHandler(_errorHandler, _config, _logger, _serviceStats);
                _httpListener.RegisterHandler("config", configHandler);

                //add gpio handler
                _logger.WriteMessage("Service", $"Registering 'GPIO' HTTP handler..");
                GpioHandler gpioHandler = new GpioHandler(_errorHandler, _config, _logger, _serviceStats, _gpio);
                _httpListener.RegisterHandler("gpio", gpioHandler);

                //pre-init
                _logger.WriteMessage("Service", $"Running pre-init handler functions..");
                foreach (IHttpHandler handler in _httpListener.GetHandlers())
                {
                    handler.PreInitialize();
                }

                //start http listener
                _logger.WriteMessage("Service", $"Starting HTTP listener on port {_config.ListenPort}..");
                _httpListener.Start();

                //pre-init
                _logger.WriteMessage("Service", $"Running post-init handler functions..");
                foreach (IHttpHandler handler in _httpListener.GetHandlers())
                {
                    handler.PostInitialize();
                }

                //success
                _logger.WriteMessage("Service", $"HTTP listener successfully connected");

                //state
                _serviceState.SetState(ServiceStateType.Up);
            }
            catch (Exception ex)
            {
                _errorHandler?.LogError(ex);
            }
        }
        public async Task RunAsync()
        {
            _listener.Start();

            while (!_stopRequired)
            {
                try
                {
                    MyHttpListenerContext context = await _listener.GetContextAsync().ConfigureAwait(false);

                    if (context == null)
                    {
                        return; // Слушатель был остановлен.
                    }
                    if (context.Request.Method == "GET" && context.Request.Uri.LocalPath.StartsWith("/.well-known/acme-challenge/"))
                    {
                        Log.Information($"Принят HTTP запрос: {context.Request.Uri.Scheme}://{context.Request.Uri.Host}/...");

                        MyHttpListenerResponse response = context.Response;
                        response.ContentType = "plain/text";

                        byte[] content = Encoding.ASCII.GetBytes(_keyAuthString);
                        response.ContentLength64 = content.Length;

                        using (response.OutputStream)
                        {
                            await response.OutputStream.WriteAsync(content, 0, content.Length).ConfigureAwait(false);

                            await response.OutputStream.CloseAsync().ConfigureAwait(false);
                        }

                        _tcs.TrySetResult(0);

                        Log.Information($"Отправлен ключ подтверждения.");
                    }
                }
                catch (HttpListenerClosedException)
                {
                    // Грациозная остановка.
                    break;
                }
                catch when(_stopRequired)
                    {
                        // Грязная остановка.
                        break;
                    }
            }
        }