package hu.sch.api.filter;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import org.apache.commons.io.IOUtils;
/**
*
* @author tomi
*/
public class RereadableHttpServletRequestWrapper extends HttpServletRequestWrapper {
private byte[] rawBody = null;
private HttpServletRequest request;
public RereadableHttpServletRequestWrapper(HttpServletRequest request) {
super(request);
this.request = request;
}
public byte[] getRawBody() throws IOException {
if (rawBody == null) {
rawBody = IOUtils.toByteArray(request.getInputStream());
}
return rawBody;
}
@Override
public ServletInputStream getInputStream() throws IOException {
return new ByteServletInputStream(getRawBody());
}
@Override
public BufferedReader getReader() throws IOException {
return new BufferedReader(new InputStreamReader(getInputStream()));
}
private static class ByteServletInputStream extends ServletInputStream {
private ByteArrayInputStream stream;
ByteServletInputStream(byte[] content) {
stream = new ByteArrayInputStream(content);
}
@Override
public int read() throws IOException {
return stream.read();
}
@Override
public boolean isFinished() {
return stream.available() == 0;
}
@Override
public boolean isReady() {
return true;
}
@Override
public void setReadListener(ReadListener rl) {
throw new UnsupportedOperationException("read listener is not supported");
}
}
}