View Javadoc

1   /**
2    * Logback: the reliable, generic, fast and flexible logging framework.
3    * Copyright (C) 1999-2009, QOS.ch. All rights reserved.
4    *
5    * This program and the accompanying materials are dual-licensed under
6    * either the terms of the Eclipse Public License v1.0 as published by
7    * the Eclipse Foundation
8    *
9    *   or (per the licensee's choosing)
10   *
11   * under the terms of the GNU Lesser General Public License version 2.1
12   * as published by the Free Software Foundation.
13   */
14  package ch.qos.logback.access.servlet;
15  
16  import java.io.BufferedReader;
17  import java.io.IOException;
18  import java.io.InputStreamReader;
19  
20  import javax.servlet.ServletInputStream;
21  import javax.servlet.http.HttpServletRequest;
22  import javax.servlet.http.HttpServletRequestWrapper;
23  
24  import ch.qos.logback.access.AccessConstants;
25  
26  /**
27   * As the "tee" program on Unix, duplicate the request's input stream.
28   * 
29   * @author Ceki Gülcü
30   */
31  class TeeHttpServletRequest extends HttpServletRequestWrapper {
32  
33    private TeeServletInputStream inStream;
34    private BufferedReader reader;
35    boolean postedParametersMode = false;
36  
37    TeeHttpServletRequest(HttpServletRequest request) {
38      super(request);
39      if (Util.isFormUrlEncoded(request)) {
40        postedParametersMode = true;
41      } else {
42        inStream = new TeeServletInputStream(request);
43        // add the contents of the input buffer as an attribute of the request
44        request
45            .setAttribute(AccessConstants.LB_INPUT_BUFFER, inStream.getInputBuffer());
46        reader = new BufferedReader(new InputStreamReader(inStream));
47      }
48  
49    }
50  
51    byte[] getInputBuffer() {
52      if (postedParametersMode) {
53        throw new IllegalStateException("Call disallowed in postedParametersMode");
54      }
55      return inStream.getInputBuffer();
56    }
57  
58    @Override
59    public ServletInputStream getInputStream() throws IOException {
60      if (!postedParametersMode) {
61        return inStream;
62      } else {
63        return super.getInputStream();
64      }
65    }
66  
67    //
68  
69    @Override
70    public BufferedReader getReader() throws IOException {
71      if (!postedParametersMode) {
72        return reader;
73      } else {
74        return super.getReader();
75      }
76    }
77  
78    public boolean isPostedParametersMode() {
79      return postedParametersMode;
80    }
81  
82  }