Skip to content

Commit e444bf9

Browse files
authored
Format json edge case (#23265)
1 parent a3e79c8 commit e444bf9

3 files changed

Lines changed: 75 additions & 2 deletions

File tree

modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PostmanCollectionCodegen.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33

44
import com.fasterxml.jackson.core.JsonProcessingException;
5+
import com.fasterxml.jackson.core.io.JsonStringEncoder;
56
import com.fasterxml.jackson.databind.JsonNode;
67
import com.fasterxml.jackson.databind.ObjectMapper;
78
import com.fasterxml.jackson.databind.node.ObjectNode;
@@ -332,8 +333,8 @@ public void addToMap(CodegenOperation codegenOperation) {
332333
}
333334
}
334335

335-
tagName = formatDescription(tagName);
336-
tagDescription = formatDescription(tagDescription);
336+
tagName = escapeJsonString(tagName);
337+
tagDescription = escapeJsonString(tagDescription);
337338

338339
PostmanRequestFolder folder = new PostmanRequestFolder(tagName, tagDescription);
339340
List<CodegenOperation> list = codegenOperationsByTag.get(folder);
@@ -685,6 +686,13 @@ public String formatDescription(String description) {
685686
return description;
686687
}
687688

689+
String escapeJsonString(String value) {
690+
if (value == null) {
691+
return null;
692+
}
693+
return new String(JsonStringEncoder.getInstance().quoteAsString(value));
694+
}
695+
688696
/**
689697
* Extract all placeholders (string delimited by curly braces ie {{PLACEHOLDER}}) from the input string
690698
*

modules/openapi-generator/src/test/java/org/openapitools/codegen/postman/PostmanCollectionCodegenTest.java

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,38 @@ public void testTagDescriptionIsJsonEscaped() throws IOException {
150150
assertEquals("Basic \"quoted\" tag\nsecond line", basicFolder.get("description").asText());
151151
}
152152

153+
@Test
154+
public void testTagDescriptionControlCharsAreJsonEscaped() throws IOException {
155+
File output = Files.createTempDirectory("postmantest_").toFile();
156+
output.deleteOnExit();
157+
158+
final CodegenConfigurator configurator = new CodegenConfigurator()
159+
.setGeneratorName("postman-collection")
160+
.setInputSpec("src/test/resources/3_0/postman-collection/TagDescriptionControlCharsEscaping.yaml")
161+
.setOutputDir(output.getAbsolutePath().replace("\\", "/"));
162+
163+
final ClientOptInput clientOptInput = configurator.toClientOptInput();
164+
DefaultGenerator generator = new DefaultGenerator();
165+
List<File> files = generator.opts(clientOptInput).generate();
166+
167+
files.forEach(File::deleteOnExit);
168+
169+
ObjectMapper objectMapper = new ObjectMapper();
170+
JsonNode root = objectMapper.readTree(new File(output + "/postman.json"));
171+
JsonNode folders = root.get("item");
172+
173+
JsonNode basicFolder = null;
174+
for (JsonNode folder : folders) {
175+
if ("basic".equals(folder.get("name").asText())) {
176+
basicFolder = folder;
177+
break;
178+
}
179+
}
180+
181+
assertNotNull(basicFolder);
182+
assertEquals("desc with \\t tab, \\b backspace, \\f formfeed, \\r carriage-return, \\n line", basicFolder.get("description").asText());
183+
}
184+
153185
@Test
154186
public void testValidatePostmanJson() throws IOException {
155187

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
openapi: 3.0.0
2+
info:
3+
title: Tag Description Control Chars Escaping
4+
version: '1.0'
5+
servers:
6+
- url: 'http://localhost:5001'
7+
paths:
8+
'/users/{userId}':
9+
get:
10+
summary: Get User
11+
operationId: get-users-userId
12+
tags:
13+
- basic
14+
parameters:
15+
- description: Unique identifier of the user
16+
name: userId
17+
in: path
18+
required: true
19+
schema:
20+
type: string
21+
responses:
22+
'200':
23+
description: User Found
24+
content:
25+
application/json:
26+
schema:
27+
type: object
28+
properties:
29+
id:
30+
type: integer
31+
tags:
32+
- name: basic
33+
description: "desc with \\t tab, \\b backspace, \\f formfeed, \\r carriage-return, \\n line"

0 commit comments

Comments
 (0)