Search This Blog

Monday, 6 May 2013

Read InputStream twice from HttpRequest


package xxx.xxx.xxx;

import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.security.cert.X509Certificate;
import java.util.HashMap;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.io.IOUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.sun.xml.internal.ws.util.ByteArrayBuffer;

/**
 *
 * @author Atul Kumar
 */
public class AuthenticationFilter implements Filter {

private final Log log = LogFactory.getLog(this.getClass());
private static final int buffSize = 4096;

@Override
public void destroy() {
log.debug("Authentication Filter Destroyed");
}

// convert InputStream to String
private static String getStringFromInputStream(HttpServletRequestWrapperX httpRequest) {

ByteArrayOutputStream baos = new ByteArrayOutputStream();
try {
IOUtils.copy(httpRequest.getInputStream(), baos);
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
byte[] bytes = baos.toByteArray();
return new String(bytes);
}

@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain filterChain) throws IOException, ServletException {
log.info("Authentication Filter doFilter called");
// HttpServletRequest httpRequest2 = (HttpServletRequest) request;
HttpServletResponse httpResponse = (HttpServletResponse) response;


HttpServletRequestWrapperX httpRequest = new HttpServletRequestWrapperX(
(HttpServletRequest) request);
log.debug("In filter  - " + getStringFromInputStream(httpRequest));

filterChain.doFilter(httpRequest, response);
}
}

@Override
public void init(FilterConfig arg0) throws ServletException {
log.info("Authentication Filter Initialized");
}

private static class HttpServletRequestWrapperX
extends
HttpServletRequestWrapper  {

private final String body;

public HttpServletRequestWrapperX(HttpServletRequest request) {
super(request);

StringBuilder stringBuilder = new StringBuilder();
BufferedReader bufferedReader = null;

try {
InputStream inputStream = request.getInputStream();

if (inputStream != null) {
bufferedReader = new BufferedReader(new InputStreamReader(
inputStream));

char[] charBuffer = new char[128];
int bytesRead = -1;

while ((bytesRead = bufferedReader.read(charBuffer)) > 0) {
stringBuilder.append(charBuffer, 0, bytesRead);
}
} else {
stringBuilder.append("");
}
} catch (IOException ex) {
} finally {
if (bufferedReader != null) {
try {
bufferedReader.close();
} catch (IOException ex) {
}
}
}

body = stringBuilder.toString();
}

@Override
public ServletInputStream getInputStream() throws IOException {
final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(
body.getBytes());

ServletInputStream inputStream = new ServletInputStream() {
public int read() throws IOException {
return byteArrayInputStream.read();
}
};

return inputStream;
}
}
}