From 7dcfe62dee3cca5c7f9ca6569a779172670f500d Mon Sep 17 00:00:00 2001 From: Sorin Florea <30589784+sorin-florea@users.noreply.github.com> Date: Tue, 22 Feb 2022 10:33:36 +0200 Subject: [PATCH] Properly encode exploded query params in url (#11682) --- .../Java/libraries/native/api.mustache | 12 +++++ .../codegen/java/JavaClientCodegenTest.java | 33 ++++++++++++++ .../src/test/resources/3_0/issue4808.yaml | 45 +++++++++++++++++++ 3 files changed, 90 insertions(+) create mode 100644 modules/openapi-generator/src/test/resources/3_0/issue4808.yaml diff --git a/modules/openapi-generator/src/main/resources/Java/libraries/native/api.mustache b/modules/openapi-generator/src/main/resources/Java/libraries/native/api.mustache index ede8e5b9566..d4891d1cd6b 100644 --- a/modules/openapi-generator/src/main/resources/Java/libraries/native/api.mustache +++ b/modules/openapi-generator/src/main/resources/Java/libraries/native/api.mustache @@ -318,7 +318,19 @@ public class {{classname}} { } {{/isDeepObject}} {{^isDeepObject}} + {{#isExplode}} + {{#hasVars}} + {{#vars}} + localVarQueryParams.addAll(ApiClient.parameterToPairs("{{baseName}}", {{paramName}}.{{getter}}())); + {{/vars}} + {{/hasVars}} + {{^hasVars}} localVarQueryParams.addAll(ApiClient.parameterToPairs("{{baseName}}", {{paramName}})); + {{/hasVars}} + {{/isExplode}} + {{^isExplode}} + localVarQueryParams.addAll(ApiClient.parameterToPairs("{{baseName}}", {{paramName}})); + {{/isExplode}} {{/isDeepObject}} {{/collectionFormat}} {{/queryParams}} 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 c62cbdd5616..ce1e6528912 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 @@ -1276,4 +1276,37 @@ public class JavaClientCodegenTest { TestUtils.assertFileContains(Paths.get(output + "/src/main/java/xyz/abcdef/ApiClient.java"), "public static String urlEncode(String s) { return URLEncoder.encode(s, UTF_8).replaceAll(\"\\\\+\", \"%20\"); }"); } + + /** + * See https://github.com/OpenAPITools/openapi-generator/issues/4808 + */ + @Test + public void testNativeClientExplodedQueryParamObject() throws IOException { + Map properties = new HashMap<>(); + properties.put(CodegenConstants.API_PACKAGE, "xyz.abcdef.api"); + + File output = Files.createTempDirectory("test").toFile(); + output.deleteOnExit(); + + final CodegenConfigurator configurator = new CodegenConfigurator() + .setGeneratorName("java") + .setLibrary(JavaClientCodegen.NATIVE) + .setAdditionalProperties(properties) + .setInputSpec("src/test/resources/3_0/issue4808.yaml") + .setOutputDir(output.getAbsolutePath().replace("\\", "/")); + + final ClientOptInput clientOptInput = configurator.toClientOptInput(); + DefaultGenerator generator = new DefaultGenerator(); + List files = generator.opts(clientOptInput).generate(); + + Assert.assertEquals(files.size(), 38); + validateJavaSourceFiles(files); + + TestUtils.assertFileContains(Paths.get(output + "/src/main/java/xyz/abcdef/api/DefaultApi.java"), + "localVarQueryParams.addAll(ApiClient.parameterToPairs(\"since\", queryObject.getSince()));", + "localVarQueryParams.addAll(ApiClient.parameterToPairs(\"sinceBuild\", queryObject.getSinceBuild()));", + "localVarQueryParams.addAll(ApiClient.parameterToPairs(\"maxBuilds\", queryObject.getMaxBuilds()));", + "localVarQueryParams.addAll(ApiClient.parameterToPairs(\"maxWaitSecs\", queryObject.getMaxWaitSecs()));" + ); + } } diff --git a/modules/openapi-generator/src/test/resources/3_0/issue4808.yaml b/modules/openapi-generator/src/test/resources/3_0/issue4808.yaml new file mode 100644 index 00000000000..b2d16592f61 --- /dev/null +++ b/modules/openapi-generator/src/test/resources/3_0/issue4808.yaml @@ -0,0 +1,45 @@ +openapi: 3.0.3 +info: + title: Issue 11242 - exploded query params + description: "Exploded query params" + version: "1.0.0" +servers: + - url: localhost:8080 +paths: + /api: + get: + operationId: GetSomeValue + parameters: + - in: query + name: QueryObject + explode: true + style: form + schema: + type: object + properties: + since: + type: string + sinceBuild: + type: string + maxBuilds: + type: integer + maxWaitSecs: + type: integer + responses: + '200': + description: Some return value + content: + application/json: + schema: + $ref: '#/components/schemas/SomeReturnValue' + example: + someValue: value +components: + schemas: + SomeReturnValue: + type: object + required: + - someValue + properties: + someValue: + type: string