src/React.AspNet.Middleware/BabelFileMiddleware.cs (63 lines of code) (raw):

/* * Copyright (c) Facebook, Inc. and its affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ using System; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.StaticFiles; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; #if NETCOREAPP2_0 || NETSTANDARD2_0 using IWebHostEnvironment = Microsoft.AspNetCore.Hosting.IHostingEnvironment; #endif namespace React.AspNet { /// <summary> /// Enables serving static JavaScript files compiled via Babel. Wraps around StaticFileMiddleware. /// </summary> public class BabelFileMiddleware { private readonly RequestDelegate _next; private readonly IWebHostEnvironment _hostingEnv; private readonly ILoggerFactory _loggerFactory; private readonly BabelFileOptions _options; /// <summary> /// Creates a new instance of the BabelFileMiddleware. /// </summary> /// <param name="next">The next middleware in the pipeline.</param> /// <param name="options">The configuration options.</param> /// <param name="hostingEnv">The hosting environment.</param> /// <param name="loggerFactory">An <see cref="ILoggerFactory"/> instance used to create loggers.</param> public BabelFileMiddleware(RequestDelegate next, BabelFileOptions options, IWebHostEnvironment hostingEnv, ILoggerFactory loggerFactory) { if (next == null) throw new ArgumentNullException("next"); _next = next; _hostingEnv = hostingEnv; _loggerFactory = loggerFactory; // Default values _options = options ?? new BabelFileOptions(); } /// <summary> /// Processes a request to determine if it matches a known JavaScript file, and if so, transforms /// it via Babel and serves it /// </summary> /// <param name="context">ASP.NET HTTP context</param> public async Task Invoke(HttpContext context) { if (!context.Request.Path.HasValue || !_options.Extensions.Any(context.Request.Path.Value.EndsWith)) { // Not a request for a JavaScript file, so just pass through to the next middleware await _next(context); return; } var internalStaticMiddleware = CreateFileMiddleware(ReactEnvironment.Current.Babel); await internalStaticMiddleware.Invoke(context); } /// <summary> /// Creates the internal <see cref="StaticFileMiddleware"/> used to serve files. /// </summary> /// <param name="babel"></param> /// <returns></returns> private StaticFileMiddleware CreateFileMiddleware(IBabel babel) { return new StaticFileMiddleware( _next, _hostingEnv, Options.Create(new StaticFileOptions { ContentTypeProvider = _options.StaticFileOptions.ContentTypeProvider, DefaultContentType = _options.StaticFileOptions.DefaultContentType, OnPrepareResponse = _options.StaticFileOptions.OnPrepareResponse, RequestPath = _options.StaticFileOptions.RequestPath, ServeUnknownFileTypes = _options.StaticFileOptions.ServeUnknownFileTypes, FileProvider = new BabelFileSystem( babel, _options.StaticFileOptions.FileProvider ?? _hostingEnv.WebRootFileProvider, _options.Extensions ) }), _loggerFactory ); } } }