Implemented an ExchangeFilterFunction, to support Spring WebFlux
[facebook-errors] / src / main / java / de / juplo / facebook / errors / GraphApiExchangeFilterFunction.java
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 (file)
index 0000000..34ca5a7
--- /dev/null
@@ -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<ClientResponse> 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);
+            });
+  }
+}