private async Task ProcessAcmeChallenge(HttpContext context)
        {
            var path = context.Request.Path.ToString();

            _logger.LogDebug("Challenge invoked: {challengePath}", path);

            var requestedToken = path.Substring($"{MagicPrefix}/".Length);
            var allChallenges  = await _persistenceService.GetPersistedChallengesAsync();

            var matchingChallenge = allChallenges.FirstOrDefault(x => x.Token == requestedToken);

            if (matchingChallenge == null)
            {
                _logger.LogInformation("The given challenge did not match {challengePath} among {allChallenges}", path, allChallenges);
                await _next(context);

                return;
            }

            // token response is always in ASCII so char count would be equal to byte count here
            context.Response.ContentLength = matchingChallenge.Response.Length;
            context.Response.ContentType   = "application/octet-stream";
            await context.Response.WriteAsync(
                text : matchingChallenge.Response,
                cancellationToken : context.RequestAborted);
        }
        public async Task InvokeAsync(
            HttpContext context)
        {
            var path = context.Request.Path.ToString();

            const string magicPrefix = "/.well-known/acme-challenge/";

            if (path.StartsWith(magicPrefix))
            {
                _logger.LogDebug("Challenge invoked: {0}", path);

                var requestedToken = path.Substring(magicPrefix.Length);

                var allChallenges = await _persistenceService.GetPersistedChallengesAsync();

                var matchingChallenge = allChallenges.FirstOrDefault(x => x.Token == requestedToken);
                if (matchingChallenge == null)
                {
                    _logger.LogInformation("The given challenge did not match: {0}", path);

                    await _next(context);

                    return;
                }

                await context.Response.WriteAsync(matchingChallenge.Response);

                return;
            }

            await _next(context);
        }