From d1f832b69aaf6433633a59bd02a7226e0a2e7db5 Mon Sep 17 00:00:00 2001 From: Devesh-Skyflow Date: Mon, 25 May 2026 14:28:25 +0530 Subject: [PATCH 1/3] Revert "test: fix testSendRequestWithNullRequestId to assert null requestId" This reverts commit 8c292d2b2661956beac305aea3fc201176f02a9e. --- src/test/java/com/skyflow/utils/HttpUtilityTests.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/skyflow/utils/HttpUtilityTests.java b/src/test/java/com/skyflow/utils/HttpUtilityTests.java index 0dbdf00b..0158e904 100644 --- a/src/test/java/com/skyflow/utils/HttpUtilityTests.java +++ b/src/test/java/com/skyflow/utils/HttpUtilityTests.java @@ -167,7 +167,7 @@ public void testSendRequestWithNullRequestId() { params.addProperty("key", "value"); String response = httpUtility.sendRequest("GET", url, params, headers); Assert.assertEquals(expected, response); - Assert.assertNull(HttpUtility.getRequestID()); + Assert.assertNotNull(HttpUtility.getRequestID()); } catch (Exception e) { fail(INVALID_EXCEPTION_THROWN); } From e42aa8dd2cf4a75a8d817e33ccc017556ffbddc2 Mon Sep 17 00:00:00 2001 From: Devesh-Skyflow Date: Mon, 25 May 2026 14:28:25 +0530 Subject: [PATCH 2/3] Revert "fix: do not generate SDK-side requestId when server omits x-request-id header" This reverts commit 2740de4c22592d208b253f2763136d26b070e4ce. --- src/main/java/com/skyflow/utils/HttpUtility.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/skyflow/utils/HttpUtility.java b/src/main/java/com/skyflow/utils/HttpUtility.java index 35cdb2fc..0efacccb 100644 --- a/src/main/java/com/skyflow/utils/HttpUtility.java +++ b/src/main/java/com/skyflow/utils/HttpUtility.java @@ -13,6 +13,7 @@ import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.UUID; public final class HttpUtility { @@ -73,7 +74,11 @@ public static String sendRequest(String method, URL url, JsonObject params, Map< int httpCode = connection.getResponseCode(); String requestID = connection.getHeaderField("x-request-id"); - HttpUtility.requestID = requestID != null ? requestID.split(",")[0] : null; + if (requestID != null) { + HttpUtility.requestID = requestID.split(",")[0]; + } else { + HttpUtility.requestID = Constants.HttpUtilityExtra.SDK_GENERATED_PREFIX + UUID.randomUUID(); + } Map> responseHeaders = connection.getHeaderFields(); Reader streamReader; if (httpCode > 299) { From d9e021698bf7436f62fd56e3bb74b772b6822ab2 Mon Sep 17 00:00:00 2001 From: Devesh-Skyflow Date: Mon, 25 May 2026 14:54:21 +0530 Subject: [PATCH 3/3] revert: remove URL encoding and raw body from InvokeConnection MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit URL encoding path/query params is a breaking change for users who pre-encode values (double-encoding), and Go SDK v1/v2 does raw substitution with no encoding — keep consistent. Raw string body support is not confirmed by the Connections API docs; the gateway needs structured (JSON/form) bodies for token replacement, so raw strings would forward tokens unreplaced. Remove to avoid misleading users. Co-Authored-By: Claude Sonnet 4.6 --- .../java/com/skyflow/utils/Constants.java | 1 - .../java/com/skyflow/utils/HttpUtility.java | 4 +- src/main/java/com/skyflow/utils/Utils.java | 17 +----- .../utils/validations/Validations.java | 25 +++------ .../controller/ConnectionController.java | 25 ++------- .../controller/ConnectionControllerTests.java | 52 ------------------- 6 files changed, 14 insertions(+), 110 deletions(-) diff --git a/src/main/java/com/skyflow/utils/Constants.java b/src/main/java/com/skyflow/utils/Constants.java index 1162b3f0..aa3a3f14 100644 --- a/src/main/java/com/skyflow/utils/Constants.java +++ b/src/main/java/com/skyflow/utils/Constants.java @@ -40,7 +40,6 @@ public final class Constants { public static final String QUOTE = "\""; public static final class HttpUtilityExtra { - public static final String RAW_BODY_KEY = "__raw_body__"; public static final String SDK_GENERATED_PREFIX = "SDK-Generated-"; private HttpUtilityExtra() {} } diff --git a/src/main/java/com/skyflow/utils/HttpUtility.java b/src/main/java/com/skyflow/utils/HttpUtility.java index 0efacccb..671e2415 100644 --- a/src/main/java/com/skyflow/utils/HttpUtility.java +++ b/src/main/java/com/skyflow/utils/HttpUtility.java @@ -57,9 +57,7 @@ public static String sendRequest(String method, URL url, JsonObject params, Map< byte[] input = null; String requestContentType = connection.getRequestProperty("content-type"); - if (params.has(Constants.HttpUtilityExtra.RAW_BODY_KEY) && params.size() == 1) { - input = params.get(Constants.HttpUtilityExtra.RAW_BODY_KEY).getAsString().getBytes(StandardCharsets.UTF_8); - } else if (requestContentType != null && requestContentType.contains("application/x-www-form-urlencoded")) { + if (requestContentType != null && requestContentType.contains("application/x-www-form-urlencoded")) { input = formatJsonToFormEncodedString(params).getBytes(StandardCharsets.UTF_8); } else if (requestContentType != null && requestContentType.contains("multipart/form-data")) { input = formatJsonToMultiPartFormDataString(params, boundary).getBytes(StandardCharsets.UTF_8); diff --git a/src/main/java/com/skyflow/utils/Utils.java b/src/main/java/com/skyflow/utils/Utils.java index 0c20bd6c..ae5854cd 100644 --- a/src/main/java/com/skyflow/utils/Utils.java +++ b/src/main/java/com/skyflow/utils/Utils.java @@ -17,8 +17,6 @@ import java.io.File; import java.net.MalformedURLException; import java.net.URL; -import java.net.URLEncoder; -import java.nio.charset.StandardCharsets; import java.security.KeyFactory; import java.security.NoSuchAlgorithmException; import java.security.PrivateKey; @@ -121,12 +119,7 @@ public static String constructConnectionURL(ConnectionConfig config, InvokeConne for (Map.Entry entry : invokeConnectionRequest.getPathParams().entrySet()) { String key = entry.getKey(); String value = entry.getValue(); - try { - String encodedValue = URLEncoder.encode(value, StandardCharsets.UTF_8.name()); - filledURL = new StringBuilder(filledURL.toString().replace(String.format(Constants.CURLY_PLACEHOLDER, key), encodedValue)); - } catch (Exception e) { - filledURL = new StringBuilder(filledURL.toString().replace(String.format(Constants.CURLY_PLACEHOLDER, key), value)); - } + filledURL = new StringBuilder(filledURL.toString().replace(String.format(Constants.CURLY_PLACEHOLDER, key), value)); } } @@ -135,13 +128,7 @@ public static String constructConnectionURL(ConnectionConfig config, InvokeConne for (Map.Entry entry : invokeConnectionRequest.getQueryParams().entrySet()) { String key = entry.getKey(); String value = entry.getValue(); - try { - String encodedKey = URLEncoder.encode(key, StandardCharsets.UTF_8.name()); - String encodedValue = URLEncoder.encode(value, StandardCharsets.UTF_8.name()); - filledURL.append(encodedKey).append("=").append(encodedValue).append("&"); - } catch (Exception e) { - filledURL.append(key).append("=").append(value).append("&"); - } + filledURL.append(key).append("=").append(value).append("&"); } filledURL = new StringBuilder(filledURL.substring(0, filledURL.length() - 1)); } diff --git a/src/main/java/com/skyflow/utils/validations/Validations.java b/src/main/java/com/skyflow/utils/validations/Validations.java index 0c36445c..5e528a6a 100644 --- a/src/main/java/com/skyflow/utils/validations/Validations.java +++ b/src/main/java/com/skyflow/utils/validations/Validations.java @@ -10,7 +10,6 @@ import java.util.regex.Pattern; import com.google.gson.Gson; -import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.skyflow.config.ConnectionConfig; import com.skyflow.config.Credentials; @@ -150,24 +149,12 @@ public static void validateInvokeConnectionRequest(InvokeConnectionRequest invok if (requestBody.getClass().equals(Object.class)) { return; } - if (requestBody instanceof String) { - String bodyStr = (String) requestBody; - if (bodyStr.trim().isEmpty()) { - LogUtil.printErrorLog(Utils.parameterizedString( - ErrorLogs.EMPTY_REQUEST_BODY.getLog(), InterfaceName.INVOKE_CONNECTION.getName())); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyRequestBody.getMessage()); - } - } else { - Gson gson = new Gson(); - JsonElement bodyElement = gson.toJsonTree(requestBody); - if (bodyElement.isJsonObject()) { - JsonObject bodyObject = bodyElement.getAsJsonObject(); - if (bodyObject.isEmpty()) { - LogUtil.printErrorLog(Utils.parameterizedString( - ErrorLogs.EMPTY_REQUEST_BODY.getLog(), InterfaceName.INVOKE_CONNECTION.getName())); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyRequestBody.getMessage()); - } - } + Gson gson = new Gson(); + JsonObject bodyObject = gson.toJsonTree(requestBody).getAsJsonObject(); + if (bodyObject.isEmpty()) { + LogUtil.printErrorLog(Utils.parameterizedString( + ErrorLogs.EMPTY_REQUEST_BODY.getLog(), InterfaceName.INVOKE_CONNECTION.getName())); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyRequestBody.getMessage()); } } } diff --git a/src/main/java/com/skyflow/vault/controller/ConnectionController.java b/src/main/java/com/skyflow/vault/controller/ConnectionController.java index 07f12dc8..1b9ee34a 100644 --- a/src/main/java/com/skyflow/vault/controller/ConnectionController.java +++ b/src/main/java/com/skyflow/vault/controller/ConnectionController.java @@ -55,26 +55,11 @@ public InvokeConnectionResponse invoke(InvokeConnectionRequest invokeConnectionR Object requestBodyObject = invokeConnectionRequest.getRequestBody(); if (requestBodyObject != null) { - if (requestBodyObject instanceof String) { - String contentType = headers.getOrDefault("content-type", ""); - if (!contentType.isEmpty() && !contentType.toLowerCase().contains("application/json")) { - requestBody = new JsonObject(); - requestBody.addProperty(Constants.HttpUtilityExtra.RAW_BODY_KEY, (String) requestBodyObject); - } else { - try { - requestBody = convertObjectToJson(requestBodyObject); - } catch (Exception e) { - LogUtil.printErrorLog(ErrorLogs.INVALID_REQUEST_HEADERS.getLog()); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.InvalidRequestBody.getMessage()); - } - } - } else { - try { - requestBody = convertObjectToJson(requestBodyObject); - } catch (Exception e) { - LogUtil.printErrorLog(ErrorLogs.INVALID_REQUEST_HEADERS.getLog()); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.InvalidRequestBody.getMessage()); - } + try { + requestBody = convertObjectToJson(requestBodyObject); + } catch (Exception e) { + LogUtil.printErrorLog(ErrorLogs.INVALID_REQUEST_HEADERS.getLog()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.InvalidRequestBody.getMessage()); } } diff --git a/src/test/java/com/skyflow/vault/controller/ConnectionControllerTests.java b/src/test/java/com/skyflow/vault/controller/ConnectionControllerTests.java index 6ce0cd4d..a258e01d 100644 --- a/src/test/java/com/skyflow/vault/controller/ConnectionControllerTests.java +++ b/src/test/java/com/skyflow/vault/controller/ConnectionControllerTests.java @@ -137,44 +137,6 @@ public void testInvoke_successWithPutMethod() throws Exception { Assert.assertNotNull(response); } - @Test - public void testInvoke_successWithStringBodyAndJsonContentType() throws Exception { - when(HttpUtility.sendRequest(anyString(), any(URL.class), any(), any())) - .thenReturn("{\"parsed\":true}"); - when(HttpUtility.getRequestID()).thenReturn(REQUEST_ID); - - Map headers = new HashMap<>(); - headers.put("content-type", "application/json"); - - InvokeConnectionRequest request = InvokeConnectionRequest.builder() - .method(RequestMethod.POST) - .requestHeaders(headers) - .requestBody("{\"key\":\"value\"}") - .build(); - InvokeConnectionResponse response = controller.invoke(request); - - Assert.assertNotNull(response); - } - - @Test - public void testInvoke_successWithStringBodyAndNonJsonContentType() throws Exception { - when(HttpUtility.sendRequest(anyString(), any(URL.class), any(), any())) - .thenReturn("ok"); - when(HttpUtility.getRequestID()).thenReturn(REQUEST_ID); - - Map headers = new HashMap<>(); - headers.put("content-type", "text/plain"); - - InvokeConnectionRequest request = InvokeConnectionRequest.builder() - .method(RequestMethod.POST) - .requestHeaders(headers) - .requestBody("raw body content") - .build(); - InvokeConnectionResponse response = controller.invoke(request); - - Assert.assertNotNull(response); - } - @Test public void testInvoke_successWithObjectBody() throws Exception { when(HttpUtility.sendRequest(anyString(), any(URL.class), any(), any())) @@ -364,20 +326,6 @@ public void testInvoke_emptyQueryParamsThrowsSkyflowException() { } } - @Test - public void testInvoke_emptyStringBodyThrowsSkyflowException() { - try { - InvokeConnectionRequest request = InvokeConnectionRequest.builder() - .requestBody(" ") - .build(); - controller.invoke(request); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (SkyflowException e) { - Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); - Assert.assertEquals(ErrorMessage.EmptyRequestBody.getMessage(), e.getMessage()); - } - } - @Test public void testInvoke_emptyHashMapBodyThrowsSkyflowException() { try {