Skip to content

Commit 1610ef6

Browse files
fix(java): handle JSON headers in dynamic operations
1 parent 3b339cb commit 1610ef6

19 files changed

Lines changed: 261 additions & 36 deletions

File tree

‎modules/openapi-generator/src/main/resources/Java/libraries/okhttp-gson/ApiClient.mustache‎

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -920,9 +920,20 @@ public class ApiClient {
920920
*/
921921
public String parameterToJsonString(Object param) {
922922
String json = JSON.serialize(param);
923-
StringBuilder escaped = new StringBuilder(json.length());
924-
923+
int firstUnsafe = -1;
925924
for (int i = 0; i < json.length(); i++) {
925+
if (json.charAt(i) >= 0x7f) {
926+
firstUnsafe = i;
927+
break;
928+
}
929+
}
930+
if (firstUnsafe == -1) {
931+
return json;
932+
}
933+
934+
StringBuilder escaped = new StringBuilder(json.length());
935+
escaped.append(json, 0, firstUnsafe);
936+
for (int i = firstUnsafe; i < json.length(); i++) {
926937
char c = json.charAt(i);
927938
if (c >= 0x7f) {
928939
escaped.append("\\u");
@@ -1980,7 +1991,11 @@ public class ApiClient {
19801991
}
19811992
break;
19821993
case "header":
1983-
headerParams.put(param.getName(), parameterToString(value));
1994+
if (param.getContent() != null && param.getContent().containsKey("application/json")) {
1995+
headerParams.put(param.getName(), parameterToJsonString(value));
1996+
} else {
1997+
headerParams.put(param.getName(), parameterToString(value));
1998+
}
19841999
break;
19852000
case "cookie":
19862001
cookieParams.put(param.getName(), parameterToString(value));

‎modules/openapi-generator/src/test/java/org/openapitools/codegen/java/JavaClientCodegenTest.java‎

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -615,6 +615,32 @@ public void testJsonContentHeaderUsesJsonSerialization() {
615615
);
616616
}
617617

618+
@Test
619+
public void testDynamicJsonContentHeaderUsesJsonSerialization() {
620+
final Path output = newTempFolder();
621+
final CodegenConfigurator configurator = new CodegenConfigurator()
622+
.setGeneratorName(JAVA_GENERATOR)
623+
.setLibrary(JavaClientCodegen.OKHTTP_GSON)
624+
.setInputSpec("src/test/resources/3_1/java/json-header-content.yaml")
625+
.addAdditionalProperty("dynamicOperations", true)
626+
.setOutputDir(output.toString().replace("\\", "/"));
627+
628+
List<File> files = new DefaultGenerator().opts(configurator.toClientOptInput()).generate();
629+
630+
validateJavaSourceFiles(files);
631+
632+
assertThat(output.resolve("src/main/java/org/openapitools/client/ApiClient.java"))
633+
.content()
634+
.contains("if (param.getContent() != null && param.getContent().containsKey(\"application/json\")) {")
635+
.contains("headerParams.put(param.getName(), parameterToJsonString(value));")
636+
.contains("headerParams.put(param.getName(), parameterToString(value));");
637+
638+
assertThat(output.resolve("src/main/java/org/openapitools/client/api/DefaultApi.java"))
639+
.content()
640+
.contains("paramMap.put(\"X-Json-Arg\", xJsonArg);")
641+
.contains("paramMap.put(\"X-Plain-Arg\", xPlainArg);");
642+
}
643+
618644
@Test
619645
public void testGeneratePingSomeObj() {
620646
final Path output = newTempFolder();

‎modules/openapi-generator/src/test/resources/3_1/java/json-header-content.yaml‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,10 @@ paths:
1616
application/json:
1717
schema:
1818
$ref: '#/components/schemas/HeaderArg'
19+
- name: X-Plain-Arg
20+
in: header
21+
schema:
22+
type: string
1923
responses:
2024
'204':
2125
description: OK

‎samples/client/echo_api/java/okhttp-gson-user-defined-templates/src/main/java/org/openapitools/client/ApiClient.java‎

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -801,9 +801,20 @@ public String parameterToString(Object param) {
801801
*/
802802
public String parameterToJsonString(Object param) {
803803
String json = JSON.serialize(param);
804-
StringBuilder escaped = new StringBuilder(json.length());
805-
804+
int firstUnsafe = -1;
806805
for (int i = 0; i < json.length(); i++) {
806+
if (json.charAt(i) >= 0x7f) {
807+
firstUnsafe = i;
808+
break;
809+
}
810+
}
811+
if (firstUnsafe == -1) {
812+
return json;
813+
}
814+
815+
StringBuilder escaped = new StringBuilder(json.length());
816+
escaped.append(json, 0, firstUnsafe);
817+
for (int i = firstUnsafe; i < json.length(); i++) {
807818
char c = json.charAt(i);
808819
if (c >= 0x7f) {
809820
escaped.append("\\u");

‎samples/client/echo_api/java/okhttp-gson/src/main/java/org/openapitools/client/ApiClient.java‎

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -731,9 +731,20 @@ public String parameterToString(Object param) {
731731
*/
732732
public String parameterToJsonString(Object param) {
733733
String json = JSON.serialize(param);
734-
StringBuilder escaped = new StringBuilder(json.length());
735-
734+
int firstUnsafe = -1;
736735
for (int i = 0; i < json.length(); i++) {
736+
if (json.charAt(i) >= 0x7f) {
737+
firstUnsafe = i;
738+
break;
739+
}
740+
}
741+
if (firstUnsafe == -1) {
742+
return json;
743+
}
744+
745+
StringBuilder escaped = new StringBuilder(json.length());
746+
escaped.append(json, 0, firstUnsafe);
747+
for (int i = firstUnsafe; i < json.length(); i++) {
737748
char c = json.charAt(i);
738749
if (c >= 0x7f) {
739750
escaped.append("\\u");

‎samples/client/others/java/okhttp-gson-oneOf-array/src/main/java/org/openapitools/client/ApiClient.java‎

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -705,9 +705,20 @@ public String parameterToString(Object param) {
705705
*/
706706
public String parameterToJsonString(Object param) {
707707
String json = JSON.serialize(param);
708-
StringBuilder escaped = new StringBuilder(json.length());
709-
708+
int firstUnsafe = -1;
710709
for (int i = 0; i < json.length(); i++) {
710+
if (json.charAt(i) >= 0x7f) {
711+
firstUnsafe = i;
712+
break;
713+
}
714+
}
715+
if (firstUnsafe == -1) {
716+
return json;
717+
}
718+
719+
StringBuilder escaped = new StringBuilder(json.length());
720+
escaped.append(json, 0, firstUnsafe);
721+
for (int i = firstUnsafe; i < json.length(); i++) {
711722
char c = json.charAt(i);
712723
if (c >= 0x7f) {
713724
escaped.append("\\u");

‎samples/client/others/java/okhttp-gson-oneOf/src/main/java/org/openapitools/client/ApiClient.java‎

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -705,9 +705,20 @@ public String parameterToString(Object param) {
705705
*/
706706
public String parameterToJsonString(Object param) {
707707
String json = JSON.serialize(param);
708-
StringBuilder escaped = new StringBuilder(json.length());
709-
708+
int firstUnsafe = -1;
710709
for (int i = 0; i < json.length(); i++) {
710+
if (json.charAt(i) >= 0x7f) {
711+
firstUnsafe = i;
712+
break;
713+
}
714+
}
715+
if (firstUnsafe == -1) {
716+
return json;
717+
}
718+
719+
StringBuilder escaped = new StringBuilder(json.length());
720+
escaped.append(json, 0, firstUnsafe);
721+
for (int i = firstUnsafe; i < json.length(); i++) {
711722
char c = json.charAt(i);
712723
if (c >= 0x7f) {
713724
escaped.append("\\u");

‎samples/client/others/java/okhttp-gson-streaming/src/main/java/org/openapitools/client/ApiClient.java‎

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -705,9 +705,20 @@ public String parameterToString(Object param) {
705705
*/
706706
public String parameterToJsonString(Object param) {
707707
String json = JSON.serialize(param);
708-
StringBuilder escaped = new StringBuilder(json.length());
709-
708+
int firstUnsafe = -1;
710709
for (int i = 0; i < json.length(); i++) {
710+
if (json.charAt(i) >= 0x7f) {
711+
firstUnsafe = i;
712+
break;
713+
}
714+
}
715+
if (firstUnsafe == -1) {
716+
return json;
717+
}
718+
719+
StringBuilder escaped = new StringBuilder(json.length());
720+
escaped.append(json, 0, firstUnsafe);
721+
for (int i = firstUnsafe; i < json.length(); i++) {
711722
char c = json.charAt(i);
712723
if (c >= 0x7f) {
713724
escaped.append("\\u");

‎samples/client/petstore/java/okhttp-gson-3.1-duplicated-operationid/src/main/java/org/openapitools/client/ApiClient.java‎

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -801,9 +801,20 @@ public String parameterToString(Object param) {
801801
*/
802802
public String parameterToJsonString(Object param) {
803803
String json = JSON.serialize(param);
804-
StringBuilder escaped = new StringBuilder(json.length());
805-
804+
int firstUnsafe = -1;
806805
for (int i = 0; i < json.length(); i++) {
806+
if (json.charAt(i) >= 0x7f) {
807+
firstUnsafe = i;
808+
break;
809+
}
810+
}
811+
if (firstUnsafe == -1) {
812+
return json;
813+
}
814+
815+
StringBuilder escaped = new StringBuilder(json.length());
816+
escaped.append(json, 0, firstUnsafe);
817+
for (int i = firstUnsafe; i < json.length(); i++) {
807818
char c = json.charAt(i);
808819
if (c >= 0x7f) {
809820
escaped.append("\\u");

‎samples/client/petstore/java/okhttp-gson-3.1/src/main/java/org/openapitools/client/ApiClient.java‎

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -801,9 +801,20 @@ public String parameterToString(Object param) {
801801
*/
802802
public String parameterToJsonString(Object param) {
803803
String json = JSON.serialize(param);
804-
StringBuilder escaped = new StringBuilder(json.length());
805-
804+
int firstUnsafe = -1;
806805
for (int i = 0; i < json.length(); i++) {
806+
if (json.charAt(i) >= 0x7f) {
807+
firstUnsafe = i;
808+
break;
809+
}
810+
}
811+
if (firstUnsafe == -1) {
812+
return json;
813+
}
814+
815+
StringBuilder escaped = new StringBuilder(json.length());
816+
escaped.append(json, 0, firstUnsafe);
817+
for (int i = firstUnsafe; i < json.length(); i++) {
807818
char c = json.charAt(i);
808819
if (c >= 0x7f) {
809820
escaped.append("\\u");

0 commit comments

Comments
 (0)