diff --git a/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/OpenAPIV3Parser.java b/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/OpenAPIV3Parser.java index a00ea9f2cc..e07b963f9e 100644 --- a/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/OpenAPIV3Parser.java +++ b/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/OpenAPIV3Parser.java @@ -15,6 +15,7 @@ import io.swagger.v3.parser.util.OpenAPIDeserializer; import io.swagger.v3.parser.util.RemoteUrl; import io.swagger.v3.parser.util.ResolverFully; +import java.io.InputStream; import java.net.URI; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; @@ -28,6 +29,7 @@ import java.util.ServiceLoader; import javax.net.ssl.SSLHandshakeException; import org.apache.commons.io.FileUtils; +import org.apache.commons.io.IOUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -227,6 +229,9 @@ private String readContentFromLocation(String location, List try { if (adjustedLocation.toLowerCase().startsWith("http")) { return RemoteUrl.urlToString(adjustedLocation, auth); + } else if (adjustedLocation.toLowerCase().startsWith("jar:")) { + final InputStream in = new URI(adjustedLocation).toURL().openStream(); + return IOUtils.toString(in, encoding); } else { final String fileScheme = "file:"; final Path path = adjustedLocation.toLowerCase().startsWith(fileScheme) ? diff --git a/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/ResolverCache.java b/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/ResolverCache.java index e40db066fc..6ac132ba34 100644 --- a/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/ResolverCache.java +++ b/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/ResolverCache.java @@ -70,7 +70,7 @@ public ResolverCache(OpenAPI openApi, List auths, String par this.rootPath = parentFileLocation; if(parentFileLocation != null) { - if(parentFileLocation.startsWith("http")) { + if(parentFileLocation.startsWith("http") || parentFileLocation.startsWith("jar")) { parentDirectory = null; } else { parentDirectory = PathUtils.getParentDirectoryOfFile(parentFileLocation); diff --git a/modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/test/OpenAPIV3ParserTest.java b/modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/test/OpenAPIV3ParserTest.java index bbff35846b..c412996cd1 100644 --- a/modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/test/OpenAPIV3ParserTest.java +++ b/modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/test/OpenAPIV3ParserTest.java @@ -21,6 +21,7 @@ import java.io.IOException; import java.math.BigDecimal; import java.net.HttpURLConnection; +import java.net.URL; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.HashSet; @@ -2967,6 +2968,17 @@ public void testIssue1540() throws Exception{ Assert.assertEquals((String)testPutExtensions.get("x-order"),"2147483647"); } + @Test + public void testIssue1592() throws Exception { + File file = new File("src/test/resources/issue-1592.jar"); + URL url = new URL("jar:" + file.toURI() + "!/test.yaml"); + ParseOptions options = new ParseOptions(); + options.setResolve(true); + SwaggerParseResult result = new OpenAPIV3Parser().readLocation(url.toString(), null, options); + OpenAPI openAPI = result.getOpenAPI(); + assertNotNull(openAPI); + } + @Test public void testNullExample() throws Exception{ String yamlString = FileUtils.readFileToString(new File("src/test/resources/null-full-example.yaml"), "UTF-8"); diff --git a/modules/swagger-parser-v3/src/test/resources/issue-1592.jar b/modules/swagger-parser-v3/src/test/resources/issue-1592.jar new file mode 100644 index 0000000000..3bf65fae1f Binary files /dev/null and b/modules/swagger-parser-v3/src/test/resources/issue-1592.jar differ