private static (OpenApiDocument, OpenApiDiagnostic) ReadSpecification(Stream stream)
        {
            var reader      = new OpenApiStreamReader();
            var apiDocument = reader.Read(stream, out OpenApiDiagnostic diags);

            return(apiDocument, diags);
        }
        private async Task PublishServiceApiAsync(HttpContext context, string serviceId)
        {
            var reader   = new OpenApiStreamReader();
            var document = reader.Read(context.Request.Body, out var diagnostic);

            if (diagnostic.Errors.Count > 0)
            {
                context.Response.StatusCode  = (int)HttpStatusCode.BadRequest;
                context.Response.ContentType = "text/plain";
                await context.Response.WriteAsync("Error reading OpenApi document. " + string.Join(Environment.NewLine, diagnostic.Errors.Select(e => e.Message)));
            }

            if (ValidateModel(document))
            {
                await _serviceRepository.StoreApiAsync(new Models.ServiceApiDescription {
                    ApiDocument = document, ServiceId = serviceId
                });

                context.Response.StatusCode = (int)HttpStatusCode.OK;
            }
            else
            {
                context.Response.StatusCode  = (int)HttpStatusCode.BadRequest;
                context.Response.ContentType = "text/plain";
                await context.Response.WriteAsync("Invalid OpenApi document.");
            }
        }
        private static OpenApiDocument GetOpenApiDocument(string url)
        {
            HttpClient httpClient = CreateHttpClient();

            var response = httpClient.GetAsync(url)
                           .GetAwaiter().GetResult();

            if (!response.IsSuccessStatusCode)
            {
                throw new Exception("Failed to retrieve OpenApi document");
            }

            var stream = response.Content.ReadAsStreamAsync().GetAwaiter().GetResult();;

            var newrules = ValidationRuleSet.GetDefaultRuleSet().Rules
                           .Where(r => r.GetType() != typeof(ValidationRule <OpenApiSchema>)).ToList();


            var reader = new OpenApiStreamReader(new OpenApiReaderSettings()
            {
                RuleSet = new ValidationRuleSet(newrules)
            });
            var openApiDoc = reader.Read(stream, out var diagnostic);

            if (diagnostic.Errors.Count > 0)
            {
                throw new Exception("OpenApi document has errors : " + String.Join("\n", diagnostic.Errors));
            }
            return(openApiDoc);
        }
        public async Task JwtAuthenticationOption_GetSwaggerDocs_ContainsJwtSecurityScheme()
        {
            // Arrange
            string key       = $"secret-{Guid.NewGuid()}";
            string issuer    = $"issuer-{Guid.NewGuid()}";
            string audience  = $"audience-{Guid.NewGuid()}";
            string jwtToken  = CreateToken(key, issuer, audience);
            var    jwtHeader = AuthenticationHeaderValue.Parse("Bearer " + jwtToken);

            var options = new WebApiProjectOptions().WithJwtAuthentication(key, issuer, audience);

            using (var project = await WebApiProject.StartNewAsync(options, _outputWriter))
            {
                // Act
                using (HttpResponseMessage response = await project.Swagger.GetSwaggerDocsAsync())
                {
                    // Assert
                    Assert.Equal(HttpStatusCode.OK, response.StatusCode);
                    var reader = new OpenApiStreamReader();
                    using (Stream json = await response.Content.ReadAsStreamAsync())
                    {
                        OpenApiDocument document = reader.Read(json, out OpenApiDiagnostic diagnostic);

                        Assert.NotNull(document.Components);
                        (string schemeName, OpenApiSecurityScheme componentScheme) = Assert.Single(document.Components.SecuritySchemes);
                        Assert.Equal(SecuritySchemeType.Http, componentScheme.Type);

                        OpenApiSecurityRequirement requirement = Assert.Single(document.SecurityRequirements);
                        Assert.NotNull(requirement);
                        (OpenApiSecurityScheme requirementScheme, IList <string> scopes) = Assert.Single(requirement);
                        Assert.Equal("jwt", requirementScheme.Reference.Id);
                    }
                }
            }
        }
        public async Task OAuthAuthorizeOperationFilter_ShouldNotIncludeSecurityDefinitionResponses_OnNonAuthorizedOperations()
        {
            // Arrange
            using (var client = _testServer.CreateClient())
                // Act
                using (HttpResponseMessage response = await client.GetAsync("swagger/v1/swagger.json"))
                {
                    // Assert
                    Assert.Equal(HttpStatusCode.OK, response.StatusCode);

                    var reader = new OpenApiStreamReader();
                    using (var responseStream = await response.Content.ReadAsStreamAsync())
                    {
                        OpenApiDocument swagger = reader.Read(responseStream, out OpenApiDiagnostic diagnostic);
                        _outputWriter.WriteLine(diagnostic.Errors.Count == 0 ? String.Empty : String.Join(", ", diagnostic.Errors.Select(e => e.Message + ": " + e.Pointer)));

                        Assert.True(
                            swagger.Paths.TryGetValue("/oauth/none", out OpenApiPathItem oauthPath),
                            "Cannot find OAuth none authorized path in Open API spec file");

                        Assert.True(
                            oauthPath.Operations.TryGetValue(OperationType.Get, out OpenApiOperation oauthOperation),
                            "Cannot find OAuth GET operation in Open API spec file");

                        OpenApiResponses oauthResponses = oauthOperation.Responses;
                        Assert.DoesNotContain(oauthResponses, r => r.Key == "401");
                        Assert.DoesNotContain(oauthResponses, r => r.Key == "403");
                    }
                }
        }
Esempio n. 6
0
        public async Task SharedAccessKeyAuthenticationOption_GetsSwaggerDocs_ContainsSharedAccessKeySecurityScheme()
        {
            // Arrange
            const string headerName  = "x-shared-access-key";
            const string secretKey   = "MySecretKey";
            string       secretValue = Guid.NewGuid().ToString("N");

            var authenticatedArguments =
                new WebApiProjectOptions()
                .WithSharedAccessAuthentication(headerName, secretKey, secretValue);

            using (var project = await WebApiProject.StartNewAsync(_configuration, authenticatedArguments, _outputWriter))
                // Act
                using (HttpResponseMessage response = await project.Swagger.GetSwaggerDocsAsync())
                {
                    // Assert
                    Assert.Equal(HttpStatusCode.OK, response.StatusCode);
                    var reader = new OpenApiStreamReader();
                    using (Stream json = await response.Content.ReadAsStreamAsync())
                    {
                        OpenApiDocument document = reader.Read(json, out OpenApiDiagnostic diagnostic);

                        Assert.NotNull(document.Components);
                        (string schemeName, OpenApiSecurityScheme componentScheme) = Assert.Single(document.Components.SecuritySchemes);
                        Assert.Equal("shared-access-key", schemeName);
                        Assert.Equal(ParameterLocation.Header, componentScheme.In);
                        Assert.Equal(headerName, componentScheme.Name);

                        OpenApiSecurityRequirement requirement = Assert.Single(document.SecurityRequirements);
                        Assert.NotNull(requirement);
                        (OpenApiSecurityScheme requirementScheme, IList <string> scopes) = Assert.Single(requirement);
                        Assert.Equal(headerName, requirementScheme.Name);
                    }
                }
        }
Esempio n. 7
0
        public GraphTests(ITestOutputHelper output)
        {
            _output = output;
            System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
            _httpClient = new HttpClient(new HttpClientHandler()
            {                AutomaticDecompression = DecompressionMethods.GZip
            });
            _httpClient.DefaultRequestHeaders.AcceptEncoding.Add(new System.Net.Http.Headers.StringWithQualityHeaderValue("gzip"));
            _httpClient.DefaultRequestHeaders.UserAgent.Add(new System.Net.Http.Headers.ProductInfoHeaderValue("OpenApi.Net.Tests", "1.0"));

            var response = _httpClient.GetAsync(graphOpenApiUrl)
                                .GetAwaiter().GetResult();

            if (!response.IsSuccessStatusCode)
            {
                _output.WriteLine($"Couldn't load graph openapi");
                return;
            }

            var stream = response.Content.ReadAsStreamAsync().GetAwaiter().GetResult(); ;

            var reader = new OpenApiStreamReader();
            _graphOpenApi = reader.Read(stream, out var diagnostic);

            if (diagnostic.Errors.Count > 0)
            {
                _output.WriteLine($"Errors parsing");
                _output.WriteLine(String.Join("\n", diagnostic.Errors));
                //               Assert.True(false);  // Uncomment to identify descriptions with errors.
            }


        }
Esempio n. 8
0
        public async Task EnsureThatICouldParse(string url)
        {
            var response = await _httpClient.GetAsync(url);

            if (!response.IsSuccessStatusCode)
            {
                _output.WriteLine($"Couldn't load {url}");
                return;
            }

            await response.Content.LoadIntoBufferAsync();

            var stream = await response.Content.ReadAsStreamAsync();

            var stopwatch = new Stopwatch();

            stopwatch.Start();

            var reader          = new OpenApiStreamReader();
            var openApiDocument = reader.Read(stream, out var diagnostic);

            if (diagnostic.Errors.Count > 0)
            {
                _output.WriteLine($"Errors parsing {url}");
                _output.WriteLine(String.Join("\n", diagnostic.Errors));
                //               Assert.True(false);  // Uncomment to identify descriptions with errors.
            }

            Assert.NotNull(openApiDocument);
            stopwatch.Stop();
            _output.WriteLine($"Parsing {url} took {stopwatch.ElapsedMilliseconds} ms.");
        }
Esempio n. 9
0
        private async Task <OpenApiDocument> ReadDocumentAsync()
        {
            var reader = new OpenApiStreamReader();

            await using var stream = File.OpenRead(_options.InputFile);

            return(reader.Read(stream, out _));
        }
 private static OpenApiDocument FromStream(Stream stream)
 {
     using (stream)
     {
         var sr = new OpenApiStreamReader(_settings);
         return(sr.Read(stream, out var diagnostic));
     }
 }
Esempio n. 11
0
        private static OpenApiDocument GetDocument(string path)
        {
            var reader = new OpenApiStreamReader();

            using (var streamReader = new StreamReader(path))
            {
                return(reader.Read(streamReader.BaseStream, out _));
            }
        }
        public static OpenApiDocument Read(this OpenApiStreamReader reader, Stream input)
        {
            if (reader is null)
            {
                throw new ArgumentNullException(nameof(reader));
            }

            return(reader.Read(input, out OpenApiDiagnostic _));
        }
 public static OpenApiDocument ReadDocument(string filePath)
 {
     using (var fs = File.OpenRead(filePath))
     {
         var             sr       = new OpenApiStreamReader(_readerSettings);
         OpenApiDocument document = sr.Read(fs, out var diagnostic);
         SetSchemaTitles(document);
         return(document);
     }
 }
 public void StreamShouldNotCloseIfLeaveStreamOpenSettingEqualsTrue()
 {
     using (var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "petStore.yaml")))
     {
         var reader = new OpenApiStreamReader(new OpenApiReaderSettings {
             LeaveStreamOpen = true
         });
         reader.Read(stream, out _);
         Assert.True(stream.CanRead);
     }
 }
Esempio n. 15
0
        public async Task OpenApi_document_is_valid()
        {
            using var response = await this.Client.GetAsync($"/openapi.json");

            var reader = new OpenApiStreamReader();

            using var stream = await response.Content.ReadAsStreamAsync();

            reader.Read(stream, out var diagnostic);

            diagnostic.Errors.Should().BeEmpty();
        }
        public ValidationResult Validate(string schema)
        {
            var reader = new OpenApiStreamReader();
            var ms     = new MemoryStream(Encoding.Default.GetBytes(schema));

            reader.Read(ms, out var diagnostic);
            if (diagnostic.Errors.Count == 0)
            {
                return(ValidationResult.Success);
            }
            return(new ValidationResult(string.Join(Environment.NewLine, diagnostic.Errors.Select(x => x.Message))));
        }
Esempio n. 17
0
        private static OpenApiDocument Clone(OpenApiDocument subsetOpenApiDocument)
        {
            var stream = new MemoryStream();
            var writer = new OpenApiYamlWriter(new StreamWriter(stream));

            subsetOpenApiDocument.SerializeAsV3(writer);
            writer.Flush();
            stream.Position = 0;
            var reader = new OpenApiStreamReader();

            return(reader.Read(stream, out OpenApiDiagnostic diag));
        }
        private async Task <OpenApiDocument> ReadSwaggerOpenAPiDocumentAsync(HttpResponseMessage response)
        {
            var reader = new OpenApiStreamReader();

            using (var responseStream = await response.Content.ReadAsStreamAsync())
            {
                OpenApiDocument swagger = reader.Read(responseStream, out OpenApiDiagnostic diagnostic);
                _logger.LogTrace(diagnostic.Errors.Count == 0
                    ? String.Empty
                    : String.Join(", ", diagnostic.Errors.Select(e => e.Message + ": " + e.Pointer)));

                return(swagger);
            }
        }
Esempio n. 19
0
        public async Task OpenApi_endpoint_works(string extension)
        {
            using (var response = await client.GetAsync($"/openapi{extension}"))
            {
                var reader = new OpenApiStreamReader();

                using (var stream = await response.Content.ReadAsStreamAsync())
                {
                    reader.Read(stream, out var diagnostic);

                    Assert.IsFalse(diagnostic.Errors.Any(), string.Join(",", diagnostic.Errors));
                }
            }
        }
        public static OpenApiDocument ReadDocument(Stream docStream, out OpenApiDiagnostic diagnostic)
        {
            var reader = new OpenApiStreamReader(
                new OpenApiReaderSettings
            {
                ReferenceResolution = ReferenceResolutionSetting.ResolveLocalReferences,
                ExtensionParsers    =
                {
                    ["x-ms-enum"] = EnumOpenApiExtension.Parse,
                },
            });

            return(reader.Read(docStream, out diagnostic));
        }
Esempio n. 21
0
        public async Task OpenApi_document_is_valid()
        {
            using (var response = await client.GetAsync($"/openapi.json"))
            {
                var reader = new OpenApiStreamReader();

                using (var stream = await response.Content.ReadAsStreamAsync())
                {
                    reader.Read(stream, out var diagnostic);

                    Assert.IsFalse(diagnostic.Errors.Any(), string.Join(",", diagnostic.Errors));
                }
            }
        }
    public static OpenApiDocument GenerateApiDocument(
        string spec)
    {
        var memoryStream = new MemoryStream();

        using var writer = new StreamWriter(memoryStream);
        writer.Write(spec);
        writer.Flush();
        memoryStream.Position = 0;

        var openApiStreamReader = new OpenApiStreamReader();

        return(openApiStreamReader.Read(memoryStream, out _));
    }
Esempio n. 23
0
 public void ShouldAllowComponentsThatJustContainAReference()
 {
     using (var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "ComponentRootReference.json")))
     {
         OpenApiStreamReader reader  = new OpenApiStreamReader();
         OpenApiDocument     doc     = reader.Read(stream, out OpenApiDiagnostic diags);
         OpenApiSchema       schema1 = doc.Components.Schemas["AllPets"];
         Assert.False(schema1.UnresolvedReference);
         OpenApiSchema schema2 = (OpenApiSchema)doc.ResolveReference(schema1.Reference);
         if (schema2.UnresolvedReference && schema1.Reference.Id == schema2.Reference.Id)
         {
             // detected a cycle - this code gets triggered
             Assert.True(false, "A cycle should not be detected");
         }
     }
 }
Esempio n. 24
0
        protected (OpenApiDocument, OpenApiSpecVersion) ReadDoc()
        {
            var reader = new OpenApiStreamReader(new OpenApiReaderSettings().AddTypedRest());

            using var stream = InputPath == "-"
                ? Console.OpenStandardInput()
                : File.OpenRead(InputPath);
            var doc = reader.Read(stream, out var diagnostic);

            foreach (var error in diagnostic.Errors)
            {
                Console.Error.WriteLine("Warning: " + error.Message);
            }

            return(doc, diagnostic.SpecificationVersion);
        }
Esempio n. 25
0
        public IEnumerable <MappingModel> FromFile(string path, WireMockOpenApiParserSettings settings, out OpenApiDiagnostic diagnostic)
        {
            OpenApiDocument document;

            if (Path.GetExtension(path).EndsWith("raml", StringComparison.OrdinalIgnoreCase))
            {
                diagnostic = new OpenApiDiagnostic();
                document   = new RamlConverter().ConvertToOpenApiDocument(path);
            }
            else
            {
                var reader = new OpenApiStreamReader();
                document = reader.Read(File.OpenRead(path), out diagnostic);
            }

            return(FromDocument(document, settings));
        }
Esempio n. 26
0
    private void ReadJson(string[] args)
    {
        string inputPath = args[0];

        if (!Path.IsPathRooted(inputPath))
        {
            Console.WriteLine("The file path you entered does not have a root");
            return;
        }

        OpenApiStreamReader reader = new OpenApiStreamReader();
        var diagnostic             = new OpenApiDiagnostic();

        try
        {
            string          path        = Path.GetFullPath(inputPath);
            Stream          stream      = File.OpenRead(path);
            OpenApiDocument newDocument = reader.Read(stream, out diagnostic);
        }
        catch (FileNotFoundException e)
        {
            Console.WriteLine("Check to make sure you entered a correct file path because the file was not found.");
            Console.Error.WriteLine(e.Message);
            return;
        }
        catch (Exception e)
        {
            Console.WriteLine("Check the file path you entered for errors.");
            Console.Error.WriteLine(e.Message);
            return;
        }

        if (diagnostic.Errors.Count == 0)
        {
            Console.WriteLine("Read File Successfully");
        }
        else
        {
            foreach (OpenApiError error in diagnostic.Errors)
            {
                Console.WriteLine($"There was an error reading in the file at {error.Pointer}");
                Console.Error.WriteLine(error.Message);
            }
        }
    }
Esempio n. 27
0
        public static void Main()
        {
            SetWorkingDirectoryToProjectRoot();
            Handlebars.Configuration.TextEncoder = new PassthroughEncoder();
            OpenApiDocument document;

            Console.WriteLine("Loading OpenApi YAML");
            using (var stream = File.OpenRead("openapi.yml"))
            {
                var reader = new OpenApiStreamReader();
                document = reader.Read(stream, out _);
            }

            var templatesPath = Path.Combine("src", "Scryfall.OpenApi.Codegen");
            var outputPath    = Path.Combine("src", "Scryfall.Api");

            new CodeRenderer(document, templatesPath, outputPath).Render();
        }
        internal static async Task <OpenApiUrlTreeNode> GetTreeNode(string url)
        {
            Stream stream;

            if (url.StartsWith("http", StringComparison.OrdinalIgnoreCase))
            {
                using var httpClient = new HttpClient();
                stream = await httpClient.GetStreamAsync(url);
            }
            else
            {
                stream = File.OpenRead(url);
            }
            var reader = new OpenApiStreamReader();
            var doc    = reader.Read(stream, out var diags);
            await stream.DisposeAsync();

            return(OpenApiUrlTreeNode.Create(doc, "default"));
        }
Esempio n. 29
0
        public static async Task <OpenApiDocument> HandleOpenApiDocumentResponseAsync(HttpResponseMessage response)
        {
            // What should the failure modes of this method be?

            if (response.IsSuccessStatusCode)
            {
                var openApiStream = await response.Content.ReadAsStreamAsync();

                var reader = new OpenApiStreamReader();
                var doc    = reader.Read(openApiStream, out var diag);
                // how do we handle diag errors
                // catch exceptions
                return(doc);
            }
            else
            {
                throw new Exception("Request failed");
            }
        }
Esempio n. 30
0
        private static List <OpenApiDocumentContainer> GetAllApiDocuments(DirectoryInfo specificationPath)
        {
            if (specificationPath == null)
            {
                throw new ArgumentNullException(nameof(specificationPath));
            }

            var result   = new List <OpenApiDocumentContainer>();
            var docFiles = Directory.GetFiles(specificationPath.FullName, "*.yaml", SearchOption.AllDirectories);

            if (docFiles.Length == 0)
            {
                docFiles = Directory.GetFiles(specificationPath.FullName, "*.json", SearchOption.AllDirectories);
            }

            foreach (var docFile in docFiles)
            {
                var text = File.ReadAllText(docFile);
                try
                {
                    var openApiStreamReader = new OpenApiStreamReader();
                    var document            = openApiStreamReader.Read(File.OpenRead(docFile), out var diagnostic);
                    result.Add(
                        new OpenApiDocumentContainer(
                            new FileInfo(docFile),
                            text,
                            document,
                            diagnostic));
                }
                catch (Exception ex)
                {
                    result.Add(
                        new OpenApiDocumentContainer(
                            new FileInfo(docFile),
                            text,
                            ex));
                }
            }

            return(result);
        }