b15932f09d07fb0fba348c6b01a4887a503360f8
[sdnc/core.git] / filters / provider / src / main / java / org / openecomp / sdnc / filters / RequestResponseLoggingFilter.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * openECOMP : SDN-C
4  * ================================================================================
5  * Copyright (C) 2017 AT&T Intellectual Property. All rights
6  *                                              reserved.
7  * ================================================================================
8  * Licensed under the Apache License, Version 2.0 (the "License");
9  * you may not use this file except in compliance with the License.
10  * You may obtain a copy of the License at
11  * 
12  *      http://www.apache.org/licenses/LICENSE-2.0
13  * 
14  * Unless required by applicable law or agreed to in writing, software
15  * distributed under the License is distributed on an "AS IS" BASIS,
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * See the License for the specific language governing permissions and
18  * limitations under the License.
19  * ============LICENSE_END=========================================================
20  */
21
22 package org.openecomp.sdnc.filters;
23
24 import java.io.BufferedReader;
25 import java.io.ByteArrayInputStream;
26 import java.io.ByteArrayOutputStream;
27 import java.io.IOException;
28 import java.io.InputStream;
29 import java.io.InputStreamReader;
30 import java.io.PrintWriter;
31 import java.util.Enumeration;
32 import java.util.zip.GZIPInputStream;
33
34 import javax.servlet.Filter;
35 import javax.servlet.FilterChain;
36 import javax.servlet.FilterConfig;
37 import javax.servlet.ServletException;
38 import javax.servlet.ServletInputStream;
39 import javax.servlet.ServletOutputStream;
40 import javax.servlet.ServletRequest;
41 import javax.servlet.ServletResponse;
42 import javax.servlet.http.HttpServletRequest;
43 import javax.servlet.http.HttpServletRequestWrapper;
44 import javax.servlet.http.HttpServletResponse;
45 import javax.servlet.http.HttpServletResponseWrapper;
46
47 public class RequestResponseLoggingFilter implements Filter {
48
49         private static org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger("org.openecomp.sdnc.filters.request.response");
50
51         private static class ByteArrayServletStream extends ServletOutputStream {
52
53                 ByteArrayOutputStream baos;
54
55                 ByteArrayServletStream(ByteArrayOutputStream baos) {
56                         this.baos = baos;
57                 }
58
59                 @Override
60                 public void write(int param) throws IOException {
61                         baos.write(param);
62                 }
63         }
64
65         private static class ByteArrayPrintWriter {
66
67                 private ByteArrayOutputStream baos = new ByteArrayOutputStream();
68
69                 private PrintWriter pw = new PrintWriter(baos);
70
71                 private ServletOutputStream sos = new ByteArrayServletStream(baos);
72
73                 public PrintWriter getWriter() {
74                         return pw;
75                 }
76
77                 public ServletOutputStream getStream() {
78                         return sos;
79                 }
80
81                 byte[] toByteArray() {
82                         return baos.toByteArray();
83                 }
84         }
85
86         private class BufferedServletInputStream extends ServletInputStream {
87
88                 ByteArrayInputStream bais;
89
90                 public BufferedServletInputStream(ByteArrayInputStream bais) {
91                         this.bais = bais;
92                 }
93
94                 @Override
95                 public int available() {
96                         return bais.available();
97                 }
98
99                 @Override
100                 public int read() {
101                         return bais.read();
102                 }
103
104                 @Override
105                 public int read(byte[] buf, int off, int len) {
106                         return bais.read(buf, off, len);
107                 }
108
109         }
110
111         private class BufferedRequestWrapper extends HttpServletRequestWrapper {
112
113                 ByteArrayInputStream bais;
114
115                 ByteArrayOutputStream baos;
116
117                 BufferedServletInputStream bsis;
118
119                 byte[] buffer;
120
121                 public BufferedRequestWrapper(HttpServletRequest req) throws IOException {
122                         super(req);
123
124                         InputStream is = req.getInputStream();
125                         baos = new ByteArrayOutputStream();
126                         byte buf[] = new byte[1024];
127                         int letti;
128                         while ((letti = is.read(buf)) > 0) {
129                                 baos.write(buf, 0, letti);
130                         }
131                         buffer = baos.toByteArray();
132
133                 }
134
135                 @Override
136                 public ServletInputStream getInputStream() {
137                         try {
138                                 bais = new ByteArrayInputStream(buffer);
139                                 bsis = new BufferedServletInputStream(bais);
140                         } catch (Exception ex) {
141                                 ex.printStackTrace();
142                         }
143
144                         return bsis;
145                 }
146
147                 public byte[] getBuffer() {
148                         return buffer;
149                 }
150
151         }
152
153         @Override
154         public void init(FilterConfig filterConfig) throws ServletException {
155         }
156
157         @Override
158         public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
159                         throws IOException, ServletException {
160
161                 final HttpServletRequest httpRequest = (HttpServletRequest) servletRequest;
162                 BufferedRequestWrapper bufferedRequest = new BufferedRequestWrapper(httpRequest);
163
164                 StringBuilder requestHeaders = new StringBuilder("REQUEST|");
165                 requestHeaders.append(httpRequest.getMethod());
166                 requestHeaders.append(":");
167                 requestHeaders.append(httpRequest.getRequestURL().toString());
168                 requestHeaders.append("|");
169                 String header;
170                 for (Enumeration<String> e = httpRequest.getHeaderNames(); e.hasMoreElements();) {
171                         header = e.nextElement();
172                         requestHeaders.append(header);
173                         requestHeaders.append(":");
174                         requestHeaders.append(httpRequest.getHeader(header));
175                         requestHeaders.append(";");
176
177                 }
178                 log.info(requestHeaders.toString());
179
180                 log.info("REQUEST BODY|" + new String(bufferedRequest.getBuffer()));
181
182                 final HttpServletResponse response = (HttpServletResponse) servletResponse;
183
184                 final ByteArrayPrintWriter pw = new ByteArrayPrintWriter();
185                 HttpServletResponse wrappedResp = new HttpServletResponseWrapper(response) {
186                         @Override
187                         public PrintWriter getWriter() {
188                                 return pw.getWriter();
189                         }
190
191                         @Override
192                         public ServletOutputStream getOutputStream() {
193                                 return pw.getStream();
194                         }
195
196                 };
197
198                 try {
199
200                 filterChain.doFilter(bufferedRequest, wrappedResp);
201
202                 }catch (Exception e){
203                         log.error("Chain Exception",e);
204                         throw e;
205                 } finally {
206                 byte[] bytes = pw.toByteArray();
207                 response.getOutputStream().write(bytes);
208                 response.getOutputStream().flush();
209
210                 StringBuilder responseHeaders = new StringBuilder("RESPONSE HEADERS|");
211
212                 for (String headerName : response.getHeaderNames()) {
213                         responseHeaders.append(headerName);
214                         responseHeaders.append(":");
215                         responseHeaders.append(response.getHeader(headerName));
216                         responseHeaders.append(";");
217
218                 }
219                 log.info(responseHeaders.toString());
220
221                 if ("gzip".equals(response.getHeader("Content-Encoding"))) {
222
223                         log.info("UNGZIPED RESPONSE BODY|" + decompressGZIPByteArray(bytes));
224
225                 } else {
226
227                         log.info("RESPONSE BODY|" + new String(bytes));
228                 }
229                 }
230         }
231
232         @Override
233         public void destroy() {
234         }
235
236         private String decompressGZIPByteArray(byte[] bytes) {
237
238                 BufferedReader in = null;
239                 InputStreamReader inR = null;
240                 ByteArrayInputStream byteS = null;
241                 GZIPInputStream gzS = null;
242                 StringBuilder str = new StringBuilder();
243                 try {
244                         byteS = new ByteArrayInputStream(bytes);
245                         gzS = new GZIPInputStream(byteS);
246                         inR = new InputStreamReader(gzS);
247                         in = new BufferedReader(inR);
248
249                         if (in != null) {
250
251                                 String content;
252
253                                 while ((content = in.readLine()) != null) {
254                                         str.append(content);
255                                 }
256                         }
257
258                 } catch (Exception e) {
259                         log.error("Failed get read GZIPInputStream", e);
260                 } finally {
261
262                         if (byteS != null)
263                                 try {
264                                         byteS.close();
265                                 } catch (IOException e1) {
266                                         log.error("Failed to close ByteStream", e1);
267                                 }
268                         if (gzS != null)
269                                 try {
270                                         gzS.close();
271                                 } catch (IOException e2) {
272                                         log.error("Failed to close GZStream", e2);
273                                 }
274                         if (inR != null)
275                                 try {
276                                         inR.close();
277                                 } catch (IOException e3) {
278                                         log.error("Failed to close InputReader", e3);
279                                 }
280                         if (in != null)
281                                 try {
282                                         in.close();
283                                 } catch (IOException e) {
284                                         log.error("Failed to close BufferedReader", e);
285                                 }
286                 }
287                 return str.toString();
288         }
289 }