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}