diff --git a/photo-service/src/main/java/kr/mafoo/photo/config/RequestBodyCachingFilter.java b/photo-service/src/main/java/kr/mafoo/photo/config/RequestBodyCachingFilter.java new file mode 100644 index 0000000..5321ce6 --- /dev/null +++ b/photo-service/src/main/java/kr/mafoo/photo/config/RequestBodyCachingFilter.java @@ -0,0 +1,46 @@ +package kr.mafoo.photo.config; + +import org.springframework.core.io.buffer.DataBuffer; +import org.springframework.core.io.buffer.DataBufferUtils; +import org.springframework.http.server.reactive.ServerHttpRequest; +import org.springframework.http.server.reactive.ServerHttpRequestDecorator; +import org.springframework.stereotype.Component; +import org.springframework.web.server.ServerWebExchange; +import org.springframework.web.server.ServerWebExchangeDecorator; +import org.springframework.web.server.WebFilter; +import org.springframework.web.server.WebFilterChain; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +@Component +public class RequestBodyCachingFilter implements WebFilter { + + // TODO: 추후 정리 필요 + + @Override + public Mono filter(ServerWebExchange exchange, WebFilterChain chain) { + return DataBufferUtils.join(exchange.getRequest().getBody()) + .flatMap(dataBuffer -> { + byte[] bytes = new byte[dataBuffer.readableByteCount()]; + dataBuffer.read(bytes); + DataBufferUtils.release(dataBuffer); + + ServerHttpRequestDecorator decoratedRequest = new ServerHttpRequestDecorator(exchange.getRequest()) { + @Override + public Flux getBody() { + return Flux.just(exchange.getResponse().bufferFactory().wrap(bytes)); + } + }; + + ServerWebExchangeDecorator decoratedExchange = new ServerWebExchangeDecorator(exchange) { + @Override + public ServerHttpRequest getRequest() { + return decoratedRequest; + } + }; + + return chain.filter(decoratedExchange); + }); + } +} +