svn commit: r1240 - logback/trunk/logback-access/src/main/java/ch/qos/logback/access/servlet

Author: ceki Date: Wed Jan 17 14:15:13 2007 New Revision: 1240 Added: logback/trunk/logback-access/src/main/java/ch/qos/logback/access/servlet/ logback/trunk/logback-access/src/main/java/ch/qos/logback/access/servlet/InputStreamDuplicatingFilter.java logback/trunk/logback-access/src/main/java/ch/qos/logback/access/servlet/TeeHttpServletRequest.java logback/trunk/logback-access/src/main/java/ch/qos/logback/access/servlet/TeeServletInputStream.java Log: adding support for HttpServletRequest.inputStream duplication Added: logback/trunk/logback-access/src/main/java/ch/qos/logback/access/servlet/InputStreamDuplicatingFilter.java ============================================================================== --- (empty file) +++ logback/trunk/logback-access/src/main/java/ch/qos/logback/access/servlet/InputStreamDuplicatingFilter.java Wed Jan 17 14:15:13 2007 @@ -0,0 +1,33 @@ +package ch.qos.logback.access.servlet; + +import java.io.IOException; + +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; + +public class InputStreamDuplicatingFilter implements Filter { + + public void destroy() { + // NOP + } + + public void doFilter(ServletRequest request, ServletResponse response, + FilterChain filterChain) throws IOException, ServletException { + + if(request instanceof HttpServletRequest) { + HttpServletRequest httpRequest = (HttpServletRequest) request; + request = new TeeHttpServletRequest(httpRequest); + } + filterChain.doFilter(request, response); + } + + public void init(FilterConfig arg0) throws ServletException { + // NOP + } + +} Added: logback/trunk/logback-access/src/main/java/ch/qos/logback/access/servlet/TeeHttpServletRequest.java ============================================================================== --- (empty file) +++ logback/trunk/logback-access/src/main/java/ch/qos/logback/access/servlet/TeeHttpServletRequest.java Wed Jan 17 14:15:13 2007 @@ -0,0 +1,37 @@ +package ch.qos.logback.access.servlet; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; + +import javax.servlet.ServletInputStream; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletRequestWrapper; + +/** + * As the "tee" program on Unix, duplicate the request's input stream. + * + * @author Ceki Gülcü + */ +public class TeeHttpServletRequest extends HttpServletRequestWrapper { + + static final int BUF_SIZE = 512; + + private ServletInputStream inStream; + private BufferedReader reader; + + public TeeHttpServletRequest(HttpServletRequest request) { + super(request); + inStream = new TeeServletInputStream(request); + reader = new BufferedReader(new InputStreamReader(inStream)); + } + + public ServletInputStream getInputStream() throws IOException { + return inStream; + } + + public BufferedReader getReader() throws IOException { + return reader; + } + +} Added: logback/trunk/logback-access/src/main/java/ch/qos/logback/access/servlet/TeeServletInputStream.java ============================================================================== --- (empty file) +++ logback/trunk/logback-access/src/main/java/ch/qos/logback/access/servlet/TeeServletInputStream.java Wed Jan 17 14:15:13 2007 @@ -0,0 +1,45 @@ +package ch.qos.logback.access.servlet; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; + +import javax.servlet.ServletInputStream; +import javax.servlet.http.HttpServletRequest; + +public class TeeServletInputStream extends ServletInputStream { + + InputStream in; + byte[] inputBuffer; + + TeeServletInputStream(HttpServletRequest request) { + duplicateInputStream(request); + } + + @Override + public int read() throws IOException { + return in.read(); + } + + private void duplicateInputStream(HttpServletRequest request) { + try { + int len = request.getContentLength(); + ServletInputStream originalSIS = request.getInputStream(); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + inputBuffer = new byte[len]; + int n = 0; + while ((n = originalSIS.read(inputBuffer, 0, len)) != -1) { + baos.write(inputBuffer, 0, n); + } + this.in = new ByteArrayInputStream(inputBuffer); + originalSIS.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public byte[] getInputBuffer() { + return inputBuffer; + } +}
participants (1)
-
noreply.ceki@qos.ch