Use existing `WebApplicationException` entity, if available

This commit is contained in:
Chris Eager 2022-12-02 12:14:11 -06:00 committed by Chris Eager
parent 6f844f9ebb
commit 5fb158635c
1 changed files with 20 additions and 1 deletions

View File

@ -5,7 +5,9 @@
package org.whispersystems.textsecuregcm.mappers;
import java.util.Optional;
import java.util.concurrent.CompletionException;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.Response;
import javax.ws.rs.ext.ExceptionMapper;
@ -23,8 +25,25 @@ public class CompletionExceptionMapper implements ExceptionMapper<CompletionExce
final Throwable cause = exception.getCause();
if (cause != null) {
final Class type = cause.getClass();
return providers.getExceptionMapper(type).toResponse(cause);
final ExceptionMapper exceptionMapper = providers.getExceptionMapper(type);
// some exception mappers, like LoggingExceptionMapper, have side effects (e.g., logging)
// so we always build their response
final Response exceptionMapperResponse = exceptionMapper.toResponse(cause);
final Optional<Response> webApplicationExceptionResponse;
if (cause instanceof WebApplicationException webApplicationException) {
webApplicationExceptionResponse = Optional.of(webApplicationException.getResponse());
} else {
webApplicationExceptionResponse = Optional.empty();
}
// but if the exception was a WebApplicationException, and provides an entity, we want to keep it
return webApplicationExceptionResponse
.filter(Response::hasEntity)
.orElse(exceptionMapperResponse);
}
return Response.serverError().build();