X-Git-Url: https://juplo.de/gitweb/?p=facebook-errors;a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fde%2Fjuplo%2Ffacebook%2Ferrors%2FGraphApiExchangeFilterFunction.java;fp=src%2Fmain%2Fjava%2Fde%2Fjuplo%2Ffacebook%2Ferrors%2FGraphApiExchangeFilterFunction.java;h=34ca5a71ef8d23cffd86f5ef442dc99d0dcfce1b;hp=0000000000000000000000000000000000000000;hb=73befa702f8e175b2aac88e0b1db241d1e623449;hpb=c575534b004c0864b6c84f3c9d5405cf39639f63 diff --git a/src/main/java/de/juplo/facebook/errors/GraphApiExchangeFilterFunction.java b/src/main/java/de/juplo/facebook/errors/GraphApiExchangeFilterFunction.java new file mode 100644 index 0000000..34ca5a7 --- /dev/null +++ b/src/main/java/de/juplo/facebook/errors/GraphApiExchangeFilterFunction.java @@ -0,0 +1,49 @@ +package de.juplo.facebook.errors; + + +import org.springframework.http.HttpStatus; +import org.springframework.web.reactive.function.client.ClientRequest; +import org.springframework.web.reactive.function.client.ClientResponse; +import org.springframework.web.reactive.function.client.ExchangeFilterFunction; +import org.springframework.web.reactive.function.client.ExchangeFunction; +import org.springframework.web.reactive.function.client.WebClientResponseException; +import reactor.core.publisher.Mono; + + +/** + * An {@link ExchangeFilterFunction} + * @author Kai Moritz + */ +public class GraphApiExchangeFilterFunction implements ExchangeFilterFunction +{ + @Override + public Mono filter(ClientRequest request, ExchangeFunction next) + { + return + next + .exchange(request) + .flatMap(response -> + { + return + HttpStatus.Series.CLIENT_ERROR.equals(response.statusCode().series()) + ? response + .bodyToMono(String.class) + .map(errorBody -> GraphApiException.create( + response.statusCode(), + response.headers().asHttpHeaders(), + errorBody.getBytes())) + .map(e -> + e.getClass().equals(ErrorResponseParsingErrorException.class) + ? WebClientResponseException + .create( + e.getStatus().value(), + e.getStatus().getReasonPhrase(), + e.getHeaders(), + null, + null) + : e) + .flatMap(e -> Mono.error(e)) + : Mono.just(response); + }); + } +}