From e8c0e4b05c2dbc83ae4119c375740af39111ad4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20Chalet?= Date: Tue, 12 Sep 2023 10:28:26 +0200 Subject: [PATCH] Add an option allowing to suppress JSON response indentation in the ASP.NET Core and OWIN server hosts --- .../OpenIddictServerAspNetCoreBuilder.cs | 7 +++++++ .../OpenIddictServerAspNetCoreHandlers.cs | 7 ++++++- .../OpenIddictServerAspNetCoreOptions.cs | 5 +++++ src/OpenIddict.Server.Owin/OpenIddictServerOwinBuilder.cs | 7 +++++++ src/OpenIddict.Server.Owin/OpenIddictServerOwinHandlers.cs | 7 ++++++- src/OpenIddict.Server.Owin/OpenIddictServerOwinOptions.cs | 5 +++++ 6 files changed, 36 insertions(+), 2 deletions(-) diff --git a/src/OpenIddict.Server.AspNetCore/OpenIddictServerAspNetCoreBuilder.cs b/src/OpenIddict.Server.AspNetCore/OpenIddictServerAspNetCoreBuilder.cs index e4ff55f8..d0d2bd6a 100644 --- a/src/OpenIddict.Server.AspNetCore/OpenIddictServerAspNetCoreBuilder.cs +++ b/src/OpenIddict.Server.AspNetCore/OpenIddictServerAspNetCoreBuilder.cs @@ -146,6 +146,13 @@ public sealed class OpenIddictServerAspNetCoreBuilder public OpenIddictServerAspNetCoreBuilder EnableStatusCodePagesIntegration() => Configure(options => options.EnableStatusCodePagesIntegration = true); + /// + /// Suppresses indentation for the JSON responses returned by the ASP.NET Core host. + /// + /// The instance. + public OpenIddictServerAspNetCoreBuilder SuppressJsonResponseIndentation() + => Configure(options => options.SuppressJsonResponseIndentation = true); + /// /// Sets the realm returned to the caller as part of the WWW-Authenticate header. /// diff --git a/src/OpenIddict.Server.AspNetCore/OpenIddictServerAspNetCoreHandlers.cs b/src/OpenIddict.Server.AspNetCore/OpenIddictServerAspNetCoreHandlers.cs index 49a25148..4cd0a333 100644 --- a/src/OpenIddict.Server.AspNetCore/OpenIddictServerAspNetCoreHandlers.cs +++ b/src/OpenIddict.Server.AspNetCore/OpenIddictServerAspNetCoreHandlers.cs @@ -1093,6 +1093,11 @@ public static partial class OpenIddictServerAspNetCoreHandlers /// public sealed class ProcessJsonResponse : IOpenIddictServerHandler where TContext : BaseRequestContext { + private readonly IOptionsMonitor _options; + + public ProcessJsonResponse(IOptionsMonitor options) + => _options = options ?? throw new ArgumentNullException(nameof(options)); + /// /// Gets the default descriptor definition assigned to this handler. /// @@ -1125,7 +1130,7 @@ public static partial class OpenIddictServerAspNetCoreHandlers using var writer = new Utf8JsonWriter(stream, new JsonWriterOptions { Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping, - Indented = true + Indented = !_options.CurrentValue.SuppressJsonResponseIndentation }); context.Transaction.Response.WriteTo(writer); diff --git a/src/OpenIddict.Server.AspNetCore/OpenIddictServerAspNetCoreOptions.cs b/src/OpenIddict.Server.AspNetCore/OpenIddictServerAspNetCoreOptions.cs index c1339f96..c2225387 100644 --- a/src/OpenIddict.Server.AspNetCore/OpenIddictServerAspNetCoreOptions.cs +++ b/src/OpenIddict.Server.AspNetCore/OpenIddictServerAspNetCoreOptions.cs @@ -93,6 +93,11 @@ public sealed class OpenIddictServerAspNetCoreOptions : AuthenticationSchemeOpti /// public bool EnableStatusCodePagesIntegration { get; set; } + /// + /// Gets or sets a boolean whether JSON response indentation should be suppressed or not. + /// + public bool SuppressJsonResponseIndentation { get; set; } + /// /// Gets or sets the optional "realm" value returned to the caller as part of the WWW-Authenticate header. /// diff --git a/src/OpenIddict.Server.Owin/OpenIddictServerOwinBuilder.cs b/src/OpenIddict.Server.Owin/OpenIddictServerOwinBuilder.cs index 496e4cde..d9d54316 100644 --- a/src/OpenIddict.Server.Owin/OpenIddictServerOwinBuilder.cs +++ b/src/OpenIddict.Server.Owin/OpenIddictServerOwinBuilder.cs @@ -135,6 +135,13 @@ public sealed class OpenIddictServerOwinBuilder public OpenIddictServerOwinBuilder EnableLogoutRequestCaching() => Configure(options => options.EnableLogoutRequestCaching = true); + /// + /// Suppresses indentation for the JSON responses returned by the OWIN host. + /// + /// The instance. + public OpenIddictServerOwinBuilder SuppressJsonResponseIndentation() + => Configure(options => options.SuppressJsonResponseIndentation = true); + /// /// Sets the realm returned to the caller as part of the WWW-Authenticate header. /// diff --git a/src/OpenIddict.Server.Owin/OpenIddictServerOwinHandlers.cs b/src/OpenIddict.Server.Owin/OpenIddictServerOwinHandlers.cs index bad0b98a..8379b87a 100644 --- a/src/OpenIddict.Server.Owin/OpenIddictServerOwinHandlers.cs +++ b/src/OpenIddict.Server.Owin/OpenIddictServerOwinHandlers.cs @@ -1265,6 +1265,11 @@ public static partial class OpenIddictServerOwinHandlers /// public sealed class ProcessJsonResponse : IOpenIddictServerHandler where TContext : BaseRequestContext { + private readonly IOptionsMonitor _options; + + public ProcessJsonResponse(IOptionsMonitor options) + => _options = options ?? throw new ArgumentNullException(nameof(options)); + /// /// Gets the default descriptor definition assigned to this handler. /// @@ -1297,7 +1302,7 @@ public static partial class OpenIddictServerOwinHandlers using var writer = new Utf8JsonWriter(stream, new JsonWriterOptions { Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping, - Indented = true + Indented = !_options.CurrentValue.SuppressJsonResponseIndentation }); context.Transaction.Response.WriteTo(writer); diff --git a/src/OpenIddict.Server.Owin/OpenIddictServerOwinOptions.cs b/src/OpenIddict.Server.Owin/OpenIddictServerOwinOptions.cs index 4c4ff3e5..9bd0d0c6 100644 --- a/src/OpenIddict.Server.Owin/OpenIddictServerOwinOptions.cs +++ b/src/OpenIddict.Server.Owin/OpenIddictServerOwinOptions.cs @@ -90,6 +90,11 @@ public sealed class OpenIddictServerOwinOptions : AuthenticationOptions /// public bool EnableLogoutRequestCaching { get; set; } + /// + /// Gets or sets a boolean whether JSON response indentation should be suppressed or not. + /// + public bool SuppressJsonResponseIndentation { get; set; } + /// /// Gets or sets the optional "realm" value returned to the caller as part of the WWW-Authenticate header. ///