@Component
public class RequestBodyAddCacheGlobalFilter implements GlobalFilter, Ordered {
@Autowired
ApplicationEventPublisher applicationEventPublisher;
@Autowired
ApplicationContext applicationContext;
private final List<HttpMessageReader<?>> messageReaders = HandlerStrategies.withDefaults().messageReaders();
public static final String CACHE_REQUEST_BODY_OBJECT_KEY = "cachedRequestBodyObject";
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
Class inClass = String.class;
Class outClass = String.class;
ServerRequest serverRequest = ServerRequest.create(exchange, messageReaders);
// TODO: flux or mono
Mono<?> bodyMono = serverRequest
.bodyToMono(inClass)
.flatMap(body -> {
exchange.getAttributes().put(CACHE_REQUEST_BODY_OBJECT_KEY, body);
return Mono.just(body);
});
BodyInserter bodyInserter = BodyInserters.fromPublisher(bodyMono, outClass);
HttpHeaders headers = new HttpHeaders();
headers.putAll(exchange.getRequest().getHeaders());
CachedBodyOutputMessage outputMessage = new CachedBodyOutputMessage(exchange, headers);
return bodyInserter.insert(outputMessage, new BodyInserterContext())
.then(Mono.defer(() -> {
ServerHttpRequest decorator = new ServerHttpRequestDecorator(exchange.getRequest()) {
@Override
public Flux<DataBuffer> getBody() {
return outputMessage.getBody();
}
};
return chain.filter(exchange.mutate().request(decorator).build());
}));
}