File: Extensions\UseWhenExtensions.cs
Web Access
Project: src\src\Http\Http.Abstractions\src\Microsoft.AspNetCore.Http.Abstractions.csproj (Microsoft.AspNetCore.Http.Abstractions)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using Microsoft.AspNetCore.Http;
 
namespace Microsoft.AspNetCore.Builder;
 
using Predicate = Func<HttpContext, bool>;
 
/// <summary>
/// Extension methods for <see cref="IApplicationBuilder"/>.
/// </summary>
public static class UseWhenExtensions
{
    /// <summary>
    /// Conditionally creates a branch in the request pipeline that is rejoined to the main pipeline.
    /// </summary>
    /// <param name="app"></param>
    /// <param name="predicate">Invoked with the request environment to determine if the branch should be taken</param>
    /// <param name="configuration">Configures a branch to take</param>
    /// <returns></returns>
    public static IApplicationBuilder UseWhen(this IApplicationBuilder app, Predicate predicate, Action<IApplicationBuilder> configuration)
    {
        ArgumentNullException.ThrowIfNull(app);
        ArgumentNullException.ThrowIfNull(predicate);
        ArgumentNullException.ThrowIfNull(configuration);
 
        // Create and configure the branch builder right away; otherwise,
        // we would end up running our branch after all the components
        // that were subsequently added to the main builder.
        var branchBuilder = app.New();
        configuration(branchBuilder);
 
        return app.Use(main =>
        {
            // This is called only when the main application builder
            // is built, not per request.
            branchBuilder.Run(main);
            var branch = branchBuilder.Build();
 
            return context =>
            {
                if (predicate(context))
                {
                    return branch(context);
                }
                else
                {
                    return main(context);
                }
            };
        });
    }
}