File: DependencyInjection\DefaultRazorComponentsServiceOptionsConfiguration.cs
Web Access
Project: src\src\Components\Endpoints\src\Microsoft.AspNetCore.Components.Endpoints.csproj (Microsoft.AspNetCore.Components.Endpoints)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System.Text.Json;
using Microsoft.AspNetCore.Components.Endpoints;
using Microsoft.AspNetCore.Components.Endpoints.FormMapping;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
 
namespace Microsoft.Extensions.DependencyInjection;
 
internal class DefaultRazorComponentsServiceOptionsConfiguration(
    IConfiguration configuration,
    ILoggerFactory loggerFactory,
    IWebHostEnvironment environment)
    : IPostConfigureOptions<RazorComponentsServiceOptions>
{
    public IConfiguration Configuration { get; } = configuration;
 
    public void PostConfigure(string? name, RazorComponentsServiceOptions options)
    {
        var value = Configuration[WebHostDefaults.DetailedErrorsKey];
        options.DetailedErrors = string.Equals(value, "true", StringComparison.OrdinalIgnoreCase) ||
            string.Equals(value, "1", StringComparison.OrdinalIgnoreCase);
 
        options._formMappingOptions = new FormDataMapperOptions(loggerFactory)
        {
            MaxRecursionDepth = options.MaxFormMappingRecursionDepth,
            MaxErrorCount = options.MaxFormMappingErrorCount,
            MaxCollectionSize = options.MaxFormMappingCollectionSize,
            MaxKeyBufferSize = options.MaxFormMappingKeySize
        };
 
        var file = environment.WebRootFileProvider.GetFileInfo($"{environment.ApplicationName}.modules.json");
 
        if (file.Exists)
        {
            // We are going to emit the initializers as JSON, so avoid deserializing them, since we are going to
            // serialize them again later.
            using var reader = new StreamReader(file.CreateReadStream());
            options.JavaScriptInitializers = reader.ReadToEnd();
 
            if (options.JavaScriptInitializers == "")
            {
                options.JavaScriptInitializers = null;
            }
            else
            {
                // Do an extra check to see if the file just contains an empty json array, and if so, set the value to null,
                // as this avoids emitting any value later on in the response.
                try
                {
                    if (options.JavaScriptInitializers != null)
                    {
                        var initializers = JsonSerializer.Deserialize<string[]>(options.JavaScriptInitializers);
                        if (initializers == null || initializers.Length == 0)
                        {
                            options.JavaScriptInitializers = null;
                        }
                    }
                }
                catch (Exception)
                {
                    // We should never get here because the SDK is responsible for generating the file we use,
                    // and that should always produce well formed JSON, but in any case, we just ignore the error
                    // and continue, letting the failure happen on the client.
                }
            }
 
        }
    }
}