001
002package io.vrap.rmf.base.client.error;
003
004import io.vrap.rmf.base.client.ApiHttpException;
005import io.vrap.rmf.base.client.ApiHttpRequest;
006import io.vrap.rmf.base.client.ApiHttpResponse;
007import io.vrap.rmf.base.client.ResponseSerializer;
008import io.vrap.rmf.base.client.http.HttpStatusCode;
009
010/**
011 * The HttpExceptionFactory creates exceptions based on the HTTP status code returned by the {@link ApiHttpResponse}.
012 * It differentiates between client side exceptions (status code 400 to 499) and server side exceptions (status code 500+).
013 */
014public interface HttpExceptionFactory {
015
016    ResponseSerializer getResponseSerializer();
017
018    public default ApiHttpException create(final ApiHttpRequest request, final ApiHttpResponse<byte[]> response) {
019        if (response.getStatusCode() >= HttpStatusCode.INTERNAL_SERVER_ERROR_500) {
020            return createServerException(request, response);
021        }
022        return createClientException(request, response);
023    }
024
025    public default ApiHttpException createServerException(final ApiHttpRequest request,
026            final ApiHttpResponse<byte[]> response) {
027        final ResponseSerializer serializer = getResponseSerializer();
028        String message = "Server error response [url] " + request.getUri().toString() + " [status code] "
029                + response.getStatusCode() + " [reason phrase] " + response.getMessage();
030
031        switch (response.getStatusCode()) {
032            case HttpStatusCode.INTERNAL_SERVER_ERROR_500:
033                return new InternalServerErrorException(response.getStatusCode(), new String(response.getBody()),
034                    request.getHeaders(), message, response, request, serializer);
035            case HttpStatusCode.BAD_GATEWAY_502:
036                return new BadGatewayException(response.getStatusCode(), new String(response.getBody()),
037                    request.getHeaders(), message, response, request, serializer);
038            case HttpStatusCode.SERVICE_UNAVAILABLE_503:
039                return new ServiceUnavailableException(response.getStatusCode(), new String(response.getBody()),
040                    request.getHeaders(), message, response, request, serializer);
041            case HttpStatusCode.GATEWAY_TIMEOUT_504:
042                return new GatewayTimeoutException(response.getStatusCode(), new String(response.getBody()),
043                    request.getHeaders(), message, response, request, serializer);
044        }
045        return new ApiServerException(response.getStatusCode(), new String(response.getBody()), response.getHeaders(),
046            message, response, request);
047    }
048
049    public default ApiHttpException createClientException(ApiHttpRequest request, ApiHttpResponse<byte[]> response) {
050        final ResponseSerializer serializer = getResponseSerializer();
051        String message = "Client error response [url] " + request.getUri().toString() + " [status code] "
052                + response.getStatusCode() + " [reason phrase] " + response.getMessage();
053
054        switch (response.getStatusCode()) {
055            case HttpStatusCode.BAD_REQUEST_400:
056                return new BadRequestException(response.getStatusCode(), new String(response.getBody()),
057                    request.getHeaders(), message, response, request, serializer);
058            case HttpStatusCode.UNAUTHORIZED_401:
059                return new UnauthorizedException(response.getStatusCode(), new String(response.getBody()),
060                    request.getHeaders(), message, response, request, serializer);
061            case HttpStatusCode.FORBIDDEN_403:
062                return new ForbiddenException(response.getStatusCode(), new String(response.getBody()),
063                    request.getHeaders(), message, response, request, serializer);
064            case HttpStatusCode.NOT_FOUND_404:
065                return new NotFoundException(response.getStatusCode(), new String(response.getBody()),
066                    request.getHeaders(), message, response, request, serializer);
067            case HttpStatusCode.CONFLICT_409:
068                return new ConcurrentModificationException(response.getStatusCode(), new String(response.getBody()),
069                    request.getHeaders(), message, response, request, serializer);
070        }
071        return new ApiClientException(response.getStatusCode(), new String(response.getBody()), response.getHeaders(),
072            message, response, request);
073    }
074
075    public static HttpExceptionFactory of(final ResponseSerializer serializer) {
076        return new DefaultHttpExceptionFactory(serializer);
077    }
078}