private static List <HttpMiddleware> GetMiddlewares(
            HttpMiddleware functionMiddleware,
            IServerlessLogger serverlessLogger,
            IHttpContextAccessor acessor,
            bool allowAnonymous)
        {
            var exceptionMiddleware = new ExceptionMiddleware(serverlessLogger);
            var loggerMiddleware    = new LoggerMiddleware(serverlessLogger);
            var headerMiddleware    = new HeaderMiddleware();

            List <HttpMiddleware> middlewares = null;

            if (allowAnonymous)
            {
                middlewares = MiddlewaresWithoutAuth(
                    functionMiddleware,
                    exceptionMiddleware,
                    loggerMiddleware,
                    headerMiddleware);
            }
            else
            {
                middlewares = MiddlewaresWithAuth(
                    functionMiddleware,
                    serverlessLogger,
                    acessor,
                    exceptionMiddleware,
                    loggerMiddleware,
                    headerMiddleware);
            }

            return(middlewares);
        }
 private static List <HttpMiddleware> MiddlewaresWithoutAuth(HttpMiddleware functionMiddleware, ExceptionMiddleware exceptionMiddleware, LoggerMiddleware loggerMiddleware, HeaderMiddleware headerMiddleware)
 {
     return(new List <HttpMiddleware>()
     {
         loggerMiddleware,
         headerMiddleware,
         exceptionMiddleware,
         functionMiddleware
     });
 }
        /// <summary>
        /// Execute middleware pipeline.
        /// </summary>
        /// <param name="functionMiddleware">Function logic as middleware to be called inside pipeline.</param>
        /// <param name="serverlessLogger">Modal logger.</param>
        /// <param name="request">Function http request.</param>
        /// <param name="acessor">See <see cref="IHttpContextAccessor"/>.</param>
        /// <param name="allowAnonymous">If true, it allows access to the endpoint without authentication.(Default: false)</param>
        /// <returns>Response <see cref="IActionResult"/> after pipeline execution.</returns>
        public static async Task <IActionResult> ExecutePipeline(
            this HttpMiddleware functionMiddleware,
            IServerlessLogger serverlessLogger,
            HttpRequest request,
            IHttpContextAccessor acessor,
            bool allowAnonymous = false)
        {
            var middlewares = GetMiddlewares(functionMiddleware, serverlessLogger, acessor, allowAnonymous);

            return(await new MiddlewarePipeline(middlewares, serverlessLogger)
                   .ExecuteAsync(HttpFunctionContext.Build(request))
                   .ConfigureAwait(false));
        }
        private static List <HttpMiddleware> MiddlewaresWithAuth(HttpMiddleware functionMiddleware, IServerlessLogger serverlessLogger, IHttpContextAccessor acessor, ExceptionMiddleware exceptionMiddleware, LoggerMiddleware loggerMiddleware, HeaderMiddleware headerMiddleware)
        {
            var authenticationMiddleware = new AuthenticationMiddleware(
                serverlessLogger,
                Environment.GetEnvironmentVariable("AUTH.ISSUER"),
                Environment.GetEnvironmentVariable("AUTH.AUDIENCE"),
                Environment.GetEnvironmentVariable("AUTH.METADATAADDRESS"),
                acessor);

            return(new List <HttpMiddleware>()
            {
                loggerMiddleware,
                headerMiddleware,
                exceptionMiddleware,
                authenticationMiddleware,
                functionMiddleware
            });
        }