/*
* Copyright 2017-2020 original authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.micronaut.http.client.exceptions;
import io.micronaut.core.type.Argument;
import io.micronaut.http.HttpResponse;
import io.micronaut.http.HttpStatus;
import io.micronaut.http.MediaType;
import io.micronaut.http.HttpResponseProvider;
import java.util.Optional;
An exception that occurs when a response returns an error code equal to or greater than 400.
Author: Graeme Rocher Since: 1.0
/**
* An exception that occurs when a response returns an error code equal to or greater than 400.
*
* @author Graeme Rocher
* @since 1.0
*/
public class HttpClientResponseException extends HttpClientException implements HttpResponseProvider {
private final HttpResponse<?> response;
private final HttpClientErrorDecoder errorDecoder;
Params: - message – The message
- response – The Http response
/**
* @param message The message
* @param response The Http response
*/
public HttpClientResponseException(String message, HttpResponse<?> response) {
this(message, null, response);
}
Params: - message – The message
- cause – The throwable
- response – The Http response
/**
* @param message The message
* @param cause The throwable
* @param response The Http response
*/
public HttpClientResponseException(String message, Throwable cause, HttpResponse<?> response) {
this(message, cause, response, HttpClientErrorDecoder.DEFAULT);
}
Params: - message – The message
- cause – The throwable
- response – The Http response
- errorDecoder – The error decoder
/**
* @param message The message
* @param cause The throwable
* @param response The Http response
* @param errorDecoder The error decoder
*/
public HttpClientResponseException(String message, Throwable cause, HttpResponse<?> response, HttpClientErrorDecoder errorDecoder) {
super(message, cause);
this.errorDecoder = errorDecoder;
this.response = response;
initResponse(response);
}
@Override
public String getMessage() {
Optional<Argument<?>> errorType = Optional.ofNullable(getErrorType(response));
if (errorType.isPresent()) {
return getResponse().getBody(errorType.get()).flatMap(errorDecoder::getMessage).orElse(super.getMessage());
} else {
return super.getMessage();
}
}
Returns: The HttpResponse
/**
* @return The {@link HttpResponse}
*/
@Override
public HttpResponse<?> getResponse() {
return response;
}
Returns: The HttpStatus
returned
/**
* @return The {@link io.micronaut.http.HttpStatus} returned
*/
public HttpStatus getStatus() {
return getResponse().getStatus();
}
@SuppressWarnings("MagicNumber")
private void initResponse(HttpResponse<?> response) {
Argument<?> errorType = getErrorType(response);
if (errorType != null) {
response.getBody(errorType);
} else {
response.getBody(String.class);
}
}
private Argument<?> getErrorType(HttpResponse<?> response) {
Optional<MediaType> contentType = response.getContentType();
Argument<?> errorType = null;
if (contentType.isPresent() && response.getStatus().getCode() > 399) {
MediaType mediaType = contentType.get();
if (errorDecoder != null) {
errorType = errorDecoder.getErrorType(mediaType);
}
}
return errorType;
}
}