From 593091621926defcbc2727a922613e34557d882a Mon Sep 17 00:00:00 2001 From: Vincent Biret Date: Wed, 16 Apr 2025 13:10:13 -0400 Subject: [PATCH 1/2] fix: normalized override implementation for parameter types serialization in v2 Signed-off-by: Vincent Biret --- .../Models/OpenApiParameter.cs | 94 +++++++++++-------- 1 file changed, 54 insertions(+), 40 deletions(-) diff --git a/src/Microsoft.OpenApi/Models/OpenApiParameter.cs b/src/Microsoft.OpenApi/Models/OpenApiParameter.cs index fd74c2b57..a990ddcbb 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiParameter.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiParameter.cs @@ -165,50 +165,25 @@ internal void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion versio writer.WriteEndObject(); } - - /// - public void SerializeAsV2(IOpenApiWriter writer) + /// + /// Write the "in" property for V2 serialization. + /// + /// Writer to use for the serialization + internal virtual void WriteInPropertyForV2(IOpenApiWriter writer) { - Utils.CheckArgumentNull(writer); - - writer.WriteStartObject(); - - // in - if (this is OpenApiFormDataParameter) - { - writer.WriteProperty(OpenApiConstants.In, "formData"); - } - else if (this is OpenApiBodyParameter) - { - writer.WriteProperty(OpenApiConstants.In, "body"); - } - else - { - writer.WriteProperty(OpenApiConstants.In, In?.GetDisplayName()); - } - - // name - writer.WriteProperty(OpenApiConstants.Name, Name); - - // description - writer.WriteProperty(OpenApiConstants.Description, Description); - - // required - writer.WriteProperty(OpenApiConstants.Required, Required, false); - - // deprecated - writer.WriteProperty(OpenApiConstants.Deprecated, Deprecated, false); - - var extensionsClone = Extensions is not null ? new Dictionary(Extensions) : null; + writer.WriteProperty(OpenApiConstants.In, In?.GetDisplayName()); + } - // schema - if (this is OpenApiBodyParameter) - { - writer.WriteOptionalObject(OpenApiConstants.Schema, Schema, (w, s) => s.SerializeAsV2(w)); - } + /// + /// Write the request body schema for V2 serialization. + /// + /// Writer to use for the serialization + /// Extensions clone + internal virtual void WriteRequestBodySchemaForV2(IOpenApiWriter writer, Dictionary? extensionsClone) + { // In V2 parameter's type can't be a reference to a custom object schema or can't be of type object // So in that case map the type as string. - else if (Schema is OpenApiSchemaReference { UnresolvedReference: true } || (Schema?.Type & JsonSchemaType.Object) == JsonSchemaType.Object) + if (Schema is OpenApiSchemaReference { UnresolvedReference: true } || (Schema?.Type & JsonSchemaType.Object) == JsonSchemaType.Object) { writer.WriteProperty(OpenApiConstants.Type, "string"); } @@ -270,7 +245,34 @@ public void SerializeAsV2(IOpenApiWriter writer) } } } + } + + /// + public void SerializeAsV2(IOpenApiWriter writer) + { + Utils.CheckArgumentNull(writer); + + writer.WriteStartObject(); + + // in + WriteInPropertyForV2(writer); + // name + writer.WriteProperty(OpenApiConstants.Name, Name); + + // description + writer.WriteProperty(OpenApiConstants.Description, Description); + + // required + writer.WriteProperty(OpenApiConstants.Required, Required, false); + + // deprecated + writer.WriteProperty(OpenApiConstants.Deprecated, Deprecated, false); + + var extensionsClone = Extensions is not null ? new Dictionary(Extensions) : null; + + // schema + WriteRequestBodySchemaForV2(writer, extensionsClone); //examples if (Examples != null && Examples.Any()) { @@ -315,6 +317,14 @@ public IOpenApiParameter CreateShallowCopy() /// internal class OpenApiBodyParameter : OpenApiParameter { + internal override void WriteRequestBodySchemaForV2(IOpenApiWriter writer, Dictionary? extensionsClone) + { + writer.WriteOptionalObject(OpenApiConstants.Schema, Schema, (w, s) => s.SerializeAsV2(w)); + } + internal override void WriteInPropertyForV2(IOpenApiWriter writer) + { + writer.WriteProperty(OpenApiConstants.In, "body"); + } } /// @@ -322,5 +332,9 @@ internal class OpenApiBodyParameter : OpenApiParameter /// internal class OpenApiFormDataParameter : OpenApiParameter { + internal override void WriteInPropertyForV2(IOpenApiWriter writer) + { + writer.WriteProperty(OpenApiConstants.In, "formData"); + } } } From 5835057a7e905e371f859e727ddaf65ec08c6db0 Mon Sep 17 00:00:00 2001 From: Vincent Biret Date: Wed, 16 Apr 2025 13:13:00 -0400 Subject: [PATCH 2/2] fix: avoid calling virtual members in constructor Signed-off-by: Vincent Biret --- src/Microsoft.OpenApi/Writers/FormattingStreamWriter.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.OpenApi/Writers/FormattingStreamWriter.cs b/src/Microsoft.OpenApi/Writers/FormattingStreamWriter.cs index ea4f33f63..5d24b1f3b 100644 --- a/src/Microsoft.OpenApi/Writers/FormattingStreamWriter.cs +++ b/src/Microsoft.OpenApi/Writers/FormattingStreamWriter.cs @@ -19,12 +19,13 @@ public class FormattingStreamWriter : StreamWriter public FormattingStreamWriter(Stream stream, IFormatProvider formatProvider) : base(stream) { - this.FormatProvider = formatProvider; + _formatProvider = formatProvider; } + private readonly IFormatProvider _formatProvider; /// /// The associated with this . /// - public override IFormatProvider FormatProvider { get; } + public override IFormatProvider FormatProvider { get => _formatProvider; } } }