Skip to content

Commit c08eb18

Browse files
authored
Merge pull request #391 from xuzhg/ChangeBytesSerialize
Change the deserialization and serialization logics for OpenApiByte & OpenApiBinary
2 parents 3ad1f71 + 3a41a1d commit c08eb18

File tree

5 files changed

+48
-82
lines changed

5 files changed

+48
-82
lines changed

src/Microsoft.OpenApi.Readers/ParseNodes/OpenApiAnyConverter.cs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using System;
55
using System.Globalization;
66
using System.Linq;
7+
using System.Text;
78
using Microsoft.OpenApi.Any;
89
using Microsoft.OpenApi.Exceptions;
910
using Microsoft.OpenApi.Models;
@@ -195,16 +196,23 @@ public static IOpenApiAny GetSpecificOpenApiAny(IOpenApiAny openApiAny, OpenApiS
195196

196197
if (type == "string" && format == "byte")
197198
{
198-
if (byte.TryParse(value, NumberStyles.Any, CultureInfo.InvariantCulture, out var byteValue))
199+
try
199200
{
200-
return new OpenApiByte(byteValue);
201+
return new OpenApiByte(Convert.FromBase64String(value));
201202
}
203+
catch(FormatException)
204+
{ }
202205
}
203206

204207
// binary
205208
if (type == "string" && format == "binary")
206209
{
207-
return new OpenApiBinary(Convert.FromBase64String(value));
210+
try
211+
{
212+
return new OpenApiBinary(Encoding.UTF8.GetBytes(value));
213+
}
214+
catch(EncoderFallbackException)
215+
{ }
208216
}
209217

210218
if (type == "string" && format == "date")

src/Microsoft.OpenApi/Any/OpenApiByte.cs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,20 @@ namespace Microsoft.OpenApi.Any
66
/// <summary>
77
/// Open API Byte
88
/// </summary>
9-
public class OpenApiByte : OpenApiPrimitive<byte>
9+
public class OpenApiByte : OpenApiPrimitive<byte[]>
1010
{
1111
/// <summary>
1212
/// Initializes the <see cref="OpenApiByte"/> class.
1313
/// </summary>
1414
public OpenApiByte(byte value)
15+
: this(new byte[] { value })
16+
{
17+
}
18+
19+
/// <summary>
20+
/// Initializes the <see cref="OpenApiByte"/> class.
21+
/// </summary>
22+
public OpenApiByte(byte[] value)
1523
: base(value)
1624
{
1725
}

src/Microsoft.OpenApi/Any/OpenApiPrimitive.cs

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
// Copyright (c) Microsoft Corporation. All rights reserved.
22
// Licensed under the MIT license.
33

4+
using System;
5+
using System.Text;
46
using Microsoft.OpenApi.Exceptions;
57
using Microsoft.OpenApi.Properties;
68
using Microsoft.OpenApi.Writers;
@@ -73,12 +75,28 @@ public void Write(IOpenApiWriter writer, OpenApiSpecVersion specVersion)
7375

7476
case PrimitiveType.Byte:
7577
var byteValue = (OpenApiByte)(IOpenApiPrimitive)this;
76-
writer.WriteValue(byteValue.Value);
78+
if (byteValue.Value == null)
79+
{
80+
writer.WriteNull();
81+
}
82+
else
83+
{
84+
writer.WriteValue(Convert.ToBase64String(byteValue.Value));
85+
}
86+
7787
break;
7888

7989
case PrimitiveType.Binary:
8090
var binaryValue = (OpenApiBinary)(IOpenApiPrimitive)this;
81-
writer.WriteValue(binaryValue.Value);
91+
if (binaryValue.Value == null)
92+
{
93+
writer.WriteNull();
94+
}
95+
else
96+
{
97+
writer.WriteValue(Encoding.UTF8.GetString(binaryValue.Value));
98+
}
99+
82100
break;
83101

84102
case PrimitiveType.Boolean:

src/Microsoft.OpenApi/Writers/OpenApiWriterAnyExtensions.cs

Lines changed: 3 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,9 @@
11
// Copyright (c) Microsoft Corporation. All rights reserved.
22
// Licensed under the MIT license.
33

4-
using System;
54
using System.Collections.Generic;
6-
using Microsoft.OpenApi.Interfaces;
7-
using Microsoft.OpenApi.Exceptions;
8-
using Microsoft.OpenApi.Properties;
95
using Microsoft.OpenApi.Any;
6+
using Microsoft.OpenApi.Interfaces;
107

118
namespace Microsoft.OpenApi.Writers
129
{
@@ -137,76 +134,8 @@ private static void WritePrimitive(this IOpenApiWriter writer, IOpenApiPrimitive
137134
throw Error.ArgumentNull(nameof(primitive));
138135
}
139136

140-
switch (primitive.PrimitiveType)
141-
{
142-
case PrimitiveType.Integer:
143-
var intValue = (OpenApiInteger)primitive;
144-
writer.WriteValue(intValue.Value);
145-
break;
146-
147-
case PrimitiveType.Long:
148-
var longValue = (OpenApiLong)primitive;
149-
writer.WriteValue(longValue.Value);
150-
break;
151-
152-
case PrimitiveType.Float:
153-
var floatValue = (OpenApiFloat)primitive;
154-
writer.WriteValue(floatValue.Value);
155-
break;
156-
157-
case PrimitiveType.Double:
158-
var doubleValue = (OpenApiDouble)primitive;
159-
writer.WriteValue(doubleValue.Value);
160-
break;
161-
162-
case PrimitiveType.String:
163-
var stringValue = (OpenApiString)primitive;
164-
writer.WriteValue(stringValue.Value);
165-
break;
166-
167-
case PrimitiveType.Byte:
168-
var byteValue = (OpenApiByte)primitive;
169-
writer.WriteValue(byteValue.Value);
170-
break;
171-
172-
case PrimitiveType.Binary:
173-
var binaryValue = (OpenApiBinary)primitive;
174-
if (binaryValue == null)
175-
{
176-
writer.WriteNull();
177-
}
178-
else
179-
{
180-
writer.WriteValue(Convert.ToBase64String(binaryValue.Value));
181-
}
182-
break;
183-
184-
case PrimitiveType.Boolean:
185-
var boolValue = (OpenApiBoolean)primitive;
186-
writer.WriteValue(boolValue.Value);
187-
break;
188-
189-
case PrimitiveType.Date:
190-
var dateValue = (OpenApiDate)primitive;
191-
writer.WriteValue(dateValue.Value);
192-
break;
193-
194-
case PrimitiveType.DateTime:
195-
var dateTimeValue = (OpenApiDateTime)primitive;
196-
writer.WriteValue(dateTimeValue.Value);
197-
break;
198-
199-
case PrimitiveType.Password:
200-
var passwordValue = (OpenApiPassword)primitive;
201-
writer.WriteValue(passwordValue.Value);
202-
break;
203-
204-
default:
205-
throw new OpenApiWriterException(
206-
string.Format(
207-
SRResource.PrimitiveTypeNotSupported,
208-
primitive.PrimitiveType));
209-
}
137+
// The Spec version is meaning for the Any type, so it's ok to use the latest one.
138+
primitive.Write(writer, OpenApiSpecVersion.OpenApi3_0);
210139
}
211140
}
212141
}

test/Microsoft.OpenApi.Tests/Models/OpenApiExampleTests.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
using System.Globalization;
55
using System.IO;
6+
using System.Text;
67
using FluentAssertions;
78
using Microsoft.OpenApi.Any;
89
using Microsoft.OpenApi.Models;
@@ -31,7 +32,8 @@ public class OpenApiExampleTests
3132
{
3233
["href"] = new OpenApiString("http://example.com/1"),
3334
["rel"] = new OpenApiString("sampleRel1"),
34-
["binary"] = new OpenApiBinary(new byte[] { 1, 2, 3 })
35+
["bytes"] = new OpenApiByte(new byte[] { 1, 2, 3 }),
36+
["binary"] = new OpenApiBinary(Encoding.UTF8.GetBytes("Ñ😻😑♮Í☛oƞ♑😲☇éNjžŁ♻😟¥a´Ī♃ƠąøƩ"))
3537
}
3638
}
3739
},
@@ -119,7 +121,8 @@ public void SerializeAdvancedExampleAsV3JsonWorks()
119121
{
120122
""href"": ""http://example.com/1"",
121123
""rel"": ""sampleRel1"",
122-
""binary"": ""AQID""
124+
""bytes"": ""AQID"",
125+
""binary"": ""Ñ😻😑♮Í☛oƞ♑😲☇éNjžŁ♻😟¥a´Ī♃ƠąøƩ""
123126
}
124127
]
125128
},

0 commit comments

Comments
 (0)