View Javadoc

1   package ch.qos.logback.access.servlet;
2   
3   import java.io.BufferedReader;
4   import java.io.IOException;
5   import java.io.InputStreamReader;
6   
7   import javax.servlet.ServletInputStream;
8   import javax.servlet.http.HttpServletRequest;
9   import javax.servlet.http.HttpServletRequestWrapper;
10  
11  import ch.qos.logback.access.AccessConstants;
12  
13  /**
14   * As the "tee" program on Unix, duplicate the request's input stream.
15   * 
16   * @author Ceki Gülcü
17   */
18  class TeeHttpServletRequest extends HttpServletRequestWrapper {
19  
20    private TeeServletInputStream inStream;
21    private BufferedReader reader;
22    boolean postedParametersMode = false;
23  
24    TeeHttpServletRequest(HttpServletRequest request) {
25      super(request);
26      if (Util.isFormUrlEncoded(request)) {
27        postedParametersMode = true;
28      } else {
29        inStream = new TeeServletInputStream(request);
30        // add the contents of the input buffer as an attribute of the request
31        request
32            .setAttribute(AccessConstants.LB_INPUT_BUFFER, inStream.getInputBuffer());
33        reader = new BufferedReader(new InputStreamReader(inStream));
34      }
35  
36    }
37  
38    byte[] getInputBuffer() {
39      if (postedParametersMode) {
40        throw new IllegalStateException("Call disallowed in postedParametersMode");
41      }
42      return inStream.getInputBuffer();
43    }
44  
45    @Override
46    public ServletInputStream getInputStream() throws IOException {
47      if (!postedParametersMode) {
48        return inStream;
49      } else {
50        return super.getInputStream();
51      }
52    }
53  
54    //
55  
56    @Override
57    public BufferedReader getReader() throws IOException {
58      if (!postedParametersMode) {
59        return reader;
60      } else {
61        return super.getReader();
62      }
63    }
64  
65    public boolean isPostedParametersMode() {
66      return postedParametersMode;
67    }
68  
69  }