< Summary - Jellyfin

Information
Class: Jellyfin.Server.Extensions.ApiApplicationBuilderExtensions
Assembly: jellyfin
File(s): /srv/git/jellyfin/Jellyfin.Server/Extensions/ApiApplicationBuilderExtensions.cs
Line coverage
97%
Covered lines: 34
Uncovered lines: 1
Coverable lines: 35
Total lines: 122
Line coverage: 97.1%
Branch coverage
50%
Covered branches: 1
Total branches: 2
Branch coverage: 50%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Coverage history

Coverage history 0 25 50 75 100 4/15/2026 - 12:14:34 AM Line coverage: 97% (33/34) Branch coverage: 50% (1/2) Total lines: 1217/18/2026 - 12:15:19 AM Line coverage: 97.1% (34/35) Branch coverage: 50% (1/2) Total lines: 122 4/15/2026 - 12:14:34 AM Line coverage: 97% (33/34) Branch coverage: 50% (1/2) Total lines: 1217/18/2026 - 12:15:19 AM Line coverage: 97.1% (34/35) Branch coverage: 50% (1/2) Total lines: 122

Coverage delta

Coverage delta 1 -1

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
UseJellyfinApiSwagger(...)50%2296.55%
UseIPBasedAccessValidation(...)100%11100%
UseQueryStringDecoding(...)100%11100%
UseBaseUrlRedirection(...)100%11100%
UseServerStartupMessage(...)100%11100%
UseWebSocketHandler(...)100%11100%
UseRobotsRedirection(...)100%11100%

File(s)

/srv/git/jellyfin/Jellyfin.Server/Extensions/ApiApplicationBuilderExtensions.cs

#LineLine coverage
 1using System.Collections.Generic;
 2using Jellyfin.Api.Middleware;
 3using MediaBrowser.Common.Net;
 4using MediaBrowser.Controller.Configuration;
 5using Microsoft.AspNetCore.Builder;
 6using Microsoft.OpenApi;
 7
 8namespace Jellyfin.Server.Extensions
 9{
 10    /// <summary>
 11    /// Extensions for adding API specific functionality to the application pipeline.
 12    /// </summary>
 13    public static class ApiApplicationBuilderExtensions
 14    {
 15        /// <summary>
 16        /// Adds swagger and swagger UI to the application pipeline.
 17        /// </summary>
 18        /// <param name="applicationBuilder">The application builder.</param>
 19        /// <param name="serverConfigurationManager">The server configuration.</param>
 20        /// <returns>The updated application builder.</returns>
 21        public static IApplicationBuilder UseJellyfinApiSwagger(
 22            this IApplicationBuilder applicationBuilder,
 23            IServerConfigurationManager serverConfigurationManager)
 24        {
 25            // Enable middleware to serve swagger-ui (HTML, JS, CSS, etc.),
 26            // specifying the Swagger JSON endpoint.
 27
 2228            var baseUrl = serverConfigurationManager.GetNetworkConfiguration().BaseUrl.Trim('/');
 2229            var apiDocBaseUrl = serverConfigurationManager.GetNetworkConfiguration().BaseUrl;
 2230            if (!string.IsNullOrEmpty(baseUrl))
 31            {
 032                baseUrl += '/';
 33            }
 34
 2235            return applicationBuilder
 2236                .UseSwagger(c =>
 2237                {
 2238                    // Custom path requires {documentName}, SwaggerDoc documentName is 'api-docs'
 2239                    c.RouteTemplate = "{documentName}/openapi.json";
 2240                    c.PreSerializeFilters.Add((swagger, httpReq) =>
 2241                    {
 2242                        swagger.Servers = new List<OpenApiServer> { new OpenApiServer { Url = $"{httpReq.Scheme}://{http
 2243                    });
 2244                })
 2245                .UseSwaggerUI(c =>
 2246                {
 2247                    c.DocumentTitle = "Jellyfin API";
 2248                    c.SwaggerEndpoint($"/{baseUrl}api-docs/openapi.json", "Jellyfin API");
 2249                    c.InjectStylesheet($"/{baseUrl}api-docs/swagger/custom.css");
 2250                    c.RoutePrefix = "api-docs/swagger";
 2251                    c.UseRequestInterceptor("""(req) => { req.headers['Authorization'] = `MediaBrowser Token=\"${req.hea
 2252                })
 2253                .UseReDoc(c =>
 2254                {
 2255                    c.DocumentTitle = "Jellyfin API";
 2256                    c.SpecUrl($"/{baseUrl}api-docs/openapi.json");
 2257                    c.InjectStylesheet($"/{baseUrl}api-docs/redoc/custom.css");
 2258                    c.RoutePrefix = "api-docs/redoc";
 2259                });
 60        }
 61
 62        /// <summary>
 63        /// Adds IP based access validation to the application pipeline.
 64        /// </summary>
 65        /// <param name="appBuilder">The application builder.</param>
 66        /// <returns>The updated application builder.</returns>
 67        public static IApplicationBuilder UseIPBasedAccessValidation(this IApplicationBuilder appBuilder)
 68        {
 2269            return appBuilder.UseMiddleware<IPBasedAccessValidationMiddleware>();
 70        }
 71
 72        /// <summary>
 73        /// Enables url decoding before binding to the application pipeline.
 74        /// </summary>
 75        /// <param name="appBuilder">The <see cref="IApplicationBuilder"/>.</param>
 76        /// <returns>The updated application builder.</returns>
 77        public static IApplicationBuilder UseQueryStringDecoding(this IApplicationBuilder appBuilder)
 78        {
 2279            return appBuilder.UseMiddleware<QueryStringDecodingMiddleware>();
 80        }
 81
 82        /// <summary>
 83        /// Adds base url redirection to the application pipeline.
 84        /// </summary>
 85        /// <param name="appBuilder">The application builder.</param>
 86        /// <returns>The updated application builder.</returns>
 87        public static IApplicationBuilder UseBaseUrlRedirection(this IApplicationBuilder appBuilder)
 88        {
 2289            return appBuilder.UseMiddleware<BaseUrlRedirectionMiddleware>();
 90        }
 91
 92        /// <summary>
 93        /// Adds a custom message during server startup to the application pipeline.
 94        /// </summary>
 95        /// <param name="appBuilder">The application builder.</param>
 96        /// <returns>The updated application builder.</returns>
 97        public static IApplicationBuilder UseServerStartupMessage(this IApplicationBuilder appBuilder)
 98        {
 2299            return appBuilder.UseMiddleware<ServerStartupMessageMiddleware>();
 100        }
 101
 102        /// <summary>
 103        /// Adds a WebSocket request handler to the application pipeline.
 104        /// </summary>
 105        /// <param name="appBuilder">The application builder.</param>
 106        /// <returns>The updated application builder.</returns>
 107        public static IApplicationBuilder UseWebSocketHandler(this IApplicationBuilder appBuilder)
 108        {
 22109            return appBuilder.UseMiddleware<WebSocketHandlerMiddleware>();
 110        }
 111
 112        /// <summary>
 113        /// Adds robots.txt redirection to the application pipeline.
 114        /// </summary>
 115        /// <param name="appBuilder">The application builder.</param>
 116        /// <returns>The updated application builder.</returns>
 117        public static IApplicationBuilder UseRobotsRedirection(this IApplicationBuilder appBuilder)
 118        {
 22119            return appBuilder.UseMiddleware<RobotsRedirectionMiddleware>();
 120        }
 121    }
 122}