From 9cbbec90b85073d95abd6d50ff80763b24030009 Mon Sep 17 00:00:00 2001 From: gracekarina Date: Sat, 1 Aug 2020 17:56:39 -0500 Subject: [PATCH] fix for issue invalid remote server url --- .../v3/parser/util/OpenAPIDeserializer.java | 24 +++++++++++-------- .../v3/parser/test/RelativeReferenceTest.java | 24 +++++++++++++++++++ 2 files changed, 38 insertions(+), 10 deletions(-) diff --git a/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/util/OpenAPIDeserializer.java b/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/util/OpenAPIDeserializer.java index 87834e1f89..ce1147bfcc 100644 --- a/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/util/OpenAPIDeserializer.java +++ b/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/util/OpenAPIDeserializer.java @@ -406,6 +406,14 @@ public Server getServer(ObjectNode obj, String location, ParseResult result, Str Server server = new Server(); + if (obj.get("variables") != null) { + ObjectNode variables = getObject("variables", obj, false, location, result); + ServerVariables serverVariables = getServerVariables(variables, String.format("%s.%s", location, "variables"), result); + if (serverVariables != null && serverVariables.size() > 0) { + server.setVariables(serverVariables); + } + } + String value = getString("url", obj, true, location, result); if(StringUtils.isNotBlank(value)) { if(!isValidURL(value) && path != null){ @@ -415,9 +423,13 @@ public Server getServer(ObjectNode obj, String location, ParseResult result, Str value = absURI.resolve(new URI(value)).toString(); } } catch (URISyntaxException e) { - result.warning(location,"invalid url : "+value); + String variable = value.substring(value.indexOf("{")+1,value.indexOf("}")); + if (server.getVariables() != null) { + if (!server.getVariables().containsKey(variable)) { + result.warning(location, "invalid url : " + value); + } + } } - } server.setUrl(value); } @@ -426,14 +438,6 @@ public Server getServer(ObjectNode obj, String location, ParseResult result, Str if(StringUtils.isNotBlank(value)) { server.setDescription(value); } - if (obj.get("variables") != null) { - ObjectNode variables = getObject("variables", obj, false, location, result); - ServerVariables serverVariables = getServerVariables(variables, String.format("%s.%s", location, "variables"), result); - if (serverVariables != null && serverVariables.size() > 0) { - server.setVariables(serverVariables); - } - } - Map extensions = getExtensions(obj); if(extensions != null && extensions.size() > 0) { diff --git a/modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/test/RelativeReferenceTest.java b/modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/test/RelativeReferenceTest.java index 2f1a8c860f..bbddf20413 100644 --- a/modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/test/RelativeReferenceTest.java +++ b/modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/test/RelativeReferenceTest.java @@ -7,6 +7,8 @@ import io.swagger.v3.oas.models.parameters.RequestBody; import io.swagger.v3.parser.OpenAPIV3Parser; import io.swagger.v3.parser.core.models.AuthorizationValue; +import io.swagger.v3.parser.core.models.ParseOptions; +import io.swagger.v3.parser.core.models.SwaggerParseResult; import io.swagger.v3.parser.util.RemoteUrl; import mockit.Expectations; import mockit.Mocked; @@ -15,6 +17,7 @@ import java.util.Arrays; import static org.testng.Assert.assertNotNull; +import static org.testng.Assert.assertTrue; public class RelativeReferenceTest { @@ -25,6 +28,14 @@ public class RelativeReferenceTest { "openapi: 3.0.0\n" + "servers:\n" + " - url: /\n" + + " - url: https://localhost:8080/{version}\n" + + " description: The local server\n" + + " variables:\n" + + " version:\n" + + " default: v2\n" + + " enum:\n" + + " - v1\n" + + " - v2\n"+ "info:\n" + " description: It works.\n" + " version: 1.0.0\n" + @@ -44,6 +55,19 @@ public class RelativeReferenceTest { " type: object\n" + " required: true"; + @Test + public void testIssueServerUrlValidation() throws Exception { + new Expectations() {{ + RemoteUrl.urlToString("http://foo.bar.com/swagger.json", Arrays.asList(new AuthorizationValue[]{})); + times = 1; + result = spec; + }}; + + SwaggerParseResult swaggerParseResult = new OpenAPIV3Parser().readLocation("http://foo.bar.com/swagger.json", null, new ParseOptions()); + assertNotNull(swaggerParseResult.getOpenAPI()); + assertTrue(swaggerParseResult.getMessages().isEmpty()); + } + @Test public void testIssue213() throws Exception { new Expectations() {{