From aa4936c59c3307dd14af193933a44d33f738c9ce Mon Sep 17 00:00:00 2001 From: JPVenson Date: Mon, 24 Mar 2025 08:27:21 +0000 Subject: [PATCH 1/3] Added OpenAPI spec for #12880 --- .../ApiServiceCollectionExtensions.cs | 1 + .../RetryOnTemporarlyUnavailableFilter.cs | 36 +++++++++++++++++++ 2 files changed, 37 insertions(+) create mode 100644 Jellyfin.Server/Filters/RetryOnTemporarlyUnavailableFilter.cs diff --git a/Jellyfin.Server/Extensions/ApiServiceCollectionExtensions.cs b/Jellyfin.Server/Extensions/ApiServiceCollectionExtensions.cs index 597643ed19..1a327e0f9f 100644 --- a/Jellyfin.Server/Extensions/ApiServiceCollectionExtensions.cs +++ b/Jellyfin.Server/Extensions/ApiServiceCollectionExtensions.cs @@ -247,6 +247,7 @@ namespace Jellyfin.Server.Extensions c.AddSwaggerTypeMappings(); c.SchemaFilter(); + c.OperationFilter(); c.OperationFilter(); c.OperationFilter(); c.OperationFilter(); diff --git a/Jellyfin.Server/Filters/RetryOnTemporarlyUnavailableFilter.cs b/Jellyfin.Server/Filters/RetryOnTemporarlyUnavailableFilter.cs new file mode 100644 index 0000000000..bd572df9b7 --- /dev/null +++ b/Jellyfin.Server/Filters/RetryOnTemporarlyUnavailableFilter.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections.Generic; +using System.Net.Http.Headers; +using Microsoft.OpenApi.Models; +using Swashbuckle.AspNetCore.SwaggerGen; + +namespace Jellyfin.Server.Filters; + +internal class RetryOnTemporarlyUnavailableFilter : IOperationFilter +{ + public void Apply(OpenApiOperation operation, OperationFilterContext context) + { + operation.Responses.Add("503", new OpenApiResponse() + { + Description = "The server is currently starting or is temporarly not available.", + Headers = new Dictionary() + { + { + "retry-after", + new() { AllowEmptyValue = true, Required = false, Description = "A hint for when to retry the operation." } + }, + { + "message", + new() { AllowEmptyValue = true, Required = false, Description = "A short plain-text reason why the server is not available." } + } + }, + Content = new Dictionary() + { + { + "text/html", + new OpenApiMediaType() + } + } + }); + } +} From a026a3722c5ee6505b6361cee1da073393c21717 Mon Sep 17 00:00:00 2001 From: JPVenson Date: Mon, 24 Mar 2025 08:31:52 +0000 Subject: [PATCH 2/3] Clarified retry value type --- Jellyfin.Server/Filters/RetryOnTemporarlyUnavailableFilter.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jellyfin.Server/Filters/RetryOnTemporarlyUnavailableFilter.cs b/Jellyfin.Server/Filters/RetryOnTemporarlyUnavailableFilter.cs index bd572df9b7..584519441a 100644 --- a/Jellyfin.Server/Filters/RetryOnTemporarlyUnavailableFilter.cs +++ b/Jellyfin.Server/Filters/RetryOnTemporarlyUnavailableFilter.cs @@ -17,7 +17,7 @@ internal class RetryOnTemporarlyUnavailableFilter : IOperationFilter { { "retry-after", - new() { AllowEmptyValue = true, Required = false, Description = "A hint for when to retry the operation." } + new() { AllowEmptyValue = true, Required = false, Description = "A hint for when to retry the operation in full secounds." } }, { "message", From daf8eca8ae7010b52538eb7bb32b82075ea0ecdc Mon Sep 17 00:00:00 2001 From: JPVenson Date: Mon, 24 Mar 2025 16:56:36 +0000 Subject: [PATCH 3/3] update header api description and values --- .../Filters/RetryOnTemporarlyUnavailableFilter.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Jellyfin.Server/Filters/RetryOnTemporarlyUnavailableFilter.cs b/Jellyfin.Server/Filters/RetryOnTemporarlyUnavailableFilter.cs index 584519441a..74470eda0d 100644 --- a/Jellyfin.Server/Filters/RetryOnTemporarlyUnavailableFilter.cs +++ b/Jellyfin.Server/Filters/RetryOnTemporarlyUnavailableFilter.cs @@ -16,11 +16,11 @@ internal class RetryOnTemporarlyUnavailableFilter : IOperationFilter Headers = new Dictionary() { { - "retry-after", - new() { AllowEmptyValue = true, Required = false, Description = "A hint for when to retry the operation in full secounds." } + "Retry-After", + new() { AllowEmptyValue = true, Required = false, Description = "A hint for when to retry the operation in full seconds." } }, { - "message", + "Message", new() { AllowEmptyValue = true, Required = false, Description = "A short plain-text reason why the server is not available." } } },