From 96c29d2f055807a220556a98416280efdb062c2f Mon Sep 17 00:00:00 2001 From: IgorHorta Date: Mon, 16 Feb 2026 20:40:15 -0300 Subject: [PATCH 1/6] feat(sdk): support token revoke in java sdk --- docker-compose.yaml | 4 +- pom.xml | 4 +- .../java/com/infisical/sdk/api/ApiClient.java | 34 ++++++++ .../sdk/models/RevokeTokenInput.java | 20 +++++ .../sdk/models/RevokeTokenResponse.java | 10 +++ .../infisical/sdk/resources/AuthClient.java | 31 +++++++ .../sdk/models/RevokeTokenInputTest.java | 33 +++++++ .../sdk/resources/AuthClientTest.java | 86 +++++++++++++++++++ 8 files changed, 218 insertions(+), 4 deletions(-) create mode 100644 src/main/java/com/infisical/sdk/models/RevokeTokenInput.java create mode 100644 src/main/java/com/infisical/sdk/models/RevokeTokenResponse.java create mode 100644 src/test/java/com/infisical/sdk/models/RevokeTokenInputTest.java create mode 100644 src/test/java/com/infisical/sdk/resources/AuthClientTest.java diff --git a/docker-compose.yaml b/docker-compose.yaml index 31a083c..1e3c816 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -6,8 +6,8 @@ services: volumes: - .:/app working_dir: /app - # Run only unit tests (no real credentials). Full suite: mvn test with env set. - command: mvn test -Dtest=ProjectsClientTest,AwsAuthProviderTest + # Run only unit tests (no real credentials). Full suite: mvn test -q with env set. + command: mvn test -Dtest=RevokeTokenInputTest,AuthClientTest,AwsAuthProviderTest,ProjectsClientTest format: image: cimg/openjdk:21.0 diff --git a/pom.xml b/pom.xml index 024aa82..ac061ec 100644 --- a/pom.xml +++ b/pom.xml @@ -154,13 +154,13 @@ org.mockito mockito-core - 5.5.0 + 5.8.0 test org.mockito mockito-junit-jupiter - 5.5.0 + 5.8.0 test diff --git a/src/main/java/com/infisical/sdk/api/ApiClient.java b/src/main/java/com/infisical/sdk/api/ApiClient.java index e417240..ec3ad11 100644 --- a/src/main/java/com/infisical/sdk/api/ApiClient.java +++ b/src/main/java/com/infisical/sdk/api/ApiClient.java @@ -102,6 +102,40 @@ public R post(String url, T requestBody, Class responseType) throws In } } + public R post(String url, Class responseType) throws InfisicalException { + try { + Gson gson = new Gson(); + Request.Builder requestBuilder = new Request.Builder() + .url(url) + .post(RequestBody.create(JSON, "{}")) + .header("Accept", "application/json"); + + if (this.accessToken != null && !this.accessToken.isEmpty()) { + requestBuilder.addHeader("Authorization", "Bearer " + this.accessToken); + } + Request request = requestBuilder.build(); + + Response response = client.newCall(request).execute(); + try (ResponseBody responseBody = response.body()) { + if (!response.isSuccessful()) { + throw new IOException(this.formatErrorMessage(response)); + } + + if (responseBody == null) { + throw new IOException("Response body is null"); + } + + String responseJson = responseBody.string(); + if (responseJson == null || responseJson.trim().isEmpty()) { + return null; + } + return gson.fromJson(responseJson, responseType); + } + } catch (IOException e) { + throw new InfisicalException(e); + } + } + public R get(String baseUrl, Map queryParams, Class responseType) throws InfisicalException { try { diff --git a/src/main/java/com/infisical/sdk/models/RevokeTokenInput.java b/src/main/java/com/infisical/sdk/models/RevokeTokenInput.java new file mode 100644 index 0000000..abbd135 --- /dev/null +++ b/src/main/java/com/infisical/sdk/models/RevokeTokenInput.java @@ -0,0 +1,20 @@ +package com.infisical.sdk.models; + +import com.google.gson.annotations.SerializedName; +import com.infisical.sdk.util.Helper; +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class RevokeTokenInput { + @SerializedName("accessToken") + private String accessToken; + + public String validate() { + if (Helper.isNullOrEmpty(accessToken)) { + return "Access token is required"; + } + return null; + } +} diff --git a/src/main/java/com/infisical/sdk/models/RevokeTokenResponse.java b/src/main/java/com/infisical/sdk/models/RevokeTokenResponse.java new file mode 100644 index 0000000..58cd53d --- /dev/null +++ b/src/main/java/com/infisical/sdk/models/RevokeTokenResponse.java @@ -0,0 +1,10 @@ +package com.infisical.sdk.models; + +import com.google.gson.annotations.SerializedName; +import lombok.Data; + +@Data +public class RevokeTokenResponse { + @SerializedName("message") + private String message; +} diff --git a/src/main/java/com/infisical/sdk/resources/AuthClient.java b/src/main/java/com/infisical/sdk/resources/AuthClient.java index 38cac5d..6a4ff99 100644 --- a/src/main/java/com/infisical/sdk/resources/AuthClient.java +++ b/src/main/java/com/infisical/sdk/resources/AuthClient.java @@ -5,7 +5,10 @@ import com.infisical.sdk.models.AwsAuthLoginInput; import com.infisical.sdk.models.LdapAuthLoginInput; import com.infisical.sdk.models.MachineIdentityCredential; +import com.infisical.sdk.models.RevokeTokenInput; +import com.infisical.sdk.models.RevokeTokenResponse; import com.infisical.sdk.models.UniversalAuthLoginInput; +import com.infisical.sdk.util.Helper; import com.infisical.sdk.util.InfisicalException; import java.util.function.Consumer; @@ -58,4 +61,32 @@ public void AwsAuthLogin(AwsAuthLoginInput input) throws InfisicalException { public void SetAccessToken(String accessToken) { this.onAuthenticate.accept(accessToken); } + + public RevokeTokenResponse RevokeToken(String accessToken) throws InfisicalException { + RevokeTokenInput input = RevokeTokenInput.builder().accessToken(accessToken).build(); + + String validationMsg = input.validate(); + if (validationMsg != null) { + throw new InfisicalException(validationMsg); + } + + String url = String.format("%s%s", this.apiClient.GetBaseUrl(), "/api/v1/auth/token/revoke"); + return this.apiClient.post(url, input, RevokeTokenResponse.class); + } + + /** + * Revoke a token by its ID (Token Auth). Uses POST + * /api/v1/auth/token-auth/tokens/{tokenId}/revoke. + */ + public RevokeTokenResponse RevokeTokenById(String tokenId) throws InfisicalException { + if (Helper.isNullOrEmpty(tokenId)) { + throw new InfisicalException("Token ID is required"); + } + + String url = String.format( + "%s%s", + this.apiClient.GetBaseUrl(), + String.format("/api/v1/auth/token-auth/tokens/%s/revoke", tokenId)); + return this.apiClient.post(url, RevokeTokenResponse.class); + } } diff --git a/src/test/java/com/infisical/sdk/models/RevokeTokenInputTest.java b/src/test/java/com/infisical/sdk/models/RevokeTokenInputTest.java new file mode 100644 index 0000000..cd467f7 --- /dev/null +++ b/src/test/java/com/infisical/sdk/models/RevokeTokenInputTest.java @@ -0,0 +1,33 @@ +package com.infisical.sdk.models; + +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; + +import org.junit.jupiter.api.Test; + +public class RevokeTokenInputTest { + + @Test + public void validate_returnsNull_whenAccessTokenIsSet() { + RevokeTokenInput input = RevokeTokenInput.builder().accessToken("token-123").build(); + assertNull(input.validate()); + } + + @Test + public void validate_returnsMessage_whenAccessTokenIsNull() { + RevokeTokenInput input = RevokeTokenInput.builder().accessToken(null).build(); + assertNotNull(input.validate()); + } + + @Test + public void validate_returnsMessage_whenAccessTokenIsEmpty() { + RevokeTokenInput input = RevokeTokenInput.builder().accessToken("").build(); + assertNotNull(input.validate()); + } + + @Test + public void validate_returnsMessage_whenAccessTokenIsWhitespace() { + RevokeTokenInput input = RevokeTokenInput.builder().accessToken(" ").build(); + assertNotNull(input.validate()); + } +} diff --git a/src/test/java/com/infisical/sdk/resources/AuthClientTest.java b/src/test/java/com/infisical/sdk/resources/AuthClientTest.java new file mode 100644 index 0000000..bac4219 --- /dev/null +++ b/src/test/java/com/infisical/sdk/resources/AuthClientTest.java @@ -0,0 +1,86 @@ +package com.infisical.sdk.resources; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import com.infisical.sdk.api.ApiClient; +import com.infisical.sdk.models.RevokeTokenInput; +import com.infisical.sdk.models.RevokeTokenResponse; +import com.infisical.sdk.util.InfisicalException; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +@ExtendWith(MockitoExtension.class) +public class AuthClientTest { + + @Mock + private ApiClient apiClient; + + @Test + public void RevokeToken_throwsWhenAccessTokenIsNull() { + AuthClient authClient = new AuthClient(apiClient, token -> {}); + + InfisicalException ex = assertThrows(InfisicalException.class, () -> authClient.RevokeToken(null)); + assertEquals("Access token is required", ex.getMessage()); + } + + @Test + public void RevokeToken_throwsWhenAccessTokenIsEmpty() { + AuthClient authClient = new AuthClient(apiClient, token -> {}); + + InfisicalException ex = assertThrows(InfisicalException.class, () -> authClient.RevokeToken("")); + assertEquals("Access token is required", ex.getMessage()); + } + + @Test + public void RevokeToken_callsPostWithCorrectUrlAndBody() throws InfisicalException { + when(apiClient.GetBaseUrl()).thenReturn("http://localhost"); + AuthClient authClient = new AuthClient(apiClient, token -> {}); + + authClient.RevokeToken("token-123"); + + verify(apiClient).post( + eq("http://localhost/api/v1/auth/token/revoke"), + any(RevokeTokenInput.class), + eq(RevokeTokenResponse.class)); + } + + @Test + public void RevokeTokenById_throwsWhenTokenIdIsNull() { + AuthClient authClient = new AuthClient(apiClient, token -> {}); + + InfisicalException ex = + assertThrows(InfisicalException.class, () -> authClient.RevokeTokenById(null)); + assertEquals("Token ID is required", ex.getMessage()); + } + + @Test + public void RevokeTokenById_throwsWhenTokenIdIsEmpty() { + AuthClient authClient = new AuthClient(apiClient, token -> {}); + + InfisicalException ex = + assertThrows(InfisicalException.class, () -> authClient.RevokeTokenById("")); + assertEquals("Token ID is required", ex.getMessage()); + } + + @Test + public void RevokeTokenById_callsPostWithCorrectUrl() throws InfisicalException { + when(apiClient.GetBaseUrl()).thenReturn("http://localhost"); + when(apiClient.post(any(String.class), eq(RevokeTokenResponse.class))) + .thenReturn(new RevokeTokenResponse()); + AuthClient authClient = new AuthClient(apiClient, token -> {}); + + authClient.RevokeTokenById("id-123"); + + verify(apiClient) + .post( + eq("http://localhost/api/v1/auth/token-auth/tokens/id-123/revoke"), + eq(RevokeTokenResponse.class)); + } +} From 45512872e02685e2d78d0d49f67bf8e4b28ed179 Mon Sep 17 00:00:00 2001 From: IgorHorta Date: Wed, 18 Feb 2026 13:59:33 -0300 Subject: [PATCH 2/6] Simplifies token revocation process. Removes `RevokeTokenResponse` and updates `AuthClient` and related tests to use `Void` for token revocation. This streamlines the API calls and simplifies the overall process, as no specific response data is required. --- .../com/infisical/sdk/models/RevokeTokenResponse.java | 10 ---------- .../java/com/infisical/sdk/resources/AuthClient.java | 9 ++++----- .../com/infisical/sdk/resources/AuthClientTest.java | 7 ++----- 3 files changed, 6 insertions(+), 20 deletions(-) delete mode 100644 src/main/java/com/infisical/sdk/models/RevokeTokenResponse.java diff --git a/src/main/java/com/infisical/sdk/models/RevokeTokenResponse.java b/src/main/java/com/infisical/sdk/models/RevokeTokenResponse.java deleted file mode 100644 index 58cd53d..0000000 --- a/src/main/java/com/infisical/sdk/models/RevokeTokenResponse.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.infisical.sdk.models; - -import com.google.gson.annotations.SerializedName; -import lombok.Data; - -@Data -public class RevokeTokenResponse { - @SerializedName("message") - private String message; -} diff --git a/src/main/java/com/infisical/sdk/resources/AuthClient.java b/src/main/java/com/infisical/sdk/resources/AuthClient.java index 6a4ff99..8a5f974 100644 --- a/src/main/java/com/infisical/sdk/resources/AuthClient.java +++ b/src/main/java/com/infisical/sdk/resources/AuthClient.java @@ -6,7 +6,6 @@ import com.infisical.sdk.models.LdapAuthLoginInput; import com.infisical.sdk.models.MachineIdentityCredential; import com.infisical.sdk.models.RevokeTokenInput; -import com.infisical.sdk.models.RevokeTokenResponse; import com.infisical.sdk.models.UniversalAuthLoginInput; import com.infisical.sdk.util.Helper; import com.infisical.sdk.util.InfisicalException; @@ -62,7 +61,7 @@ public void SetAccessToken(String accessToken) { this.onAuthenticate.accept(accessToken); } - public RevokeTokenResponse RevokeToken(String accessToken) throws InfisicalException { + public void RevokeToken(String accessToken) throws InfisicalException { RevokeTokenInput input = RevokeTokenInput.builder().accessToken(accessToken).build(); String validationMsg = input.validate(); @@ -71,14 +70,14 @@ public RevokeTokenResponse RevokeToken(String accessToken) throws InfisicalExcep } String url = String.format("%s%s", this.apiClient.GetBaseUrl(), "/api/v1/auth/token/revoke"); - return this.apiClient.post(url, input, RevokeTokenResponse.class); + this.apiClient.post(url, input, Void.class); } /** * Revoke a token by its ID (Token Auth). Uses POST * /api/v1/auth/token-auth/tokens/{tokenId}/revoke. */ - public RevokeTokenResponse RevokeTokenById(String tokenId) throws InfisicalException { + public void RevokeTokenById(String tokenId) throws InfisicalException { if (Helper.isNullOrEmpty(tokenId)) { throw new InfisicalException("Token ID is required"); } @@ -87,6 +86,6 @@ public RevokeTokenResponse RevokeTokenById(String tokenId) throws InfisicalExcep "%s%s", this.apiClient.GetBaseUrl(), String.format("/api/v1/auth/token-auth/tokens/%s/revoke", tokenId)); - return this.apiClient.post(url, RevokeTokenResponse.class); + this.apiClient.post(url, Void.class); } } diff --git a/src/test/java/com/infisical/sdk/resources/AuthClientTest.java b/src/test/java/com/infisical/sdk/resources/AuthClientTest.java index bac4219..b70659f 100644 --- a/src/test/java/com/infisical/sdk/resources/AuthClientTest.java +++ b/src/test/java/com/infisical/sdk/resources/AuthClientTest.java @@ -9,7 +9,6 @@ import com.infisical.sdk.api.ApiClient; import com.infisical.sdk.models.RevokeTokenInput; -import com.infisical.sdk.models.RevokeTokenResponse; import com.infisical.sdk.util.InfisicalException; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -48,7 +47,7 @@ public void RevokeToken_callsPostWithCorrectUrlAndBody() throws InfisicalExcepti verify(apiClient).post( eq("http://localhost/api/v1/auth/token/revoke"), any(RevokeTokenInput.class), - eq(RevokeTokenResponse.class)); + eq(Void.class)); } @Test @@ -72,8 +71,6 @@ public void RevokeTokenById_throwsWhenTokenIdIsEmpty() { @Test public void RevokeTokenById_callsPostWithCorrectUrl() throws InfisicalException { when(apiClient.GetBaseUrl()).thenReturn("http://localhost"); - when(apiClient.post(any(String.class), eq(RevokeTokenResponse.class))) - .thenReturn(new RevokeTokenResponse()); AuthClient authClient = new AuthClient(apiClient, token -> {}); authClient.RevokeTokenById("id-123"); @@ -81,6 +78,6 @@ public void RevokeTokenById_callsPostWithCorrectUrl() throws InfisicalException verify(apiClient) .post( eq("http://localhost/api/v1/auth/token-auth/tokens/id-123/revoke"), - eq(RevokeTokenResponse.class)); + eq(Void.class)); } } From 5a761d0599c551b51e1a2a7a9b32ede0f945af23 Mon Sep 17 00:00:00 2001 From: IgorHorta Date: Wed, 18 Feb 2026 13:59:33 -0300 Subject: [PATCH 3/6] Refactors ApiClient POST method. Removes an unused, duplicated `post` method in `ApiClient`. Introduces a convenience overload that calls `post(String url, Object body, Class responseType)` with an empty Map as the body. This cleans up the API and provides a simple way to make POST requests with an empty JSON body. --- .../java/com/infisical/sdk/api/ApiClient.java | 36 +++---------------- 1 file changed, 5 insertions(+), 31 deletions(-) diff --git a/src/main/java/com/infisical/sdk/api/ApiClient.java b/src/main/java/com/infisical/sdk/api/ApiClient.java index ec3ad11..375f3fe 100644 --- a/src/main/java/com/infisical/sdk/api/ApiClient.java +++ b/src/main/java/com/infisical/sdk/api/ApiClient.java @@ -84,37 +84,6 @@ public R post(String url, T requestBody, Class responseType) throws In } Request request = requestBuilder.build(); - Response response = client.newCall(request).execute(); - try (ResponseBody responseBody = response.body()) { - if (!response.isSuccessful()) { - throw new IOException(this.formatErrorMessage(response)); - } - - if (responseBody == null) { - throw new IOException("Response body is null"); - } - - String responseJson = responseBody.string(); - return gson.fromJson(responseJson, responseType); - } - } catch (IOException e) { - throw new InfisicalException(e); - } - } - - public R post(String url, Class responseType) throws InfisicalException { - try { - Gson gson = new Gson(); - Request.Builder requestBuilder = new Request.Builder() - .url(url) - .post(RequestBody.create(JSON, "{}")) - .header("Accept", "application/json"); - - if (this.accessToken != null && !this.accessToken.isEmpty()) { - requestBuilder.addHeader("Authorization", "Bearer " + this.accessToken); - } - Request request = requestBuilder.build(); - Response response = client.newCall(request).execute(); try (ResponseBody responseBody = response.body()) { if (!response.isSuccessful()) { @@ -136,6 +105,11 @@ public R post(String url, Class responseType) throws InfisicalException { } } + /** POST with empty JSON body. Delegates to {@link #post(String, Object, Class)}. */ + public R post(String url, Class responseType) throws InfisicalException { + return post(url, Map.of(), responseType); + } + public R get(String baseUrl, Map queryParams, Class responseType) throws InfisicalException { try { From cd0d036cc64c0152d78807295af8f4d1a9676a25 Mon Sep 17 00:00:00 2001 From: IgorHorta Date: Wed, 18 Feb 2026 14:29:17 -0300 Subject: [PATCH 4/6] Removes unused Helper dependency from AuthClient. --- .../infisical/sdk/resources/AuthClient.java | 17 ---------- .../sdk/resources/AuthClientTest.java | 31 ------------------- 2 files changed, 48 deletions(-) diff --git a/src/main/java/com/infisical/sdk/resources/AuthClient.java b/src/main/java/com/infisical/sdk/resources/AuthClient.java index 8a5f974..b74ce92 100644 --- a/src/main/java/com/infisical/sdk/resources/AuthClient.java +++ b/src/main/java/com/infisical/sdk/resources/AuthClient.java @@ -7,7 +7,6 @@ import com.infisical.sdk.models.MachineIdentityCredential; import com.infisical.sdk.models.RevokeTokenInput; import com.infisical.sdk.models.UniversalAuthLoginInput; -import com.infisical.sdk.util.Helper; import com.infisical.sdk.util.InfisicalException; import java.util.function.Consumer; @@ -72,20 +71,4 @@ public void RevokeToken(String accessToken) throws InfisicalException { String url = String.format("%s%s", this.apiClient.GetBaseUrl(), "/api/v1/auth/token/revoke"); this.apiClient.post(url, input, Void.class); } - - /** - * Revoke a token by its ID (Token Auth). Uses POST - * /api/v1/auth/token-auth/tokens/{tokenId}/revoke. - */ - public void RevokeTokenById(String tokenId) throws InfisicalException { - if (Helper.isNullOrEmpty(tokenId)) { - throw new InfisicalException("Token ID is required"); - } - - String url = String.format( - "%s%s", - this.apiClient.GetBaseUrl(), - String.format("/api/v1/auth/token-auth/tokens/%s/revoke", tokenId)); - this.apiClient.post(url, Void.class); - } } diff --git a/src/test/java/com/infisical/sdk/resources/AuthClientTest.java b/src/test/java/com/infisical/sdk/resources/AuthClientTest.java index b70659f..8fcef82 100644 --- a/src/test/java/com/infisical/sdk/resources/AuthClientTest.java +++ b/src/test/java/com/infisical/sdk/resources/AuthClientTest.java @@ -49,35 +49,4 @@ public void RevokeToken_callsPostWithCorrectUrlAndBody() throws InfisicalExcepti any(RevokeTokenInput.class), eq(Void.class)); } - - @Test - public void RevokeTokenById_throwsWhenTokenIdIsNull() { - AuthClient authClient = new AuthClient(apiClient, token -> {}); - - InfisicalException ex = - assertThrows(InfisicalException.class, () -> authClient.RevokeTokenById(null)); - assertEquals("Token ID is required", ex.getMessage()); - } - - @Test - public void RevokeTokenById_throwsWhenTokenIdIsEmpty() { - AuthClient authClient = new AuthClient(apiClient, token -> {}); - - InfisicalException ex = - assertThrows(InfisicalException.class, () -> authClient.RevokeTokenById("")); - assertEquals("Token ID is required", ex.getMessage()); - } - - @Test - public void RevokeTokenById_callsPostWithCorrectUrl() throws InfisicalException { - when(apiClient.GetBaseUrl()).thenReturn("http://localhost"); - AuthClient authClient = new AuthClient(apiClient, token -> {}); - - authClient.RevokeTokenById("id-123"); - - verify(apiClient) - .post( - eq("http://localhost/api/v1/auth/token-auth/tokens/id-123/revoke"), - eq(Void.class)); - } } From 783af22e0358b3d9bc9bb1f70c192206b0d119b5 Mon Sep 17 00:00:00 2001 From: IgorHorta Date: Wed, 18 Feb 2026 14:29:17 -0300 Subject: [PATCH 5/6] Uses Collections.emptyMap() for empty POST body. --- src/main/java/com/infisical/sdk/api/ApiClient.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/infisical/sdk/api/ApiClient.java b/src/main/java/com/infisical/sdk/api/ApiClient.java index 375f3fe..118da91 100644 --- a/src/main/java/com/infisical/sdk/api/ApiClient.java +++ b/src/main/java/com/infisical/sdk/api/ApiClient.java @@ -5,6 +5,7 @@ import com.squareup.okhttp.*; import com.squareup.okhttp.Request; import java.io.IOException; +import java.util.Collections; import java.util.Map; public class ApiClient { @@ -107,7 +108,7 @@ public R post(String url, T requestBody, Class responseType) throws In /** POST with empty JSON body. Delegates to {@link #post(String, Object, Class)}. */ public R post(String url, Class responseType) throws InfisicalException { - return post(url, Map.of(), responseType); + return post(url, Collections.emptyMap(), responseType); } public R get(String baseUrl, Map queryParams, Class responseType) From c000d258758334eacdb8f4b76051165807fc3fde Mon Sep 17 00:00:00 2001 From: Daniel Hougaard Date: Thu, 19 Feb 2026 04:03:22 +0400 Subject: [PATCH 6/6] Update ApiClient.java --- src/main/java/com/infisical/sdk/api/ApiClient.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/com/infisical/sdk/api/ApiClient.java b/src/main/java/com/infisical/sdk/api/ApiClient.java index 118da91..ae9e5cb 100644 --- a/src/main/java/com/infisical/sdk/api/ApiClient.java +++ b/src/main/java/com/infisical/sdk/api/ApiClient.java @@ -99,6 +99,11 @@ public R post(String url, T requestBody, Class responseType) throws In if (responseJson == null || responseJson.trim().isEmpty()) { return null; } + + if (responseType == Void.class) { + return null; + } + return gson.fromJson(responseJson, responseType); } } catch (IOException e) {