shopify request body read

master
Yixian 3 years ago
parent 07dd9a23b6
commit de090c82e3

@ -1,7 +1,6 @@
package au.com.royalpay.payment.manage; package au.com.royalpay.payment.manage;
import org.springframework.web.filter.OncePerRequestFilter; import org.springframework.web.filter.OncePerRequestFilter;
import org.springframework.web.util.ContentCachingRequestWrapper;
import javax.servlet.FilterChain; import javax.servlet.FilterChain;
import javax.servlet.ServletException; import javax.servlet.ServletException;
@ -12,10 +11,10 @@ import java.io.IOException;
public class CacheRequestFilter extends OncePerRequestFilter { public class CacheRequestFilter extends OncePerRequestFilter {
@Override @Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
if (request instanceof ContentCachingRequestWrapper) { if (request instanceof CachedBodyServletRequest) {
filterChain.doFilter(request, response); filterChain.doFilter(request, response);
} else { } else {
ContentCachingRequestWrapper wrappedRequest = new ContentCachingRequestWrapper(request); CachedBodyServletRequest wrappedRequest = new CachedBodyServletRequest(request);
filterChain.doFilter(wrappedRequest, response); filterChain.doFilter(wrappedRequest, response);
} }
} }

@ -0,0 +1,63 @@
package au.com.royalpay.payment.manage;
import org.springframework.util.StreamUtils;
import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.*;
public class CachedBodyServletRequest extends HttpServletRequestWrapper {
private final byte[] content;
public CachedBodyServletRequest(HttpServletRequest request) throws IOException {
super(request);
try (InputStream in = request.getInputStream()) {
content = StreamUtils.copyToByteArray(in);
}
}
@Override
public ServletInputStream getInputStream() throws IOException {
return new CachedBodyServletInputStream(content);
}
@Override
public BufferedReader getReader() throws IOException {
ByteArrayInputStream boi = new ByteArrayInputStream(content);
return new BufferedReader(new InputStreamReader(boi));
}
public static class CachedBodyServletInputStream extends ServletInputStream {
private final InputStream delegate;
public CachedBodyServletInputStream(byte[] content) {
this.delegate = new ByteArrayInputStream(content);
}
@Override
public boolean isFinished() {
try {
return delegate.available() == 0;
} catch (IOException e) {
return true;
}
}
@Override
public boolean isReady() {
return true;
}
@Override
public void setReadListener(ReadListener readListener) {
}
@Override
public int read() throws IOException {
return delegate.read();
}
}
}

@ -1,11 +1,15 @@
package au.com.royalpay.payment.manage.shopify.support; package au.com.royalpay.payment.manage.shopify.support;
import au.com.royalpay.payment.tools.exceptions.ServerErrorException;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.util.StreamUtils;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import java.io.BufferedReader; import java.io.BufferedReader;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
public class ShopifyHttpUtils { public class ShopifyHttpUtils {
private ShopifyHttpUtils() { private ShopifyHttpUtils() {
@ -14,29 +18,12 @@ public class ShopifyHttpUtils {
private static final Logger logger = LoggerFactory.getLogger(ShopifyHttpUtils.class); private static final Logger logger = LoggerFactory.getLogger(ShopifyHttpUtils.class);
public static String getRequestBody(HttpServletRequest request) { public static String getRequestBody(HttpServletRequest request) {
BufferedReader br = null; try (InputStream in = request.getInputStream()) {
StringBuilder sb = new StringBuilder(""); String body = StreamUtils.copyToString(in, StandardCharsets.UTF_8);
try {
br = request.getReader();
String str;
while ((str = br.readLine()) != null) {
sb.append(str);
}
br.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (null != br) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
String body = sb.toString();
logger.debug("Shopify read body |-{}", body); logger.debug("Shopify read body |-{}", body);
return body; return body;
} catch (IOException e) {
throw new ServerErrorException("Failed to read request content");
}
} }
} }

Loading…
Cancel
Save