Skip to content

Commit 82ad061

Browse files
authored
[go] Fix text escaping in example code generation (#22841)
Wrap example values with escapeText() to properly escape special characters in generated Go client code examples Signed-off-by: Julien Pivotto <291750+roidelapluie@users.noreply.github.com>
1 parent 063a780 commit 82ad061

3 files changed

Lines changed: 79 additions & 4 deletions

File tree

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -608,7 +608,7 @@ private String constructExampleCode(CodegenParameter codegenParameter, HashMap<S
608608
} else if (codegenParameter.isPrimitiveType) { // primitive type
609609
if (codegenParameter.isString) {
610610
if (!StringUtils.isEmpty(codegenParameter.example) && !"null".equals(codegenParameter.example)) {
611-
return "\"" + codegenParameter.example + "\"";
611+
return "\"" + escapeText(codegenParameter.example) + "\"";
612612
} else {
613613
return "\"" + codegenParameter.paramName + "_example\"";
614614
}
@@ -640,7 +640,7 @@ private String constructExampleCode(CodegenParameter codegenParameter, HashMap<S
640640
return constructExampleCode(modelMaps.get(codegenParameter.dataType), modelMaps, processedModelMap, 0);
641641
} else if (codegenParameter.isEmail) { // email
642642
if (!StringUtils.isEmpty(codegenParameter.example) && !"null".equals(codegenParameter.example)) {
643-
return "\"" + codegenParameter.example + "\"";
643+
return "\"" + escapeText(codegenParameter.example) + "\"";
644644
} else {
645645
return "\"" + codegenParameter.paramName + "@example.com\"";
646646
}
@@ -681,7 +681,7 @@ private String constructExampleCode(CodegenProperty codegenProperty, HashMap<Str
681681
} else if (codegenProperty.isPrimitiveType) { // primitive type
682682
if (codegenProperty.isString) {
683683
if (!StringUtils.isEmpty(codegenProperty.example) && !"null".equals(codegenProperty.example)) {
684-
return "\"" + codegenProperty.example + "\"";
684+
return "\"" + escapeText(codegenProperty.example) + "\"";
685685
} else {
686686
return "\"" + codegenProperty.name + "_example\"";
687687
}
@@ -714,7 +714,7 @@ private String constructExampleCode(CodegenProperty codegenProperty, HashMap<Str
714714
return constructExampleCode(modelMaps.get(codegenProperty.dataType), modelMaps, processedModelMap, depth + 1);
715715
} else if (codegenProperty.isEmail) { // email
716716
if (!StringUtils.isEmpty(codegenProperty.example) && !"null".equals(codegenProperty.example)) {
717-
return "\"" + codegenProperty.example + "\"";
717+
return "\"" + escapeText(codegenProperty.example) + "\"";
718718
} else {
719719
return "\"" + codegenProperty.name + "@example.com\"";
720720
}

modules/openapi-generator/src/test/java/org/openapitools/codegen/go/GoClientCodegenTest.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -461,4 +461,27 @@ public void testArrayDefaultValue() throws IOException {
461461
TestUtils.assertFileContains(apiPath, defaultEnumArrayString);
462462
TestUtils.assertFileContains(apiPath, defaultValueString);
463463
}
464+
465+
@Test
466+
public void testEscapingInExamples() throws IOException {
467+
File output = Files.createTempDirectory("test").toFile();
468+
output.deleteOnExit();
469+
470+
final CodegenConfigurator configurator = new CodegenConfigurator()
471+
.setGeneratorName("go")
472+
.setInputSpec("src/test/resources/3_0/go/petstore-with-special-chars-in-examples.yaml")
473+
.setOutputDir(output.getAbsolutePath().replace("\\", "/"));
474+
475+
DefaultGenerator generator = new DefaultGenerator();
476+
List<File> files = generator.opts(configurator.toClientOptInput()).generate();
477+
files.forEach(File::deleteOnExit);
478+
479+
Path docPath = Paths.get(output + "/docs/TestAPI.md");
480+
// Verify that quotes are properly escaped in parameter examples
481+
TestUtils.assertFileContains(docPath, "stringWithQuotes := \"John \\\"Johnny\\\" Doe\"");
482+
// Verify that backslashes are properly escaped in parameter examples
483+
TestUtils.assertFileContains(docPath, "stringWithBackslash := \"C:\\\\path\\\\to\\\\file\"");
484+
// Verify that quotes are properly escaped in email parameter examples
485+
TestUtils.assertFileContains(docPath, "emailWithQuotes := \"test\\\"user@example.com\"");
486+
}
464487
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
openapi: 3.0.0
2+
info:
3+
title: Test Escaping in Examples
4+
version: 1.0.0
5+
paths:
6+
/test:
7+
get:
8+
operationId: testEscaping
9+
tags:
10+
- test
11+
parameters:
12+
- name: stringWithQuotes
13+
in: query
14+
required: true
15+
schema:
16+
type: string
17+
example: 'John "Johnny" Doe'
18+
- name: stringWithBackslash
19+
in: query
20+
required: true
21+
schema:
22+
type: string
23+
example: 'C:\path\to\file'
24+
- name: emailWithQuotes
25+
in: query
26+
required: true
27+
schema:
28+
type: string
29+
format: email
30+
example: 'test"user@example.com'
31+
responses:
32+
'200':
33+
description: Success
34+
content:
35+
application/json:
36+
schema:
37+
$ref: '#/components/schemas/TestResponse'
38+
components:
39+
schemas:
40+
TestResponse:
41+
type: object
42+
properties:
43+
name:
44+
type: string
45+
example: 'Name with "quotes" inside'
46+
path:
47+
type: string
48+
example: 'C:\Windows\System32'
49+
email:
50+
type: string
51+
format: email
52+
example: 'user"name@example.com'

0 commit comments

Comments
 (0)