Skip to content

Commit 58c4c36

Browse files
committed
Fixes based on PR review
1 parent 5f5a310 commit 58c4c36

File tree

6 files changed

+133
-17
lines changed

6 files changed

+133
-17
lines changed

src/Microsoft.OpenApi.Readers/OpenApiReaderSettings.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,6 @@ public class OpenApiReaderSettings
5252
/// <summary>
5353
/// URL where relative references should be resolved from if the description does not contain Server definitions
5454
/// </summary>
55-
public Uri BaseUrl { get; set; } = new Uri("https://example.org/");
55+
public Uri BaseUrl { get; set; }
5656
}
5757
}

src/Microsoft.OpenApi.Readers/V2/OpenApiDocumentDeserializer.cs

Lines changed: 41 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -132,35 +132,63 @@ private static void MakeServers(IList<OpenApiServer> servers, ParsingContext con
132132
}
133133

134134
// Fill in missing information based on the defaultUrl
135-
host = host ?? defaultUrl.GetComponents(UriComponents.NormalizedHost, UriFormat.SafeUnescaped);
136-
basePath = basePath ?? defaultUrl.GetComponents(UriComponents.Path, UriFormat.SafeUnescaped);
137-
schemes = schemes ?? new List<string> { defaultUrl.GetComponents(UriComponents.Scheme, UriFormat.SafeUnescaped) };
138-
135+
if (defaultUrl != null)
136+
{
137+
host = host ?? defaultUrl.GetComponents(UriComponents.NormalizedHost, UriFormat.SafeUnescaped);
138+
basePath = basePath ?? defaultUrl.GetComponents(UriComponents.Path, UriFormat.SafeUnescaped);
139+
schemes = schemes ?? new List<string> { defaultUrl.GetComponents(UriComponents.Scheme, UriFormat.SafeUnescaped) };
140+
} else if (String.IsNullOrEmpty(host) && String.IsNullOrEmpty(basePath))
141+
{
142+
return; // Can't make a server object out of just a Scheme
143+
}
139144

140145
// Create the Server objects
141146
if (schemes != null)
142147
{
143148
foreach (var scheme in schemes)
144149
{
145-
var ub = new UriBuilder(scheme, host)
150+
var uriBuilder = new UriBuilder(scheme, host)
146151
{
147152
Path = basePath
148153
};
149154

150155
var server = new OpenApiServer
151156
{
152-
Url = ub.ToString()
157+
Url = uriBuilder.ToString()
153158
};
154159

155-
// Server Urls are always appended to Paths and Paths must start with /
156-
// so removing the slash prevents a double slash.
157-
if (server.Url.EndsWith("/"))
158-
{
159-
server.Url = server.Url.Substring(0, server.Url.Length - 1);
160-
}
161160
servers.Add(server);
162161
}
163-
}
162+
}
163+
else
164+
{
165+
if (!String.IsNullOrEmpty(host))
166+
{
167+
host = "//" + host;
168+
}
169+
var uriBuilder = new UriBuilder()
170+
{
171+
Scheme = null,
172+
Host = host,
173+
Path = basePath
174+
};
175+
var server = new OpenApiServer
176+
{
177+
Url = uriBuilder.ToString()
178+
};
179+
180+
servers.Add(server);
181+
}
182+
183+
foreach (var server in servers)
184+
{
185+
// Server Urls are always appended to Paths and Paths must start with /
186+
// so removing the slash prevents a double slash.
187+
if (server.Url.EndsWith("/"))
188+
{
189+
server.Url = server.Url.Substring(0, server.Url.Length - 1);
190+
}
191+
}
164192
}
165193

166194
public static OpenApiDocument LoadOpenApi(RootNode rootNode)

src/Microsoft.OpenApi/Extensions/OpenApiSerializableExtensions.cs

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,42 @@ public static void Serialize<T>(this T element, IOpenApiWriter writer, OpenApiSp
114114
writer.Flush();
115115
}
116116

117+
/// <summary>
118+
/// Serializes the <see cref="IOpenApiSerializable"/> to Open API document using the given specification version and writer.
119+
/// </summary>
120+
/// <typeparam name="T">the <see cref="IOpenApiSerializable"/></typeparam>
121+
/// <param name="element">The Open API element.</param>
122+
/// <param name="writer">The output writer.</param>
123+
public static void Serialize<T>(this T element, IOpenApiWriter writer)
124+
where T : IOpenApiSerializable
125+
{
126+
if (element == null)
127+
{
128+
throw Error.ArgumentNull(nameof(element));
129+
}
130+
131+
if (writer == null)
132+
{
133+
throw Error.ArgumentNull(nameof(writer));
134+
}
135+
136+
switch (writer.Settings.SpecVersion)
137+
{
138+
case OpenApiSpecVersion.OpenApi3_0:
139+
element.SerializeAsV3(writer);
140+
break;
141+
142+
case OpenApiSpecVersion.OpenApi2_0:
143+
element.SerializeAsV2(writer);
144+
break;
145+
146+
default:
147+
throw new OpenApiException(string.Format(SRResource.OpenApiSpecVersionNotSupported, writer.Settings.SpecVersion));
148+
}
149+
150+
writer.Flush();
151+
}
152+
117153
/// <summary>
118154
/// Serializes the <see cref="IOpenApiSerializable"/> to the Open API document as a string in JSON format.
119155
/// </summary>

src/Microsoft.OpenApi/Writers/IOpenApiWriter.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,11 @@ namespace Microsoft.OpenApi.Writers
88
/// </summary>
99
public interface IOpenApiWriter
1010
{
11+
/// <summary>
12+
/// Returns the settings being used the Writer for controlling serialization
13+
/// </summary>
14+
OpenApiSerializerSettings Settings { get; }
15+
1116
/// <summary>
1217
/// Write the start object.
1318
/// </summary>

src/Microsoft.OpenApi/Writers/OpenApiWriterBase.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,11 @@ public OpenApiWriterBase(TextWriter textWriter, OpenApiSerializerSettings settin
4848
this._settings = settings;
4949
}
5050

51+
/// <summary>
52+
/// Returns the settings being used the Writer for controlling serialization
53+
/// </summary>
54+
public OpenApiSerializerSettings Settings { get; }
55+
5156
/// <summary>
5257
/// Base Indentation Level.
5358
/// This denotes how many indentations are needed for the property in the base object.

test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiServerTests.cs

Lines changed: 45 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ public void NoServer()
2828
}
2929

3030
[Fact]
31-
public void JustScheme()
31+
public void JustSchemeNoDefault()
3232
{
3333
var input = @"
3434
swagger: 2.0
@@ -45,9 +45,51 @@ public void JustScheme()
4545

4646
var doc = reader.Read(input, out var diagnostic);
4747

48+
Assert.Equal(0, doc.Servers.Count);
49+
}
50+
51+
[Fact]
52+
public void JustHostNoDefault()
53+
{
54+
var input = @"
55+
swagger: 2.0
56+
info:
57+
title: test
58+
version: 1.0.0
59+
host: www.foo.com
60+
paths: {}
61+
";
62+
var reader = new OpenApiStringReader(new OpenApiReaderSettings()
63+
{
64+
});
65+
66+
var doc = reader.Read(input, out var diagnostic);
67+
4868
var server = doc.Servers.First();
49-
Assert.Equal(1,doc.Servers.Count);
50-
Assert.Equal("http://example.org", server.Url);
69+
Assert.Equal(1, doc.Servers.Count);
70+
Assert.Equal("//www.foo.com", server.Url);
71+
}
72+
73+
[Fact]
74+
public void JustBasePathNoDefault()
75+
{
76+
var input = @"
77+
swagger: 2.0
78+
info:
79+
title: test
80+
version: 1.0.0
81+
basePath: /baz
82+
paths: {}
83+
";
84+
var reader = new OpenApiStringReader(new OpenApiReaderSettings()
85+
{
86+
});
87+
88+
var doc = reader.Read(input, out var diagnostic);
89+
90+
var server = doc.Servers.First();
91+
Assert.Equal(1, doc.Servers.Count);
92+
Assert.Equal("/baz", server.Url);
5193
}
5294

5395
[Fact]

0 commit comments

Comments
 (0)