diff --git a/src/Microsoft.OpenApi/Reader/V2/OpenApiParameterDeserializer.cs b/src/Microsoft.OpenApi/Reader/V2/OpenApiParameterDeserializer.cs index 61f3b49b1..a074ef242 100644 --- a/src/Microsoft.OpenApi/Reader/V2/OpenApiParameterDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V2/OpenApiParameterDeserializer.cs @@ -72,8 +72,13 @@ internal static partial class OpenApiV2Deserializer { var type = n.GetScalarValue(); if (type != null) - { - GetOrCreateSchema(o).Type = type.ToJsonSchemaType(); + { + var schema = GetOrCreateSchema(o); + schema.Type = type.ToJsonSchemaType(); + if ("file".Equals(type, StringComparison.OrdinalIgnoreCase)) + { + schema.Format = "binary"; + } } } }, diff --git a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiParameterTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiParameterTests.cs index aa11d5137..b20c27761 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiParameterTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiParameterTests.cs @@ -8,6 +8,8 @@ using Microsoft.OpenApi.Models; using Microsoft.OpenApi.Reader.ParseNodes; using Microsoft.OpenApi.Reader.V2; +using Microsoft.OpenApi.Tests; +using Microsoft.OpenApi.Writers; using Xunit; namespace Microsoft.OpenApi.Readers.Tests.V2Tests @@ -279,5 +281,32 @@ public void ParseParameterWithEnumShouldSucceed() .Excluding((IMemberInfo memberInfo) => memberInfo.Path.EndsWith("Parent"))); } + + [Fact] + public void ParseFormDataParameterShouldSucceed() + { + // Arrange + var expected = @"{ + ""type"": ""string"", + ""description"": ""file to upload"", + ""format"": ""binary"" +}"; + MapNode node; + using (var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "formDataParameter.json"))) + { + node = TestHelper.CreateYamlMapNode(stream); + } + + // Act + var operation = OpenApiV2Deserializer.LoadOperation(node, new()); + var schema = operation.RequestBody?.Content["multipart/form-data"].Schema.Properties["file"]; + var writer = new StringWriter(); + schema.SerializeAsV2(new OpenApiJsonWriter(writer)); + var json = writer.ToString(); + + // Assert + Assert.Equal("binary", schema.Format); + Assert.Equal(expected.MakeLineBreaksEnvironmentNeutral(), json.MakeLineBreaksEnvironmentNeutral()); + } } } diff --git a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/Samples/OpenApiParameter/formDataParameter.json b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/Samples/OpenApiParameter/formDataParameter.json new file mode 100644 index 000000000..45597c012 --- /dev/null +++ b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/Samples/OpenApiParameter/formDataParameter.json @@ -0,0 +1,32 @@ +{ + "tags": [ "pet" ], + "summary": "uploads an image", + "description": "", + "operationId": "uploadFile", + "consumes": [ "multipart/form-data" ], + "produces": [ "application/json" ], + "parameters": [ + { + "name": "petId", + "in": "path", + "description": "ID of pet to update", + "required": true, + "type": "integer", + "format": "int64" + }, + { + "name": "additionalMetadata", + "in": "formData", + "description": "Additional data to pass to server", + "required": false, + "type": "string" + }, + { + "name": "file", + "in": "formData", + "description": "file to upload", + "required": false, + "type": "file" + } + ] +} \ No newline at end of file