Skip to content

Commit 138687c

Browse files
gracekarinafrantuma
andcommitted
fix for issue-1865 - dereferencing files with dots
Co-authored-by: gracekarina <[email protected]> Co-authored-by: frantuma <[email protected]>
1 parent b63dd8f commit 138687c

File tree

10 files changed

+81
-25
lines changed

10 files changed

+81
-25
lines changed

modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/util/RefUtils.java

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import java.net.URL;
1515
import java.nio.file.Files;
1616
import java.nio.file.Path;
17+
import java.util.Arrays;
1718
import java.util.List;
1819
import java.util.Optional;
1920

@@ -47,10 +48,13 @@ public static String computeDefinitionName(String ref) {
4748
plausibleName = filePathElements[filePathElements.length - 1];
4849

4950
final String[] split = plausibleName.split("\\.");
50-
// Fix for issue-1621
51-
plausibleName = split[0];
52-
for (int i = 1; i < split.length - 1; i++) {
53-
plausibleName += "." + split[i];
51+
// Fix for issue-1621 and issue-1865
52+
//validate number of dots
53+
if(split.length > 2) {
54+
//Remove dot so ref can be interpreted as internal and relative in Swagger-Core schema class 'set$ref'
55+
plausibleName = String.join("", Arrays.copyOf(split, split.length - 1));
56+
}else{
57+
plausibleName = split[0];
5458
}
5559
}
5660

@@ -225,4 +229,4 @@ private static String readAll(Path path) throws IOException {
225229
return IOUtils.toString(inputStream, UTF_8);
226230
}
227231
}
228-
}
232+
}

modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/test/OpenAPIV3ParserTest.java

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,36 @@ public class OpenAPIV3ParserTest {
8686
protected int serverPort = getDynamicPort();
8787
protected WireMockServer wireMockServer;
8888

89+
@Test
90+
public void testIssue1621() {
91+
final ParseOptions parseOptions = new ParseOptions();
92+
parseOptions.setResolve(true);
93+
parseOptions.setResolveFully(true);
94+
parseOptions.setResolveCombinators(false);
95+
SwaggerParseResult parseResult = new OpenAPIV3Parser().readLocation("issue-1621/example.openapi.yaml", null, parseOptions);
96+
assertEquals(0, parseResult.getMessages().size());
97+
OpenAPI api = parseResult.getOpenAPI();
98+
assertEquals( api.getPaths()
99+
.get("/example")
100+
.getPost()
101+
.getRequestBody()
102+
.getContent()
103+
.get("application/json")
104+
.getSchema()
105+
.getTitle(),"POST Example");
106+
}
107+
108+
@Test
109+
public void testIssue1865() throws Exception {
110+
ParseOptions options = new ParseOptions();
111+
options.setResolve(true);
112+
SwaggerParseResult result = new OpenAPIV3Parser().readLocation("src/test/resources/issue-1865/openapi30.yaml", null, options);
113+
114+
Assert.assertNotNull(result);
115+
Assert.assertNotNull(result.getOpenAPI());
116+
Assert.assertEquals(result.getOpenAPI().getComponents().getSchemas().get("Foo").get$ref(), "#/components/schemas/foomodel");
117+
}
118+
89119
@Test
90120
public void testIssue1777() {
91121
OpenAPIV3Parser openApiParser = new OpenAPIV3Parser();
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
#broken-ref/apis/foo.yaml
2+
openapi: 3.0.0
3+
info:
4+
title: swagger parser bug, worked until 2.0.28 but not since 2.0.29
5+
version: '1.0'
6+
7+
paths:
8+
9+
'/foo':
10+
post:
11+
summary: create foo
12+
description: Create a new foo.
13+
responses:
14+
'200':
15+
description: a Foo
16+
content:
17+
application/json:
18+
schema:
19+
$ref: '#/components/schemas/Foo'
20+
21+
components:
22+
schemas:
23+
Foo:
24+
$ref: ../models/foo.model.yaml
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# broken-ref/examples/foo.example.yaml
2+
value:
3+
foo: bar
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
#broken-ref/models/foo.model.yaml
2+
title: Foo
3+
type: object
4+
properties:
5+
foo:
6+
type: string
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
# broken-ref/openapi30.yaml
2+
openapi: 3.0.3
3+
info:
4+
title: ref chain
5+
version: '1'
6+
7+
paths:
8+
/foo:
9+
$ref: ./apis/foo.yaml#/paths/~1foo

modules/swagger-parser/src/test/java/io/swagger/parser/OpenAPIParserTest.java

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -65,26 +65,6 @@ public void testIssue1143(){
6565
assertNotNull(result.getOpenAPI().getComponents().getSchemas().get("identificacion_usuario_aplicacion"));
6666
}
6767

68-
@Test
69-
public void testIssue1621() {
70-
final ParseOptions parseOptions = new ParseOptions();
71-
parseOptions.setResolve(true);
72-
parseOptions.setResolveFully(true);
73-
parseOptions.setResolveCombinators(false);
74-
OpenAPIParser openAPIParser = new OpenAPIParser();
75-
SwaggerParseResult swaggerParseResult = openAPIParser.readLocation("issue-1621/example.openapi.yaml", null, parseOptions);
76-
assertEquals(0, swaggerParseResult.getMessages().size());
77-
OpenAPI api = swaggerParseResult.getOpenAPI();
78-
assertEquals("POST Example", api.getPaths()
79-
.get("/example")
80-
.getPost()
81-
.getRequestBody()
82-
.getContent()
83-
.get("application/json")
84-
.getSchema()
85-
.getTitle());
86-
}
87-
8868
@Test
8969
public void testIssue749() {
9070
ParseOptions options = new ParseOptions();

0 commit comments

Comments
 (0)