2
0

ApiApplicationBuilderExtensions.cs 4.7 KB

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