ApiApplicationBuilderExtensions.cs 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. using System.Collections.Generic;
  2. using Jellyfin.Api.Middleware;
  3. using MediaBrowser.Common.Net;
  4. using MediaBrowser.Controller.Configuration;
  5. using Microsoft.AspNetCore.Builder;
  6. using Microsoft.OpenApi.Models;
  7. namespace Jellyfin.Server.Extensions
  8. {
  9. /// <summary>
  10. /// Extensions for adding API specific functionality to the application pipeline.
  11. /// </summary>
  12. public static class ApiApplicationBuilderExtensions
  13. {
  14. /// <summary>
  15. /// Adds swagger and swagger UI to the application pipeline.
  16. /// </summary>
  17. /// <param name="applicationBuilder">The application builder.</param>
  18. /// <param name="serverConfigurationManager">The server configuration.</param>
  19. /// <returns>The updated application builder.</returns>
  20. public static IApplicationBuilder UseJellyfinApiSwagger(
  21. this IApplicationBuilder applicationBuilder,
  22. IServerConfigurationManager serverConfigurationManager)
  23. {
  24. // Enable middleware to serve swagger-ui (HTML, JS, CSS, etc.),
  25. // specifying the Swagger JSON endpoint.
  26. var baseUrl = serverConfigurationManager.GetNetworkConfiguration().BaseUrl.Trim('/');
  27. var apiDocBaseUrl = serverConfigurationManager.GetNetworkConfiguration().BaseUrl;
  28. if (!string.IsNullOrEmpty(baseUrl))
  29. {
  30. baseUrl += '/';
  31. }
  32. return applicationBuilder
  33. .UseSwagger(c =>
  34. {
  35. // Custom path requires {documentName}, SwaggerDoc documentName is 'api-docs'
  36. c.RouteTemplate = "{documentName}/openapi.json";
  37. c.PreSerializeFilters.Add((swagger, httpReq) =>
  38. {
  39. swagger.Servers = new List<OpenApiServer> { new OpenApiServer { Url = $"{httpReq.Scheme}://{httpReq.Host.Value}{apiDocBaseUrl}" } };
  40. });
  41. })
  42. .UseSwaggerUI(c =>
  43. {
  44. c.DocumentTitle = "Jellyfin API";
  45. c.SwaggerEndpoint($"/{baseUrl}api-docs/openapi.json", "Jellyfin API");
  46. c.InjectStylesheet($"/{baseUrl}api-docs/swagger/custom.css");
  47. c.RoutePrefix = "api-docs/swagger";
  48. })
  49. .UseReDoc(c =>
  50. {
  51. c.DocumentTitle = "Jellyfin API";
  52. c.SpecUrl($"/{baseUrl}api-docs/openapi.json");
  53. c.InjectStylesheet($"/{baseUrl}api-docs/redoc/custom.css");
  54. c.RoutePrefix = "api-docs/redoc";
  55. });
  56. }
  57. /// <summary>
  58. /// Adds IP based access validation to the application pipeline.
  59. /// </summary>
  60. /// <param name="appBuilder">The application builder.</param>
  61. /// <returns>The updated application builder.</returns>
  62. public static IApplicationBuilder UseIPBasedAccessValidation(this IApplicationBuilder appBuilder)
  63. {
  64. return appBuilder.UseMiddleware<IPBasedAccessValidationMiddleware>();
  65. }
  66. /// <summary>
  67. /// Enables url decoding before binding to the application pipeline.
  68. /// </summary>
  69. /// <param name="appBuilder">The <see cref="IApplicationBuilder"/>.</param>
  70. /// <returns>The updated application builder.</returns>
  71. public static IApplicationBuilder UseQueryStringDecoding(this IApplicationBuilder appBuilder)
  72. {
  73. return appBuilder.UseMiddleware<QueryStringDecodingMiddleware>();
  74. }
  75. /// <summary>
  76. /// Adds base url redirection to the application pipeline.
  77. /// </summary>
  78. /// <param name="appBuilder">The application builder.</param>
  79. /// <returns>The updated application builder.</returns>
  80. public static IApplicationBuilder UseBaseUrlRedirection(this IApplicationBuilder appBuilder)
  81. {
  82. return appBuilder.UseMiddleware<BaseUrlRedirectionMiddleware>();
  83. }
  84. /// <summary>
  85. /// Adds a custom message during server startup to the application pipeline.
  86. /// </summary>
  87. /// <param name="appBuilder">The application builder.</param>
  88. /// <returns>The updated application builder.</returns>
  89. public static IApplicationBuilder UseServerStartupMessage(this IApplicationBuilder appBuilder)
  90. {
  91. return appBuilder.UseMiddleware<ServerStartupMessageMiddleware>();
  92. }
  93. /// <summary>
  94. /// Adds a WebSocket request handler to the application pipeline.
  95. /// </summary>
  96. /// <param name="appBuilder">The application builder.</param>
  97. /// <returns>The updated application builder.</returns>
  98. public static IApplicationBuilder UseWebSocketHandler(this IApplicationBuilder appBuilder)
  99. {
  100. return appBuilder.UseMiddleware<WebSocketHandlerMiddleware>();
  101. }
  102. /// <summary>
  103. /// Adds robots.txt redirection 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 UseRobotsRedirection(this IApplicationBuilder appBuilder)
  108. {
  109. return appBuilder.UseMiddleware<RobotsRedirectionMiddleware>();
  110. }
  111. /// <summary>
  112. /// Adds /emby and /mediabrowser route trimming to the application pipeline.
  113. /// </summary>
  114. /// <remarks>
  115. /// This must be injected before any path related middleware.
  116. /// </remarks>
  117. /// <param name="appBuilder">The application builder.</param>
  118. /// <returns>The updated application builder.</returns>
  119. public static IApplicationBuilder UsePathTrim(this IApplicationBuilder appBuilder)
  120. {
  121. return appBuilder.UseMiddleware<LegacyEmbyRouteRewriteMiddleware>();
  122. }
  123. }
  124. }