From b3835a0492cbc76812915f10e07938cf6131da8a Mon Sep 17 00:00:00 2001 From: frantuma Date: Sat, 1 Sep 2018 16:20:11 +0200 Subject: [PATCH] refs #822 - decode properly refs --- .../java/io/swagger/parser/ResolverCache.java | 8 ++++ .../io/swagger/parser/FileReferenceTest.java | 16 ++++++++ .../src/test/resources/issue-enc-b.yaml | 37 +++++++++++++++++++ .../src/test/resources/issue-enc.yaml | 20 ++++++++++ 4 files changed, 81 insertions(+) create mode 100644 modules/swagger-parser/src/test/resources/issue-enc-b.yaml create mode 100644 modules/swagger-parser/src/test/resources/issue-enc.yaml diff --git a/modules/swagger-parser/src/main/java/io/swagger/parser/ResolverCache.java b/modules/swagger-parser/src/main/java/io/swagger/parser/ResolverCache.java index 10d9528f43..fc4dab93c5 100644 --- a/modules/swagger-parser/src/main/java/io/swagger/parser/ResolverCache.java +++ b/modules/swagger-parser/src/main/java/io/swagger/parser/ResolverCache.java @@ -19,6 +19,8 @@ import org.apache.commons.lang3.StringUtils; import java.io.File; +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; import java.nio.file.Path; import java.util.Collections; import java.util.HashMap; @@ -214,6 +216,12 @@ protected String merge(String host, String ref) { } private String unescapePointer(String jsonPathElement) { + // URL decode the fragment + try { + jsonPathElement = URLDecoder.decode(jsonPathElement, "UTF-8"); + } catch (UnsupportedEncodingException e) { + // + } // Unescape the JSON Pointer segment using the algorithm described in RFC 6901, section 4: // https://tools.ietf.org/html/rfc6901#section-4 // First transform any occurrence of the sequence '~1' to '/' diff --git a/modules/swagger-parser/src/test/java/io/swagger/parser/FileReferenceTest.java b/modules/swagger-parser/src/test/java/io/swagger/parser/FileReferenceTest.java index e17468d436..c7607bbf8f 100644 --- a/modules/swagger-parser/src/test/java/io/swagger/parser/FileReferenceTest.java +++ b/modules/swagger-parser/src/test/java/io/swagger/parser/FileReferenceTest.java @@ -139,6 +139,22 @@ public void testIssue289() { assertNotNull(swagger.getPath("/foo").getGet()); } + @Test + public void testIssue822() { + SwaggerDeserializationResult result = new SwaggerParser().readWithInfo("./src/test/resources/issue-enc.yaml", null, true); + assertNotNull(result.getSwagger()); + + Swagger swagger = result.getSwagger(); + + assertNotNull(swagger.getPath("/foo").getGet()); + assertNotNull(swagger.getPath("/bar/wtf").getGet()); + assertNull(swagger.getPath("/bar/haha").getGet()); + assertNotNull(swagger.getPath("/wtf/{bar}").getGet()); + assertNotNull(swagger.getPath("/haha/{bar}").getGet()); + assertNull(swagger.getPath("/haha2/{bar}").getGet()); + + } + @Test public void testIssue336() { SwaggerDeserializationResult result = new SwaggerParser().readWithInfo("./src/test/resources/nested-file-references/issue-336.json", null, true); diff --git a/modules/swagger-parser/src/test/resources/issue-enc-b.yaml b/modules/swagger-parser/src/test/resources/issue-enc-b.yaml new file mode 100644 index 0000000000..33a07aa5a6 --- /dev/null +++ b/modules/swagger-parser/src/test/resources/issue-enc-b.yaml @@ -0,0 +1,37 @@ +swagger: "2.0" + +info: + version: 1.0.0 + title: Path include test case child + +paths: + /foo: + get: + responses: + 200: + description: "Request successful" + /bar/wtf: + get: + responses: + 200: + description: "Request successful" + /bar/haha: + get: + responses: + 200: + description: "Request successful" + /wtf/{bar}: + get: + responses: + 200: + description: "Request successful" + /haha/{bar}: + get: + responses: + 200: + description: "Request successful" + /haha2/{bar}: + get: + responses: + 200: + description: "Request successful" diff --git a/modules/swagger-parser/src/test/resources/issue-enc.yaml b/modules/swagger-parser/src/test/resources/issue-enc.yaml new file mode 100644 index 0000000000..40f5aa2607 --- /dev/null +++ b/modules/swagger-parser/src/test/resources/issue-enc.yaml @@ -0,0 +1,20 @@ +swagger: "2.0" + +info: + version: 1.0.0 + title: Path include test case + +paths: + /foo: + $ref: './issue-enc-b.yaml#/paths/~1foo' + /wtf/{bar}: + $ref: './issue-enc-b.yaml#/paths/~1wtf~1%7Bbar%7D' + /bar/wtf: + $ref: './issue-enc-b.yaml#/paths/~1bar~1wtf' + /haha/{bar}: + $ref: './issue-enc-b.yaml#/paths/~1haha~1{bar}' + /haha2/{bar}: + $ref: './issue-enc-b.yaml#/paths/~1haha/{bar}' + /bar/haha: + $ref: './issue-enc-b.yaml#/paths/bar/haha' +