Ejemplo n.º 1
0
 /// <summary>
 /// Initializes a new instance of the <see cref="PascalCaseJsonProfileFormatter"/> class.
 /// </summary>
 public PascalCaseJsonProfileFormatter() : base(JsonDefaults.GetPascalCaseOptions())
 {
     SupportedMediaTypes.Clear();
     // Add application/json for default formatter
     SupportedMediaTypes.Add(MediaTypeHeaderValue.Parse("application/json"));
     SupportedMediaTypes.Add(MediaTypeHeaderValue.Parse("application/json;profile=\"PascalCase\""));
 }
        /// <summary>
        /// Extension method for adding the jellyfin API to the service collection.
        /// </summary>
        /// <param name="serviceCollection">The service collection.</param>
        /// <param name="pluginAssemblies">An IEnumerable containing all plugin assemblies with API controllers.</param>
        /// <param name="knownProxies">A list of all known proxies to trust for X-Forwarded-For.</param>
        /// <returns>The MVC builder.</returns>
        public static IMvcBuilder AddJellyfinApi(this IServiceCollection serviceCollection, IEnumerable <Assembly> pluginAssemblies, IReadOnlyList <string> knownProxies)
        {
            IMvcBuilder mvcBuilder = serviceCollection
                                     .AddCors()
                                     .AddTransient <ICorsPolicyProvider, CorsPolicyProvider>()
                                     .Configure <ForwardedHeadersOptions>(options =>
            {
                options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
                for (var i = 0; i < knownProxies.Count; i++)
                {
                    if (IPAddress.TryParse(knownProxies[i], out var address))
                    {
                        options.KnownProxies.Add(address);
                    }
                }
            })
                                     .AddMvc(opts =>
            {
                // Allow requester to change between camelCase and PascalCase
                opts.RespectBrowserAcceptHeader = true;

                opts.OutputFormatters.Insert(0, new CamelCaseJsonProfileFormatter());
                opts.OutputFormatters.Insert(0, new PascalCaseJsonProfileFormatter());

                opts.OutputFormatters.Add(new CssOutputFormatter());
                opts.OutputFormatters.Add(new XmlOutputFormatter());
            })

                                     // Clear app parts to avoid other assemblies being picked up
                                     .ConfigureApplicationPartManager(a => a.ApplicationParts.Clear())
                                     .AddApplicationPart(typeof(StartupController).Assembly)
                                     .AddJsonOptions(options =>
            {
                // Update all properties that are set in JsonDefaults
                var jsonOptions = JsonDefaults.GetPascalCaseOptions();

                // From JsonDefaults
                options.JsonSerializerOptions.ReadCommentHandling    = jsonOptions.ReadCommentHandling;
                options.JsonSerializerOptions.WriteIndented          = jsonOptions.WriteIndented;
                options.JsonSerializerOptions.DefaultIgnoreCondition = jsonOptions.DefaultIgnoreCondition;
                options.JsonSerializerOptions.NumberHandling         = jsonOptions.NumberHandling;

                options.JsonSerializerOptions.Converters.Clear();
                foreach (var converter in jsonOptions.Converters)
                {
                    options.JsonSerializerOptions.Converters.Add(converter);
                }

                // From JsonDefaults.PascalCase
                options.JsonSerializerOptions.PropertyNamingPolicy = jsonOptions.PropertyNamingPolicy;
            });

            foreach (Assembly pluginAssembly in pluginAssemblies)
            {
                mvcBuilder.AddApplicationPart(pluginAssembly);
            }

            return(mvcBuilder.AddControllersAsServices());
        }
        /// <summary>
        /// Extension method for adding the jellyfin API to the service collection.
        /// </summary>
        /// <param name="serviceCollection">The service collection.</param>
        /// <param name="baseUrl">The base url for the API.</param>
        /// <param name="pluginAssemblies">An IEnumberable containing all plugin assemblies with API controllers.</param>
        /// <returns>The MVC builder.</returns>
        public static IMvcBuilder AddJellyfinApi(this IServiceCollection serviceCollection, string baseUrl, IEnumerable <Assembly> pluginAssemblies)
        {
            IMvcBuilder mvcBuilder = serviceCollection
                                     .AddCors(options =>
            {
                options.AddPolicy(ServerCorsPolicy.DefaultPolicyName, ServerCorsPolicy.DefaultPolicy);
            })
                                     .Configure <ForwardedHeadersOptions>(options =>
            {
                options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
            })
                                     .AddMvc(opts =>
            {
                opts.UseGeneralRoutePrefix(baseUrl);
                opts.OutputFormatters.Insert(0, new CamelCaseJsonProfileFormatter());
                opts.OutputFormatters.Insert(0, new PascalCaseJsonProfileFormatter());

                opts.OutputFormatters.Add(new CssOutputFormatter());
                opts.OutputFormatters.Add(new XmlOutputFormatter());
            })

                                     // Clear app parts to avoid other assemblies being picked up
                                     .ConfigureApplicationPartManager(a => a.ApplicationParts.Clear())
                                     .AddApplicationPart(typeof(StartupController).Assembly)
                                     .AddJsonOptions(options =>
            {
                // Update all properties that are set in JsonDefaults
                var jsonOptions = JsonDefaults.GetPascalCaseOptions();

                // From JsonDefaults
                options.JsonSerializerOptions.ReadCommentHandling    = jsonOptions.ReadCommentHandling;
                options.JsonSerializerOptions.WriteIndented          = jsonOptions.WriteIndented;
                options.JsonSerializerOptions.DefaultIgnoreCondition = jsonOptions.DefaultIgnoreCondition;
                options.JsonSerializerOptions.NumberHandling         = jsonOptions.NumberHandling;

                options.JsonSerializerOptions.Converters.Clear();
                foreach (var converter in jsonOptions.Converters)
                {
                    options.JsonSerializerOptions.Converters.Add(converter);
                }

                // From JsonDefaults.PascalCase
                options.JsonSerializerOptions.PropertyNamingPolicy = jsonOptions.PropertyNamingPolicy;
            });

            foreach (Assembly pluginAssembly in pluginAssemblies)
            {
                mvcBuilder.AddApplicationPart(pluginAssembly);
            }

            return(mvcBuilder.AddControllersAsServices());
        }
        /// <summary>
        /// Extension method for adding the jellyfin API to the service collection.
        /// </summary>
        /// <param name="serviceCollection">The service collection.</param>
        /// <param name="pluginAssemblies">An IEnumerable containing all plugin assemblies with API controllers.</param>
        /// <param name="config">The <see cref="NetworkConfiguration"/>.</param>
        /// <returns>The MVC builder.</returns>
        public static IMvcBuilder AddJellyfinApi(this IServiceCollection serviceCollection, IEnumerable <Assembly> pluginAssemblies, NetworkConfiguration config)
        {
            IMvcBuilder mvcBuilder = serviceCollection
                                     .AddCors()
                                     .AddTransient <ICorsPolicyProvider, CorsPolicyProvider>()
                                     .Configure <ForwardedHeadersOptions>(options =>
            {
                // https://github.com/dotnet/aspnetcore/blob/master/src/Middleware/HttpOverrides/src/ForwardedHeadersMiddleware.cs
                // Enable debug logging on Microsoft.AspNetCore.HttpOverrides.ForwardedHeadersMiddleware to help investigate issues.

                options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
                if (config.KnownProxies.Length == 0)
                {
                    options.KnownNetworks.Clear();
                    options.KnownProxies.Clear();
                }
                else
                {
                    AddProxyAddresses(config, config.KnownProxies, options);
                }

                // Only set forward limit if we have some known proxies or some known networks.
                if (options.KnownProxies.Count != 0 || options.KnownNetworks.Count != 0)
                {
                    options.ForwardLimit = null;
                }
            })
                                     .AddMvc(opts =>
            {
                // Allow requester to change between camelCase and PascalCase
                opts.RespectBrowserAcceptHeader = true;

                opts.OutputFormatters.Insert(0, new CamelCaseJsonProfileFormatter());
                opts.OutputFormatters.Insert(0, new PascalCaseJsonProfileFormatter());

                opts.OutputFormatters.Add(new CssOutputFormatter());
                opts.OutputFormatters.Add(new XmlOutputFormatter());

                opts.ModelBinderProviders.Insert(0, new NullableEnumModelBinderProvider());
            })

                                     // Clear app parts to avoid other assemblies being picked up
                                     .ConfigureApplicationPartManager(a => a.ApplicationParts.Clear())
                                     .AddApplicationPart(typeof(StartupController).Assembly)
                                     .AddJsonOptions(options =>
            {
                // Update all properties that are set in JsonDefaults
                var jsonOptions = JsonDefaults.GetPascalCaseOptions();

                // From JsonDefaults
                options.JsonSerializerOptions.ReadCommentHandling         = jsonOptions.ReadCommentHandling;
                options.JsonSerializerOptions.WriteIndented               = jsonOptions.WriteIndented;
                options.JsonSerializerOptions.DefaultIgnoreCondition      = jsonOptions.DefaultIgnoreCondition;
                options.JsonSerializerOptions.NumberHandling              = jsonOptions.NumberHandling;
                options.JsonSerializerOptions.PropertyNameCaseInsensitive = jsonOptions.PropertyNameCaseInsensitive;

                options.JsonSerializerOptions.Converters.Clear();
                foreach (var converter in jsonOptions.Converters)
                {
                    options.JsonSerializerOptions.Converters.Add(converter);
                }

                // From JsonDefaults.PascalCase
                options.JsonSerializerOptions.PropertyNamingPolicy = jsonOptions.PropertyNamingPolicy;
            });

            foreach (Assembly pluginAssembly in pluginAssemblies)
            {
                mvcBuilder.AddApplicationPart(pluginAssembly);
            }

            return(mvcBuilder.AddControllersAsServices());
        }