// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Threading.Tasks; using Microsoft.AspNet.Http; namespace Microsoft.AspNet.Builder.Extensions { /// /// Respresents a middleware that maps a request path to a sub-request pipeline. /// public class MapMiddleware { private readonly RequestDelegate _next; private readonly MapOptions _options; /// /// Creates a new instace of . /// /// The delegate representing the next middleware in the request pipeline. /// The middleware options. public MapMiddleware(RequestDelegate next, MapOptions options) { if (next == null) { throw new ArgumentNullException(nameof(next)); } if (options == null) { throw new ArgumentNullException(nameof(options)); } _next = next; _options = options; } /// /// Executes the middleware. /// /// The for the current request. /// A task that represents the execution of this middleware. public async Task Invoke(HttpContext context) { if (context == null) { throw new ArgumentNullException(nameof(context)); } PathString path = context.Request.Path; PathString remainingPath; if (path.StartsWithSegments(_options.PathMatch, out remainingPath)) { // Update the path PathString pathBase = context.Request.PathBase; context.Request.PathBase = pathBase + _options.PathMatch; context.Request.Path = remainingPath; try { await _options.Branch(context); } finally { context.Request.PathBase = pathBase; context.Request.Path = path; } } else { await _next(context); } } } }