@@ -224,7 +224,7 @@ public void SerializeAsV2(IOpenApiWriter writer)
224224 // operationId
225225 writer . WriteProperty ( OpenApiConstants . OperationId , OperationId ) ;
226226
227- IList < OpenApiParameter > parameters ;
227+ List < OpenApiParameter > parameters ;
228228 if ( Parameters == null )
229229 {
230230 parameters = new List < OpenApiParameter > ( ) ;
@@ -237,70 +237,58 @@ public void SerializeAsV2(IOpenApiWriter writer)
237237 if ( RequestBody != null )
238238 {
239239 // consumes
240- writer . WritePropertyName ( OpenApiConstants . Consumes ) ;
241- writer . WriteStartArray ( ) ;
242240 var consumes = RequestBody . Content . Keys . Distinct ( ) . ToList ( ) ;
243- foreach ( var mediaType in consumes )
241+ if ( consumes . Any ( ) )
244242 {
245- writer . WriteValue ( mediaType ) ;
246- }
247-
248- writer . WriteEndArray ( ) ;
249-
250- // This is form data. We need to split the request body into multiple parameters.
251- if ( consumes . Contains ( "application/x-www-form-urlencoded" ) ||
252- consumes . Contains ( "multipart/form-data" ) )
253- {
254- foreach ( var property in RequestBody . Content . First ( ) . Value . Schema . Properties )
243+ // This is form data. We need to split the request body into multiple parameters.
244+ if ( consumes . Contains ( "application/x-www-form-urlencoded" ) ||
245+ consumes . Contains ( "multipart/form-data" ) )
255246 {
256- var paramSchema = property . Value ;
257- if ( "string" . Equals ( paramSchema . Type , StringComparison . OrdinalIgnoreCase )
258- && ( "binary" . Equals ( paramSchema . Format , StringComparison . OrdinalIgnoreCase )
259- || "base64" . Equals ( paramSchema . Format , StringComparison . OrdinalIgnoreCase ) ) )
260- {
261- paramSchema . Type = "file" ;
262- paramSchema . Format = null ;
263- }
264- parameters . Add (
265- new OpenApiFormDataParameter
266- {
267- Description = property . Value . Description ,
268- Name = property . Key ,
269- Schema = property . Value ,
270- Required = RequestBody . Content . First ( ) . Value . Schema . Required . Contains ( property . Key )
271-
272- } ) ;
247+ parameters . AddRange ( RequestBody . ConvertToFormDataParameters ( ) ) ;
248+ }
249+ else
250+ {
251+ parameters . Add ( RequestBody . ConvertToBodyParameter ( ) ) ;
273252 }
274253 }
275- else
254+ else if ( RequestBody . Reference != null )
276255 {
277- var content = RequestBody . Content . Values . FirstOrDefault ( ) ;
256+ parameters . Add (
257+ new OpenApiParameter
258+ {
259+ UnresolvedReference = true ,
260+ Reference = RequestBody . Reference
261+ } ) ;
278262
279- var bodyParameter = new OpenApiBodyParameter
263+ if ( RequestBody . Reference . HostDocument != null )
280264 {
281- Description = RequestBody . Description ,
282- // V2 spec actually allows the body to have custom name.
283- // To allow round-tripping we use an extension to hold the name
284- Name = "body" ,
285- Schema = content ? . Schema ?? new OpenApiSchema ( ) ,
286- Required = RequestBody . Required ,
287- Extensions = RequestBody . Extensions . ToDictionary ( k => k . Key , v => v . Value ) // Clone extensions so we can remove the x-bodyName extensions from the output V2 model.
288- } ;
289-
290- if ( bodyParameter . Extensions . ContainsKey ( OpenApiConstants . BodyName ) )
265+ var effectiveRequestBody = RequestBody . GetEffective ( RequestBody . Reference . HostDocument ) ;
266+ if ( effectiveRequestBody != null )
267+ consumes = effectiveRequestBody . Content . Keys . Distinct ( ) . ToList ( ) ;
268+ }
269+ }
270+
271+ if ( consumes . Any ( ) )
272+ {
273+ writer . WritePropertyName ( OpenApiConstants . Consumes ) ;
274+ writer . WriteStartArray ( ) ;
275+ foreach ( var mediaType in consumes )
291276 {
292- bodyParameter . Name = ( RequestBody . Extensions [ OpenApiConstants . BodyName ] as OpenApiString ) ? . Value ?? "body" ;
293- bodyParameter . Extensions . Remove ( OpenApiConstants . BodyName ) ;
277+ writer . WriteValue ( mediaType ) ;
294278 }
295-
296- parameters . Add ( bodyParameter ) ;
279+ writer . WriteEndArray ( ) ;
297280 }
298281 }
299282
300283 if ( Responses != null )
301284 {
302- var produces = Responses . Where ( r => r . Value . Content != null )
303- . SelectMany ( r => r . Value . Content ? . Keys )
285+ var produces = Responses
286+ . Where ( static r => r . Value . Content != null )
287+ . SelectMany ( static r => r . Value . Content ? . Keys )
288+ . Concat (
289+ Responses
290+ . Where ( static r => r . Value . Reference != null && r . Value . Reference . HostDocument != null )
291+ . SelectMany ( static r => r . Value . GetEffective ( r . Value . Reference . HostDocument ) ? . Content ? . Keys ) )
304292 . Distinct ( )
305293 . ToList ( ) ;
306294
0 commit comments