From 2cec5d0d5c39e25d82edd30a4bd890ad45b78f58 Mon Sep 17 00:00:00 2001 From: ztefanie Date: Thu, 16 Jan 2025 15:20:26 +0100 Subject: [PATCH] Add skipEndcoding flag for rest and gitlab connector --- .../element-templates/gitlab-connector.json | 15 ++++++++++++++- .../builder/parts/ApacheRequestUriBuilder.java | 2 +- .../client/apache/builder/parts/UrlEncoder.java | 5 ++++- .../http/base/model/HttpCommonRequest.java | 17 +++++++++++++++++ .../apache/CustomApacheHttpClientTest.java | 17 +++++++++++++++++ connectors/http/rest/README.md | 2 +- .../element-templates/http-json-connector.json | 13 ++++++++++++- .../hybrid/http-json-connector-hybrid.json | 13 ++++++++++++- .../connector/http/rest/HttpJsonFunction.java | 3 ++- 9 files changed, 80 insertions(+), 7 deletions(-) diff --git a/connectors/gitlab/element-templates/gitlab-connector.json b/connectors/gitlab/element-templates/gitlab-connector.json index 4fb68b99ef..36118962ec 100644 --- a/connectors/gitlab/element-templates/gitlab-connector.json +++ b/connectors/gitlab/element-templates/gitlab-connector.json @@ -2,7 +2,7 @@ "$schema": "https://unpkg.com/@camunda/zeebe-element-templates-json-schema/resources/schema.json", "name": "GitLab Outbound Connector", "id": "io.camunda.connectors.GitLab.v1", - "version": 5, + "version": 6, "description": "Manage GitLab issues, branches, releases, and more", "metadata": { "keywords": [ @@ -654,6 +654,19 @@ ] } }, + { + "id": "skipEncoding", + "label": "Skip URL encoding", + "description": "Skip the default URL decoding and encoding behavior", + "optional": true, + "group": "endpoint", + "binding": { + "name": "skipEncoding", + "type": "zeebe:input" + }, + "value": "true", + "type": "Hidden" + }, { "label": "Issue ID", "description": "The internal ID of a project’s issue", diff --git a/connectors/http/http-base/src/main/java/io/camunda/connector/http/base/client/apache/builder/parts/ApacheRequestUriBuilder.java b/connectors/http/http-base/src/main/java/io/camunda/connector/http/base/client/apache/builder/parts/ApacheRequestUriBuilder.java index a424c2f96f..d7d0d9c0a9 100644 --- a/connectors/http/http-base/src/main/java/io/camunda/connector/http/base/client/apache/builder/parts/ApacheRequestUriBuilder.java +++ b/connectors/http/http-base/src/main/java/io/camunda/connector/http/base/client/apache/builder/parts/ApacheRequestUriBuilder.java @@ -23,6 +23,6 @@ public class ApacheRequestUriBuilder implements ApacheRequestPartBuilder { @Override public void build(ClassicRequestBuilder builder, HttpCommonRequest request) { - builder.setUri(UrlEncoder.toEncodedUri(request.getUrl())); + builder.setUri(UrlEncoder.toEncodedUri(request.getUrl(), request.getSkipEncoding())); } } diff --git a/connectors/http/http-base/src/main/java/io/camunda/connector/http/base/client/apache/builder/parts/UrlEncoder.java b/connectors/http/http-base/src/main/java/io/camunda/connector/http/base/client/apache/builder/parts/UrlEncoder.java index 639a252992..766b0a685d 100644 --- a/connectors/http/http-base/src/main/java/io/camunda/connector/http/base/client/apache/builder/parts/UrlEncoder.java +++ b/connectors/http/http-base/src/main/java/io/camunda/connector/http/base/client/apache/builder/parts/UrlEncoder.java @@ -28,11 +28,14 @@ public class UrlEncoder { private static final Logger LOG = LoggerFactory.getLogger(ApacheRequestUriBuilder.class); - public static URI toEncodedUri(String requestUrl) { + public static URI toEncodedUri(String requestUrl, Boolean skipEncoding) { try { // We try to decode the URL first, because it might be encoded already // which would lead to double encoding. Decoding is safe here, because it does nothing if // the URL is not encoded. + if (skipEncoding) { + return URI.create(requestUrl); + } var decodedUrl = URLDecoder.decode(requestUrl, StandardCharsets.UTF_8); var url = new URL(decodedUrl); // Only this URI constructor escapes the URL properly diff --git a/connectors/http/http-base/src/main/java/io/camunda/connector/http/base/model/HttpCommonRequest.java b/connectors/http/http-base/src/main/java/io/camunda/connector/http/base/model/HttpCommonRequest.java index 8a9e582758..42d945ab88 100644 --- a/connectors/http/http-base/src/main/java/io/camunda/connector/http/base/model/HttpCommonRequest.java +++ b/connectors/http/http-base/src/main/java/io/camunda/connector/http/base/model/HttpCommonRequest.java @@ -111,6 +111,15 @@ public class HttpCommonRequest { description = "Store the response as a document in the document store") private boolean storeResponse; + @TemplateProperty( + label = "Skip URL encoding", + description = "Skip the default URL decoding and encoding behavior", + type = TemplateProperty.PropertyType.Hidden, + feel = Property.FeelMode.disabled, + group = "endpoint", + optional = true) + private String skipEncoding; + public Object getBody() { return body; } @@ -139,6 +148,14 @@ public void setQueryParameters(Map queryParameters) { this.queryParameters = queryParameters; } + public boolean getSkipEncoding() { + return Objects.equals(skipEncoding, "true"); + } + + public void setSkipEncoding(final String skipEncoding) { + this.skipEncoding = skipEncoding; + } + public boolean hasAuthentication() { return authentication != null; } diff --git a/connectors/http/http-base/src/test/java/io/camunda/connector/http/base/client/apache/CustomApacheHttpClientTest.java b/connectors/http/http-base/src/test/java/io/camunda/connector/http/base/client/apache/CustomApacheHttpClientTest.java index d89c8e3627..525b7d00f7 100644 --- a/connectors/http/http-base/src/test/java/io/camunda/connector/http/base/client/apache/CustomApacheHttpClientTest.java +++ b/connectors/http/http-base/src/test/java/io/camunda/connector/http/base/client/apache/CustomApacheHttpClientTest.java @@ -320,6 +320,23 @@ public void shouldReturn200_whenEscapedSpaceInPathAndQueryParametersInPath( assertThat(result).isNotNull(); assertThat(result.status()).isEqualTo(200); } + + @ParameterizedTest + @EnumSource(HttpMethod.class) + public void shouldKeepOriginalEscaping_whenSkipEscapingIsSet( + HttpMethod method, WireMockRuntimeInfo wmRuntimeInfo) { + stubFor(any(urlEqualTo("/path%2Fwith%2Fencoding")).willReturn(ok())); + stubFor(any(urlEqualTo("/path/with/encoding")).willReturn(badRequest())); + HttpCommonRequest request = new HttpCommonRequest(); + request.setMethod(method); + request.setUrl(wmRuntimeInfo.getHttpBaseUrl() + "/path%2Fwith%2Fencoding"); + request.setSkipEncoding("true"); + + HttpCommonResult result = customApacheHttpClient.execute(request); + + assertThat(result).isNotNull(); + assertThat(result.status()).isEqualTo(200); + } } @Nested diff --git a/connectors/http/rest/README.md b/connectors/http/rest/README.md index f542f45e3a..8247a1e48d 100644 --- a/connectors/http/rest/README.md +++ b/connectors/http/rest/README.md @@ -249,6 +249,6 @@ leading to the following result | Connector Info | | | --- | --- | | Type | io.camunda:http-json:1 | -| Version | 9 | +| Version | 10 | | Supported element types | | diff --git a/connectors/http/rest/element-templates/http-json-connector.json b/connectors/http/rest/element-templates/http-json-connector.json index 70a497234f..05bb3e9a0b 100644 --- a/connectors/http/rest/element-templates/http-json-connector.json +++ b/connectors/http/rest/element-templates/http-json-connector.json @@ -7,7 +7,7 @@ "keywords" : [ ] }, "documentationRef" : "https://docs.camunda.io/docs/components/connectors/protocol/rest/", - "version" : 9, + "version" : 10, "category" : { "id" : "connectors", "name" : "Connectors" @@ -402,6 +402,17 @@ "type" : "zeebe:input" }, "type" : "Boolean" + }, { + "id" : "skipEncoding", + "label" : "Skip URL encoding", + "description" : "Skip the default URL decoding and encoding behavior", + "optional" : true, + "group" : "endpoint", + "binding" : { + "name" : "skipEncoding", + "type" : "zeebe:input" + }, + "type" : "Hidden" }, { "id" : "connectionTimeoutInSeconds", "label" : "Connection timeout in seconds", diff --git a/connectors/http/rest/element-templates/hybrid/http-json-connector-hybrid.json b/connectors/http/rest/element-templates/hybrid/http-json-connector-hybrid.json index 39a698a790..adae7f5209 100644 --- a/connectors/http/rest/element-templates/hybrid/http-json-connector-hybrid.json +++ b/connectors/http/rest/element-templates/hybrid/http-json-connector-hybrid.json @@ -7,7 +7,7 @@ "keywords" : [ ] }, "documentationRef" : "https://docs.camunda.io/docs/components/connectors/protocol/rest/", - "version" : 9, + "version" : 10, "category" : { "id" : "connectors", "name" : "Connectors" @@ -407,6 +407,17 @@ "type" : "zeebe:input" }, "type" : "Boolean" + }, { + "id" : "skipEncoding", + "label" : "Skip URL encoding", + "description" : "Skip the default URL decoding and encoding behavior", + "optional" : true, + "group" : "endpoint", + "binding" : { + "name" : "skipEncoding", + "type" : "zeebe:input" + }, + "type" : "Hidden" }, { "id" : "connectionTimeoutInSeconds", "label" : "Connection timeout in seconds", diff --git a/connectors/http/rest/src/main/java/io/camunda/connector/http/rest/HttpJsonFunction.java b/connectors/http/rest/src/main/java/io/camunda/connector/http/rest/HttpJsonFunction.java index 853ea26799..5bd6bc8409 100644 --- a/connectors/http/rest/src/main/java/io/camunda/connector/http/rest/HttpJsonFunction.java +++ b/connectors/http/rest/src/main/java/io/camunda/connector/http/rest/HttpJsonFunction.java @@ -33,6 +33,7 @@ "authentication", "headers", "queryParameters", + "skipEncoding", "connectionTimeoutInSeconds", "readTimeoutInSeconds", "writeTimeoutInSeconds", @@ -46,7 +47,7 @@ description = "Invoke REST API", inputDataClass = HttpJsonRequest.class, outputDataClass = HttpCommonResult.class, - version = 9, + version = 10, propertyGroups = { @PropertyGroup(id = "authentication", label = "Authentication"), @PropertyGroup(id = "endpoint", label = "HTTP endpoint"),