// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections.Generic; using System.Linq; using Newtonsoft.Json.Linq; namespace Microsoft.HttpRepl.OpenApi { public class SwaggerV2EndpointMetadataReader : IEndpointMetadataReader { public bool CanHandle(JObject document) { return (document["swagger"]?.ToString() ?? "").StartsWith("2.", StringComparison.Ordinal); } public IEnumerable ReadMetadata(JObject document) { List metadata = new List(); if (!(document["consumes"] is JArray globalConsumes)) { globalConsumes = new JArray(); } if (document["paths"] is JObject obj) { foreach (JProperty property in obj.Properties()) { if (!(property.Value is JObject requestMethodInfos)) { continue; } Dictionary>> requestMethods = new Dictionary>>(StringComparer.Ordinal); foreach (JProperty methodInfo in requestMethodInfos.Properties()) { List parameters = new List(); if (methodInfo.Value is JObject methodInfoDescription) { if (methodInfoDescription["parameters"] is JArray parametersArray) { foreach (JObject parameterObj in parametersArray.OfType()) { //TODO: Resolve refs here Parameter p = parameterObj.ToObject(); p.Location = parameterObj["in"]?.ToString(); p.IsRequired = parameterObj["required"]?.ToObject() ?? false; if (!(parameterObj["schema"] is JObject schemaObject)) { schemaObject = null; } p.Schema = schemaObject?.ToObject() ?? parameterObj.ToObject(); parameters.Add(p); } } if (!(methodInfoDescription["consumes"] is JArray consumes)) { consumes = globalConsumes; } Dictionary> parametersByContentType = new Dictionary>(StringComparer.OrdinalIgnoreCase) { { "", parameters } }; foreach (JValue value in consumes.OfType().Where(x => x.Type == JTokenType.String)) { parametersByContentType[value.ToString()] = parameters; } requestMethods[methodInfo.Name] = parametersByContentType; } } metadata.Add(new EndpointMetadata(property.Name, requestMethods)); } } return metadata; } } }