2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2017 ONAP
6 * ================================================================================
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 * ============LICENSE_END=========================================================
21 package org.onap.ccsdk.sli.core.filters;
23 import java.io.BufferedReader;
24 import java.io.ByteArrayInputStream;
25 import java.io.ByteArrayOutputStream;
26 import java.io.IOException;
27 import java.io.InputStream;
28 import java.io.InputStreamReader;
29 import java.io.PrintWriter;
30 import java.util.Enumeration;
31 import java.util.zip.GZIPInputStream;
33 import javax.servlet.Filter;
34 import javax.servlet.FilterChain;
35 import javax.servlet.FilterConfig;
36 import javax.servlet.ServletException;
37 import javax.servlet.ServletInputStream;
38 import javax.servlet.ServletOutputStream;
39 import javax.servlet.ServletRequest;
40 import javax.servlet.ServletResponse;
41 import javax.servlet.http.HttpServletRequest;
42 import javax.servlet.http.HttpServletRequestWrapper;
43 import javax.servlet.http.HttpServletResponse;
44 import javax.servlet.http.HttpServletResponseWrapper;
46 public class RequestResponseLoggingFilter implements Filter {
48 private static org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger("org.openecomp.sdnc.filters.request.response");
50 private static class ByteArrayServletStream extends ServletOutputStream {
52 ByteArrayOutputStream baos;
54 ByteArrayServletStream(ByteArrayOutputStream baos) {
59 public void write(int param) throws IOException {
64 private static class ByteArrayPrintWriter {
66 private ByteArrayOutputStream baos = new ByteArrayOutputStream();
68 private PrintWriter pw = new PrintWriter(baos);
70 private ServletOutputStream sos = new ByteArrayServletStream(baos);
72 public PrintWriter getWriter() {
76 public ServletOutputStream getStream() {
80 byte[] toByteArray() {
81 return baos.toByteArray();
85 private class BufferedServletInputStream extends ServletInputStream {
87 ByteArrayInputStream bais;
89 public BufferedServletInputStream(ByteArrayInputStream bais) {
94 public int available() {
95 return bais.available();
104 public int read(byte[] buf, int off, int len) {
105 return bais.read(buf, off, len);
110 private class BufferedRequestWrapper extends HttpServletRequestWrapper {
112 ByteArrayInputStream bais;
114 ByteArrayOutputStream baos;
116 BufferedServletInputStream bsis;
120 public BufferedRequestWrapper(HttpServletRequest req) throws IOException {
123 InputStream is = req.getInputStream();
124 baos = new ByteArrayOutputStream();
125 byte buf[] = new byte[1024];
127 while ((letti = is.read(buf)) > 0) {
128 baos.write(buf, 0, letti);
130 buffer = baos.toByteArray();
135 public ServletInputStream getInputStream() {
137 bais = new ByteArrayInputStream(buffer);
138 bsis = new BufferedServletInputStream(bais);
139 } catch (Exception ex) {
140 ex.printStackTrace();
146 public byte[] getBuffer() {
153 public void init(FilterConfig filterConfig) throws ServletException {
157 public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
158 throws IOException, ServletException {
160 final HttpServletRequest httpRequest = (HttpServletRequest) servletRequest;
161 BufferedRequestWrapper bufferedRequest = new BufferedRequestWrapper(httpRequest);
163 StringBuilder requestHeaders = new StringBuilder("REQUEST|");
164 requestHeaders.append(httpRequest.getMethod());
165 requestHeaders.append(":");
166 requestHeaders.append(httpRequest.getRequestURL().toString());
167 requestHeaders.append("|");
169 for (Enumeration<String> e = httpRequest.getHeaderNames(); e.hasMoreElements();) {
170 header = e.nextElement();
171 requestHeaders.append(header);
172 requestHeaders.append(":");
173 requestHeaders.append(httpRequest.getHeader(header));
174 requestHeaders.append(";");
177 log.info(requestHeaders.toString());
179 log.info("REQUEST BODY|" + new String(bufferedRequest.getBuffer()));
181 final HttpServletResponse response = (HttpServletResponse) servletResponse;
183 final ByteArrayPrintWriter pw = new ByteArrayPrintWriter();
184 HttpServletResponse wrappedResp = new HttpServletResponseWrapper(response) {
186 public PrintWriter getWriter() {
187 return pw.getWriter();
191 public ServletOutputStream getOutputStream() {
192 return pw.getStream();
199 filterChain.doFilter(bufferedRequest, wrappedResp);
201 }catch (Exception e){
202 log.error("Chain Exception",e);
205 byte[] bytes = pw.toByteArray();
206 response.getOutputStream().write(bytes);
207 response.getOutputStream().flush();
209 StringBuilder responseHeaders = new StringBuilder("RESPONSE HEADERS|");
211 for (String headerName : response.getHeaderNames()) {
212 responseHeaders.append(headerName);
213 responseHeaders.append(":");
214 responseHeaders.append(response.getHeader(headerName));
215 responseHeaders.append(";");
218 log.info(responseHeaders.toString());
220 if ("gzip".equals(response.getHeader("Content-Encoding"))) {
222 log.info("UNGZIPED RESPONSE BODY|" + decompressGZIPByteArray(bytes));
226 log.info("RESPONSE BODY|" + new String(bytes));
232 public void destroy() {
235 private String decompressGZIPByteArray(byte[] bytes) {
237 BufferedReader in = null;
238 InputStreamReader inR = null;
239 ByteArrayInputStream byteS = null;
240 GZIPInputStream gzS = null;
241 StringBuilder str = new StringBuilder();
243 byteS = new ByteArrayInputStream(bytes);
244 gzS = new GZIPInputStream(byteS);
245 inR = new InputStreamReader(gzS);
246 in = new BufferedReader(inR);
252 while ((content = in.readLine()) != null) {
257 } catch (Exception e) {
258 log.error("Failed get read GZIPInputStream", e);
264 } catch (IOException e1) {
265 log.error("Failed to close ByteStream", e1);
270 } catch (IOException e2) {
271 log.error("Failed to close GZStream", e2);
276 } catch (IOException e3) {
277 log.error("Failed to close InputReader", e3);
282 } catch (IOException e) {
283 log.error("Failed to close BufferedReader", e);
286 return str.toString();