Refactoring

This commit is contained in:
dahoud
2026-03-01 22:00:28 +00:00
parent c0e2c4da45
commit 6b28cf751e
469 changed files with 26866 additions and 14768 deletions

View File

@@ -1,41 +1,58 @@
package dev.lions.unionflow.client.service;
import jakarta.ws.rs.core.MultivaluedMap;
import jakarta.ws.rs.core.Response;
import org.eclipse.microprofile.rest.client.ext.ResponseExceptionMapper;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
public class RestClientExceptionMapper implements ResponseExceptionMapper<RuntimeException> {
@Override
public RuntimeException toThrowable(Response response) {
int status = response.getStatus();
String reasonPhrase = response.getStatusInfo().getReasonPhrase();
// Lire le corps de la réponse pour plus de détails
String body = "";
java.util.logging.Logger logger = java.util.logging.Logger.getLogger(RestClientExceptionMapper.class.getName());
// Logger l'URL et le statut pour debugging
try {
if (response.hasEntity()) {
body = response.readEntity(String.class);
if (response.getLocation() != null) {
logger.severe("Erreur backend - URL: " + response.getLocation() + " - Status: " + status);
}
} catch (Exception e) {
body = "Impossible de lire le détail de l'erreur";
// Ignorer si on ne peut pas obtenir l'URL
}
// Lire le corps de la réponse pour plus de détails
// SÉCURITÉ: Ne pas exposer les détails des erreurs serveur (5xx) au client
String body = "";
boolean shouldIncludeBody = status >= 400 && status < 500; // Seulement pour erreurs client (4xx)
if (shouldIncludeBody) {
try {
if (response.hasEntity()) {
body = response.readEntity(String.class);
logger.severe("Corps de la réponse (4xx): " + body);
}
} catch (Exception e) {
body = "Impossible de lire le détail de l'erreur";
logger.warning("Impossible de lire le corps de la réponse: " + e.getMessage());
}
}
// Logger toutes les erreurs pour debugging
logger.severe("Erreur backend - HTTP " + status + " (" + reasonPhrase + ")");
return switch (status) {
case 400 -> new BadRequestException("Requête invalide: " + body);
case 401 -> new UnauthorizedException("Non autorisé: " + reasonPhrase);
case 403 -> new ForbiddenException("Accès interdit: " + reasonPhrase);
case 404 -> new NotFoundException("Ressource non trouvée: " + reasonPhrase);
case 401 -> new UnauthorizedException("Non autorisé");
case 403 -> new ForbiddenException("Accès interdit");
case 404 -> new NotFoundException("Ressource non trouvée");
case 409 -> new ConflictException("Conflit: " + body);
case 422 -> new UnprocessableEntityException("Données non valides: " + body);
case 500 -> new InternalServerErrorException("Erreur serveur interne: " + body);
case 502 -> new BadGatewayException("Erreur de passerelle: " + reasonPhrase);
case 503 -> new ServiceUnavailableException("Service indisponible: " + reasonPhrase);
case 504 -> new GatewayTimeoutException("Timeout de passerelle: " + reasonPhrase);
default -> new UnknownHttpStatusException("Erreur HTTP " + status + ": " + reasonPhrase + (body.isEmpty() ? "" : " - " + body));
// SÉCURITÉ: Erreurs 5xx - Messages génériques sans détails backend
case 500 -> new InternalServerErrorException("Erreur serveur interne. Veuillez réessayer ultérieurement.");
case 502 -> new BadGatewayException("Service temporairement indisponible");
case 503 -> new ServiceUnavailableException("Service indisponible. Veuillez réessayer ultérieurement.");
case 504 -> new GatewayTimeoutException("Délai d'attente dépassé. Veuillez réessayer.");
default -> new UnknownHttpStatusException("Une erreur est survenue. Veuillez réessayer.");
};
}
@@ -83,4 +100,4 @@ public class RestClientExceptionMapper implements ResponseExceptionMapper<Runtim
public static class UnknownHttpStatusException extends RuntimeException {
public UnknownHttpStatusException(String message) { super(message); }
}
}
}