From 20878ac265cd2bdc9adea4283e2bfbf9c69cf030 Mon Sep 17 00:00:00 2001 From: Daniel Garnier-Moiroux Date: Mon, 18 Aug 2025 11:35:15 +0200 Subject: [PATCH] UaaException: include server error payload Signed-off-by: Daniel Garnier-Moiroux --- .../reactor/util/ErrorPayloadMappers.java | 3 +- .../reactor/util/ErrorPayloadMappersTest.java | 38 +++++++++++++++++-- .../fixtures/uaa/error_response.json | 8 +++- .../org/cloudfoundry/uaa/UaaException.java | 14 ++++++- .../cloudfoundry/uaa/UaaExceptionTest.java | 8 ++-- .../useradmin/DefaultUserAdminTest.java | 7 +++- 6 files changed, 66 insertions(+), 12 deletions(-) diff --git a/cloudfoundry-client-reactor/src/main/java/org/cloudfoundry/reactor/util/ErrorPayloadMappers.java b/cloudfoundry-client-reactor/src/main/java/org/cloudfoundry/reactor/util/ErrorPayloadMappers.java index cb79bd2a99a..282b5ec2e61 100644 --- a/cloudfoundry-client-reactor/src/main/java/org/cloudfoundry/reactor/util/ErrorPayloadMappers.java +++ b/cloudfoundry-client-reactor/src/main/java/org/cloudfoundry/reactor/util/ErrorPayloadMappers.java @@ -101,7 +101,8 @@ public static ErrorPayloadMapper uaa(ObjectMapper objectMapper) { String error = (String) map.get("error"); String errorDescription = (String) map.get("error_description"); - return new UaaException(statusCode, error, errorDescription); + return new UaaException( + statusCode, error, errorDescription, payload); })); } diff --git a/cloudfoundry-client-reactor/src/test/java/org/cloudfoundry/reactor/util/ErrorPayloadMappersTest.java b/cloudfoundry-client-reactor/src/test/java/org/cloudfoundry/reactor/util/ErrorPayloadMappersTest.java index d3f0580cced..099b9cf9185 100644 --- a/cloudfoundry-client-reactor/src/test/java/org/cloudfoundry/reactor/util/ErrorPayloadMappersTest.java +++ b/cloudfoundry-client-reactor/src/test/java/org/cloudfoundry/reactor/util/ErrorPayloadMappersTest.java @@ -327,11 +327,26 @@ void uaaClientError() throws IOException { assertThat(t) .isInstanceOf(UaaException.class) .hasMessage("unauthorized: Bad credentials") - .extracting("statusCode", "error", "errorDescription") + .extracting( + "statusCode", + "error", + "errorDescription", + "payload") .containsExactly( BAD_REQUEST.code(), "unauthorized", - "Bad credentials")) + "Bad credentials", + "{\n" + + " \"error\": \"unauthorized\",\n" + + " \"error_description\": \"Bad" + + " credentials\",\n" + + " \"extra_information\": {\n" + + " \"some\": [\n" + + " \"extra\",\n" + + " \"information\"\n" + + " ]\n" + + " }\n" + + "}\n")) .verify(Duration.ofSeconds(1)); } @@ -370,11 +385,26 @@ void uaaServerError() throws IOException { assertThat(t) .isInstanceOf(UaaException.class) .hasMessage("unauthorized: Bad credentials") - .extracting("statusCode", "error", "errorDescription") + .extracting( + "statusCode", + "error", + "errorDescription", + "payload") .containsExactly( INTERNAL_SERVER_ERROR.code(), "unauthorized", - "Bad credentials")) + "Bad credentials", + "{\n" + + " \"error\": \"unauthorized\",\n" + + " \"error_description\": \"Bad" + + " credentials\",\n" + + " \"extra_information\": {\n" + + " \"some\": [\n" + + " \"extra\",\n" + + " \"information\"\n" + + " ]\n" + + " }\n" + + "}\n")) .verify(Duration.ofSeconds(1)); } diff --git a/cloudfoundry-client-reactor/src/test/resources/fixtures/uaa/error_response.json b/cloudfoundry-client-reactor/src/test/resources/fixtures/uaa/error_response.json index 83dd39f9717..b9d88ffb879 100644 --- a/cloudfoundry-client-reactor/src/test/resources/fixtures/uaa/error_response.json +++ b/cloudfoundry-client-reactor/src/test/resources/fixtures/uaa/error_response.json @@ -1,4 +1,10 @@ { "error": "unauthorized", - "error_description": "Bad credentials" + "error_description": "Bad credentials", + "extra_information": { + "some": [ + "extra", + "information" + ] + } } diff --git a/cloudfoundry-client/src/main/java/org/cloudfoundry/uaa/UaaException.java b/cloudfoundry-client/src/main/java/org/cloudfoundry/uaa/UaaException.java index 6447b3a571c..e961faff1be 100644 --- a/cloudfoundry-client/src/main/java/org/cloudfoundry/uaa/UaaException.java +++ b/cloudfoundry-client/src/main/java/org/cloudfoundry/uaa/UaaException.java @@ -23,12 +23,14 @@ */ public final class UaaException extends AbstractCloudFoundryException { - private static final long serialVersionUID = 2191208398880609800L; + private static final long serialVersionUID = -474523104186506972L; private final String error; private final String errorDescription; + private final String payload; + /** * Creates a new instance * @@ -36,10 +38,11 @@ public final class UaaException extends AbstractCloudFoundryException { * @param error the error * @param errorDescription the error description */ - public UaaException(Integer statusCode, String error, String errorDescription) { + public UaaException(Integer statusCode, String error, String errorDescription, String payload) { super(statusCode, String.format("%s: %s", error, errorDescription)); this.error = error; this.errorDescription = errorDescription; + this.payload = payload; } /** @@ -55,4 +58,11 @@ public String getError() { public String getErrorDescription() { return this.errorDescription; } + + /** + * Returns the full error payload + */ + public String getPayload() { + return payload; + } } diff --git a/cloudfoundry-client/src/test/java/org/cloudfoundry/uaa/UaaExceptionTest.java b/cloudfoundry-client/src/test/java/org/cloudfoundry/uaa/UaaExceptionTest.java index b05d5a0e2dc..9307b404449 100644 --- a/cloudfoundry-client/src/test/java/org/cloudfoundry/uaa/UaaExceptionTest.java +++ b/cloudfoundry-client/src/test/java/org/cloudfoundry/uaa/UaaExceptionTest.java @@ -24,10 +24,12 @@ final class UaaExceptionTest { @Test void test() { - assertThat(new UaaException(-1, "test-error", "test-error-description")) + assertThat( + new UaaException( + -1, "test-error", "test-error-description", "some error payload")) .hasNoCause() .hasMessage("test-error: test-error-description") - .extracting("statusCode", "error", "errorDescription") - .containsExactly(-1, "test-error", "test-error-description"); + .extracting("statusCode", "error", "errorDescription", "payload") + .containsExactly(-1, "test-error", "test-error-description", "some error payload"); } } diff --git a/cloudfoundry-operations/src/test/java/org/cloudfoundry/operations/useradmin/DefaultUserAdminTest.java b/cloudfoundry-operations/src/test/java/org/cloudfoundry/operations/useradmin/DefaultUserAdminTest.java index 886c422a913..2548163ca2e 100644 --- a/cloudfoundry-operations/src/test/java/org/cloudfoundry/operations/useradmin/DefaultUserAdminTest.java +++ b/cloudfoundry-operations/src/test/java/org/cloudfoundry/operations/useradmin/DefaultUserAdminTest.java @@ -704,7 +704,12 @@ private static void requestCreateUaaUserAlreadyExists(UaaClient uaaClient) { .userName("test-username") .build())) .thenReturn( - Mono.error(new UaaException(409, "test-error", "test-error-description"))); + Mono.error( + new UaaException( + 409, + "test-error", + "test-error-description", + "some error payload"))); } private static void requestCreateUser(CloudFoundryClient cloudFoundryClient) {