Implemented an ExchangeFilterFunction, to support Spring WebFlux
[facebook-errors] / src / main / java / de / juplo / facebook / errors / GraphApiExchangeFilterFunction.java
1 package de.juplo.facebook.errors;
2
3
4 import org.springframework.http.HttpStatus;
5 import org.springframework.web.reactive.function.client.ClientRequest;
6 import org.springframework.web.reactive.function.client.ClientResponse;
7 import org.springframework.web.reactive.function.client.ExchangeFilterFunction;
8 import org.springframework.web.reactive.function.client.ExchangeFunction;
9 import org.springframework.web.reactive.function.client.WebClientResponseException;
10 import reactor.core.publisher.Mono;
11
12
13 /**
14  * An {@link ExchangeFilterFunction}
15  * @author Kai Moritz
16  */
17 public class GraphApiExchangeFilterFunction implements ExchangeFilterFunction
18 {
19   @Override
20   public Mono<ClientResponse> filter(ClientRequest request, ExchangeFunction next)
21   {
22     return
23         next
24             .exchange(request)
25             .flatMap(response ->
26             {
27               return
28                   HttpStatus.Series.CLIENT_ERROR.equals(response.statusCode().series())
29                       ? response
30                           .bodyToMono(String.class)
31                           .map(errorBody -> GraphApiException.create(
32                               response.statusCode(),
33                               response.headers().asHttpHeaders(),
34                               errorBody.getBytes()))
35                           .map(e ->
36                               e.getClass().equals(ErrorResponseParsingErrorException.class)
37                                   ? WebClientResponseException
38                                       .create(
39                                           e.getStatus().value(),
40                                           e.getStatus().getReasonPhrase(),
41                                           e.getHeaders(),
42                                           null,
43                                           null)
44                                   : e)
45                           .flatMap(e -> Mono.error(e))
46                       : Mono.just(response);
47             });
48   }
49 }