From 0426e91e7b0b79fc20c9dfce5b9839223beb4e58 Mon Sep 17 00:00:00 2001 From: Thomas Darimont Date: Fri, 25 Oct 2024 12:56:33 +0200 Subject: [PATCH] CreatedResponseUtil.getCreatedId should expose server error message (#34343) We now expose the actual error message found in the response if present. Fixes #34343 Signed-off-by: Thomas Darimont (cherry picked from commit d94e388047418549d7228280782e804087b2586e) --- .../admin/client/CreatedResponseUtil.java | 24 ++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/integration/admin-client/src/main/java/org/keycloak/admin/client/CreatedResponseUtil.java b/integration/admin-client/src/main/java/org/keycloak/admin/client/CreatedResponseUtil.java index 1111783965..f154a297af 100644 --- a/integration/admin-client/src/main/java/org/keycloak/admin/client/CreatedResponseUtil.java +++ b/integration/admin-client/src/main/java/org/keycloak/admin/client/CreatedResponseUtil.java @@ -17,8 +17,11 @@ package org.keycloak.admin.client; import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.HttpHeaders; +import jakarta.ws.rs.core.MediaType; import jakarta.ws.rs.core.Response; import java.net.URI; +import java.util.Map; /** * A Utility class that parses the Response object into the underlying ID attribute @@ -39,9 +42,24 @@ public class CreatedResponseUtil { URI location = response.getLocation(); if (!response.getStatusInfo().equals(Response.Status.CREATED)) { Response.StatusType statusInfo = response.getStatusInfo(); - throw new WebApplicationException("Create method returned status " + - statusInfo.getReasonPhrase() + " (Code: " + statusInfo.getStatusCode() + "); " + - "expected status: Created (201)", response); + String contentType = response.getHeaderString(HttpHeaders.CONTENT_TYPE); + String errorMessage = "Create method returned status " + + statusInfo.getReasonPhrase() + " (Code: " + statusInfo.getStatusCode() + "); " + + "expected status: Created (201)."; + if (MediaType.APPLICATION_JSON.equals(contentType)) { + // try to add actual server error message to the exception message + try { + @SuppressWarnings("raw") + Map responseBody = response.readEntity(Map.class); + if (responseBody != null && responseBody.containsKey("errorMessage")) { + errorMessage += " ErrorMessage: " + responseBody.get("errorMessage"); + } + } catch(Exception ignored) { + // ignore if we couldn't parse the response + } + } + + throw new WebApplicationException(errorMessage, response); } if (location == null) { return null;