diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/filter/CachedHttpServletRequest.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/filter/CachedHttpServletRequest.java new file mode 100644 index 000000000..6befa668c --- /dev/null +++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/filter/CachedHttpServletRequest.java @@ -0,0 +1,33 @@ +package ru.spcex.clearing.backendapi.filter; + +import java.io.BufferedReader; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import javax.servlet.ServletInputStream; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletRequestWrapper; +import org.springframework.util.StreamUtils; + +public class CachedHttpServletRequest extends HttpServletRequestWrapper { + + private byte[] cachedPayload; + + public CachedHttpServletRequest(HttpServletRequest request) throws IOException { + super(request); + InputStream requestInputStream = request.getInputStream(); + this.cachedPayload = StreamUtils.copyToByteArray(requestInputStream); + } + + @Override + public ServletInputStream getInputStream() { + return new CachedServletInputStream(this.cachedPayload); + } + + @Override + public BufferedReader getReader() { + ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(this.cachedPayload); + return new BufferedReader(new InputStreamReader(byteArrayInputStream)); + } +} diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/filter/CachedServletInputStream.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/filter/CachedServletInputStream.java new file mode 100644 index 000000000..60cb8d3e5 --- /dev/null +++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/filter/CachedServletInputStream.java @@ -0,0 +1,43 @@ +package ru.spcex.clearing.backendapi.filter; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import javax.servlet.ReadListener; +import javax.servlet.ServletInputStream; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class CachedServletInputStream extends ServletInputStream { + private final Logger log = LoggerFactory.getLogger(getClass()); + private InputStream cachedInputStream; + + public CachedServletInputStream(byte[] cachedBody) { + this.cachedInputStream = new ByteArrayInputStream(cachedBody); + } + + @Override + public boolean isFinished() { + try { + return cachedInputStream.available() == 0; + } catch (IOException exp) { + log.error(exp.getMessage()); + } + return false; + } + + @Override + public boolean isReady() { + return true; + } + + @Override + public void setReadListener(ReadListener readListener) { + throw new UnsupportedOperationException(); + } + + @Override + public int read() throws IOException { + return cachedInputStream.read(); + } +} diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/filter/RequestCachingFilter.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/filter/RequestCachingFilter.java new file mode 100644 index 000000000..793b12241 --- /dev/null +++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/filter/RequestCachingFilter.java @@ -0,0 +1,40 @@ +package ru.spcex.clearing.backendapi.filter; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.annotation.WebFilter; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; +import org.springframework.util.StreamUtils; +import org.springframework.web.filter.OncePerRequestFilter; + + +@Order(value = Ordered.HIGHEST_PRECEDENCE) +@Component +@WebFilter(filterName = "RequestCachingFilter", urlPatterns = "/*") +public class RequestCachingFilter extends OncePerRequestFilter { + + private final Logger log = LoggerFactory.getLogger(getClass()); + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, + FilterChain filterChain) throws ServletException, IOException { + CachedHttpServletRequest cachedHttpServletRequest = new CachedHttpServletRequest(request); + + if (log.isDebugEnabled()) { + log.debug("received {} request, destination '{}', body: {}", + request.getMethod(), + request.getContextPath() + request.getServletPath(), + StreamUtils.copyToString(cachedHttpServletRequest.getInputStream(), StandardCharsets.UTF_8) + ); + } + filterChain.doFilter(cachedHttpServletRequest, response); + } +}