From c8f2d2be1f1d228cef58e4b98e4d11ace2f05aa2 Mon Sep 17 00:00:00 2001 From: Tomasz Letachowicz Date: Sat, 19 Oct 2024 09:12:45 +0200 Subject: [PATCH] [java][feign] Fix the character escaping in feign generated Content-type and Accept headers in order to generate proper values for these fields (#19895) (#19912) --- .../Java/libraries/feign/api.mustache | 16 +++--- .../codegen/java/JavaClientCodegenTest.java | 28 ++++++++++ .../src/test/resources/3_0/issue_19895.yaml | 54 +++++++++++++++++++ 3 files changed, 90 insertions(+), 8 deletions(-) create mode 100644 modules/openapi-generator/src/test/resources/3_0/issue_19895.yaml diff --git a/modules/openapi-generator/src/main/resources/Java/libraries/feign/api.mustache b/modules/openapi-generator/src/main/resources/Java/libraries/feign/api.mustache index 3d34681ea3f..d67de9a28da 100644 --- a/modules/openapi-generator/src/main/resources/Java/libraries/feign/api.mustache +++ b/modules/openapi-generator/src/main/resources/Java/libraries/feign/api.mustache @@ -47,8 +47,8 @@ public interface {{classname}} extends ApiClient.Api { {{/isDeprecated}} @RequestLine("{{httpMethod}} {{{path}}}{{#hasQueryParams}}?{{/hasQueryParams}}{{#queryParams}}{{baseName}}={{=<% %>=}}{<%paramName%>}<%={{ }}=%>{{^-last}}&{{/-last}}{{/queryParams}}") @Headers({ -{{#vendorExtensions.x-content-type}} "Content-Type: {{vendorExtensions.x-content-type}}", -{{/vendorExtensions.x-content-type}} "Accept: {{#vendorExtensions.x-accepts}}{{.}}{{^-last}},{{/-last}}{{/vendorExtensions.x-accepts}}",{{#headerParams}} +{{#vendorExtensions.x-content-type}} "Content-Type: {{{vendorExtensions.x-content-type}}}", +{{/vendorExtensions.x-content-type}} "Accept: {{#vendorExtensions.x-accepts}}{{{.}}}{{^-last}},{{/-last}}{{/vendorExtensions.x-accepts}}",{{#headerParams}} "{{baseName}}: {{=<% %>=}}{<%paramName%>}<%={{ }}=%>"{{^-last}}, {{/-last}}{{/headerParams}} }) @@ -77,8 +77,8 @@ public interface {{classname}} extends ApiClient.Api { {{/isDeprecated}} @RequestLine("{{httpMethod}} {{{path}}}{{#hasQueryParams}}?{{/hasQueryParams}}{{#queryParams}}{{baseName}}={{=<% %>=}}{<%paramName%>}<%={{ }}=%>{{^-last}}&{{/-last}}{{/queryParams}}") @Headers({ -{{#vendorExtensions.x-content-type}} "Content-Type: {{vendorExtensions.x-content-type}}", -{{/vendorExtensions.x-content-type}} "Accept: {{#vendorExtensions.x-accepts}}{{.}}{{^-last}},{{/-last}}{{/vendorExtensions.x-accepts}}",{{#headerParams}} +{{#vendorExtensions.x-content-type}} "Content-Type: {{{vendorExtensions.x-content-type}}}", +{{/vendorExtensions.x-content-type}} "Accept: {{#vendorExtensions.x-accepts}}{{{.}}}{{^-last}},{{/-last}}{{/vendorExtensions.x-accepts}}",{{#headerParams}} "{{baseName}}: {{=<% %>=}}{<%paramName%>}<%={{ }}=%>"{{^-last}}, {{/-last}}{{/headerParams}} }) @@ -122,8 +122,8 @@ public interface {{classname}} extends ApiClient.Api { {{/isDeprecated}} @RequestLine("{{httpMethod}} {{{path}}}?{{#queryParams}}{{baseName}}={{=<% %>=}}{<%paramName%>}<%={{ }}=%>{{^-last}}&{{/-last}}{{/queryParams}}") @Headers({ -{{#vendorExtensions.x-content-type}} "Content-Type: {{vendorExtensions.x-content-type}}", -{{/vendorExtensions.x-content-type}} "Accept: {{#vendorExtensions.x-accepts}}{{.}}{{^-last}},{{/-last}}{{/vendorExtensions.x-accepts}}",{{#headerParams}} +{{#vendorExtensions.x-content-type}} "Content-Type: {{{vendorExtensions.x-content-type}}}", +{{/vendorExtensions.x-content-type}} "Accept: {{#vendorExtensions.x-accepts}}{{{.}}}{{^-last}},{{/-last}}{{/vendorExtensions.x-accepts}}",{{#headerParams}} "{{baseName}}: {{=<% %>=}}{<%paramName%>}<%={{ }}=%>"{{^-last}}, {{/-last}}{{/headerParams}} }) @@ -162,8 +162,8 @@ public interface {{classname}} extends ApiClient.Api { {{/isDeprecated}} @RequestLine("{{httpMethod}} {{{path}}}?{{#queryParams}}{{baseName}}={{=<% %>=}}{<%paramName%>}<%={{ }}=%>{{^-last}}&{{/-last}}{{/queryParams}}") @Headers({ - {{#vendorExtensions.x-content-type}} "Content-Type: {{vendorExtensions.x-content-type}}", - {{/vendorExtensions.x-content-type}} "Accept: {{#vendorExtensions.x-accepts}}{{.}}{{^-last}},{{/-last}}{{/vendorExtensions.x-accepts}}",{{#headerParams}} + {{#vendorExtensions.x-content-type}} "Content-Type: {{{vendorExtensions.x-content-type}}}", + {{/vendorExtensions.x-content-type}} "Accept: {{#vendorExtensions.x-accepts}}{{{.}}}{{^-last}},{{/-last}}{{/vendorExtensions.x-accepts}}",{{#headerParams}} "{{baseName}}: {{=<% %>=}}{<%paramName%>}<%={{ }}=%>"{{^-last}}, {{/-last}}{{/headerParams}} }) diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/JavaClientCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/JavaClientCodegenTest.java index 42dc774e854..1bbd795f651 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/JavaClientCodegenTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/JavaClientCodegenTest.java @@ -1273,6 +1273,34 @@ public class JavaClientCodegenTest { ); } + /** + * see https://github.com/OpenAPITools/openapi-generator/issues/19895 + */ + @Test public void testCharsetInContentTypeCorrectlyEncodedForFeignApi_issue19895() { + final Path output = newTempFolder(); + final CodegenConfigurator configurator = new CodegenConfigurator() + .setGeneratorName("java") + .setLibrary(FEIGN) + .setInputSpec("src/test/resources/3_0/issue_19895.yaml") + .setOutputDir(output.toString().replace("\\", "/")); + + final ClientOptInput clientOptInput = configurator.toClientOptInput(); + DefaultGenerator generator = new DefaultGenerator(); + List files = generator.opts(clientOptInput).generate(); + + validateJavaSourceFiles(files); + var defaultApiFile = output.resolve("src/main/java/org/openapitools/client/api/DefaultApi.java"); + assertThat(files).contains(defaultApiFile.toFile()); + assertThat(defaultApiFile).content() + .doesNotContain( + "Content-Type: application/json;charset=utf-8", + "Accept: application/json;charset=utf-8") + .contains( + "Content-Type: application/json;charset=utf-8", + "Accept: application/json;charset=utf-8" + ); + } + /** * See https://github.com/OpenAPITools/openapi-generator/issues/6715 *

diff --git a/modules/openapi-generator/src/test/resources/3_0/issue_19895.yaml b/modules/openapi-generator/src/test/resources/3_0/issue_19895.yaml new file mode 100644 index 00000000000..ba20dcd10db --- /dev/null +++ b/modules/openapi-generator/src/test/resources/3_0/issue_19895.yaml @@ -0,0 +1,54 @@ +openapi: 3.0.1 +info: + title: sample spec + description: "Sample spec" + version: 0.0.1 + +paths: + /v1/sample: + post: + operationId: samplePost + requestBody: + content: + application/json;charset=utf-8: + schema: + properties: + name: + type: string + type: object + responses: + 200: + description: success + content: + application/json;charset=utf-8: + schema: + properties: + response: + type: object + type: object + put: + operationId: samplePut + parameters: + - in: query + name: limit + schema: + type: string + requestBody: + content: + application/json;charset=utf-8: + schema: + properties: + name: + type: string + type: object + responses: + 200: + description: success + content: + application/json;charset=utf-8: + schema: + properties: + response: + type: object + type: object +