@@ -119,21 +119,82 @@ internal static partial class OpenApiV2Deserializer
119119 { s => s . StartsWith ( "x-" ) , ( o , p , n ) => o . AddExtension ( p , n . CreateAny ( ) ) }
120120 } ;
121121
122- private static void MakeServers ( IList < OpenApiServer > servers , ParsingContext context )
122+ private static void MakeServers ( IList < OpenApiServer > servers , ParsingContext context , Uri defaultUrl )
123123 {
124124 var host = context . GetFromTempStorage < string > ( "host" ) ;
125125 var basePath = context . GetFromTempStorage < string > ( "basePath" ) ;
126126 var schemes = context . GetFromTempStorage < List < string > > ( "schemes" ) ;
127127
128+ // If nothing is provided, don't create a server
129+ if ( host == null && basePath == null && schemes == null )
130+ {
131+ return ;
132+ }
133+
134+ // Fill in missing information based on the defaultUrl
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+ }
141+ else if ( String . IsNullOrEmpty ( host ) && String . IsNullOrEmpty ( basePath ) )
142+ {
143+ return ; // Can't make a server object out of just a Scheme
144+ }
145+
146+ // Create the Server objects
128147 if ( schemes != null )
129148 {
130149 foreach ( var scheme in schemes )
131150 {
132- var server = new OpenApiServer ( ) ;
133- server . Url = scheme + "://" + ( host ?? "example.org/" ) + ( basePath ?? "/" ) ;
151+ if ( String . IsNullOrEmpty ( scheme ) )
152+ {
153+ host = "//" + host ; // The double slash prefix creates a relative url where the scheme is defined by the BaseUrl
154+ }
155+
156+ var uriBuilder = new UriBuilder ( scheme , host )
157+ {
158+ Path = basePath
159+ } ;
160+
161+ var server = new OpenApiServer
162+ {
163+ Url = uriBuilder . ToString ( )
164+ } ;
165+
134166 servers . Add ( server ) ;
135167 }
136168 }
169+ else
170+ {
171+ if ( ! String . IsNullOrEmpty ( host ) )
172+ {
173+ host = "//" + host ; // The double slash prefix creates a relative url where the scheme is defined by the BaseUrl
174+ }
175+ var uriBuilder = new UriBuilder ( )
176+ {
177+ Scheme = null ,
178+ Host = host ,
179+ Path = basePath
180+ } ;
181+ var server = new OpenApiServer
182+ {
183+ Url = uriBuilder . ToString ( )
184+ } ;
185+
186+ servers . Add ( server ) ;
187+ }
188+
189+ foreach ( var server in servers )
190+ {
191+ // Server Urls are always appended to Paths and Paths must start with /
192+ // so removing the slash prevents a double slash.
193+ if ( server . Url . EndsWith ( "/" ) )
194+ {
195+ server . Url = server . Url . Substring ( 0 , server . Url . Length - 1 ) ;
196+ }
197+ }
137198 }
138199
139200 public static OpenApiDocument LoadOpenApi ( RootNode rootNode )
@@ -151,7 +212,7 @@ public static OpenApiDocument LoadOpenApi(RootNode rootNode)
151212 openApidoc . Servers = new List < OpenApiServer > ( ) ;
152213 }
153214
154- MakeServers ( openApidoc . Servers , openApiNode . Context ) ;
215+ MakeServers ( openApidoc . Servers , openApiNode . Context , rootNode . Context . BaseUrl ) ;
155216
156217 FixRequestBodyReferences ( openApidoc ) ;
157218 return openApidoc ;
0 commit comments