2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2017 AT&T Intellectual Property. All rights
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
12 * http://www.apache.org/licenses/LICENSE-2.0
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=========================================================
22 package org.openecomp.sdnc.filters;
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.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;
45 import org.slf4j.Logger;
46 import org.slf4j.LoggerFactory;
47 import org.openecomp.sdnc.sli.MessageWriter;
49 public class RequestResponseDbLoggingFilter implements Filter {
51 private static Logger log = LoggerFactory.getLogger(RequestResponseDbLoggingFilter.class);
53 public static final String REQUEST_ID = "X-ECOMP-RequestID";
55 private static class ByteArrayServletStream extends ServletOutputStream {
57 ByteArrayOutputStream baos;
59 ByteArrayServletStream(ByteArrayOutputStream baos) {
64 public void write(int param) throws IOException {
69 private static class ByteArrayPrintWriter {
71 private ByteArrayOutputStream baos = new ByteArrayOutputStream();
73 private PrintWriter pw = new PrintWriter(baos);
75 private ServletOutputStream sos = new ByteArrayServletStream(baos);
77 public PrintWriter getWriter() {
81 public ServletOutputStream getStream() {
85 byte[] toByteArray() {
86 return baos.toByteArray();
90 private class BufferedServletInputStream extends ServletInputStream {
92 ByteArrayInputStream bais;
94 public BufferedServletInputStream(ByteArrayInputStream bais) {
99 public int available() {
100 return bais.available();
109 public int read(byte[] buf, int off, int len) {
110 return bais.read(buf, off, len);
115 private class BufferedRequestWrapper extends HttpServletRequestWrapper {
117 ByteArrayInputStream bais;
119 ByteArrayOutputStream baos;
121 BufferedServletInputStream bsis;
125 public BufferedRequestWrapper(HttpServletRequest req) throws IOException {
128 InputStream is = req.getInputStream();
129 baos = new ByteArrayOutputStream();
130 byte buf[] = new byte[1024];
132 while ((letti = is.read(buf)) > 0) {
133 baos.write(buf, 0, letti);
135 buffer = baos.toByteArray();
140 public ServletInputStream getInputStream() {
142 bais = new ByteArrayInputStream(buffer);
143 bsis = new BufferedServletInputStream(bais);
144 } catch (Exception ex) {
145 ex.printStackTrace();
151 public byte[] getBuffer() {
158 public void init(FilterConfig filterConfig) throws ServletException {
162 public void doFilter(final ServletRequest request, final ServletResponse response, final FilterChain filterChain)
163 throws IOException, ServletException {
165 if (request == null || !(request instanceof HttpServletRequest)) {
166 filterChain.doFilter(request, response);
170 long t1 = System.currentTimeMillis();
172 final HttpServletRequest httpRequest = (HttpServletRequest) request;
173 BufferedRequestWrapper bufferedRequest = new BufferedRequestWrapper(httpRequest);
175 String requestId = httpRequest.getHeader(REQUEST_ID);
176 if (requestId == null || requestId.trim().length() == 0) {
177 log.warn("Could not write request in DB: " + REQUEST_ID + " is missing in the HTTP headers.");
181 String requestHost = request.getRemoteHost();
182 if (requestHost == null)
183 requestHost = request.getRemoteAddr();
185 String requestStr = new String(bufferedRequest.getBuffer());
187 MessageWriter.saveIncomingRequest(requestId, null, requestHost, requestStr);
189 long t2 = System.currentTimeMillis();
191 log.info("Request saved in DB for request-id: " + requestId + ". TIme: " + (t2 - t1));
193 final HttpServletResponse httpResponse = (HttpServletResponse) response;
195 final ByteArrayPrintWriter pw = new ByteArrayPrintWriter();
196 HttpServletResponse wrappedResp = new HttpServletResponseWrapper(httpResponse) {
199 public PrintWriter getWriter() {
200 return pw.getWriter();
204 public ServletOutputStream getOutputStream() {
205 return pw.getStream();
211 filterChain.doFilter(bufferedRequest, wrappedResp);
215 if (request instanceof HttpServletRequest) {
217 t1 = System.currentTimeMillis();
219 byte[] bytes = pw.toByteArray();
220 response.getOutputStream().write(bytes);
221 response.getOutputStream().flush();
223 String responseStr = null;
224 if ("gzip".equals(httpResponse.getHeader("Content-Encoding"))) {
225 responseStr = decompressGZIPByteArray(bytes);
227 responseStr = new String(bytes);
230 MessageWriter.saveIncomingResponse(requestId, httpResponse.getStatus(), responseStr);
232 t2 = System.currentTimeMillis();
234 log.info("Response saved in DB for request-id: " + requestId + ". TIme: " + (t2 - t1));
241 public void destroy() {
244 private String decompressGZIPByteArray(byte[] bytes) {
246 StringBuilder str = new StringBuilder();
247 try (ByteArrayInputStream byteS = new ByteArrayInputStream(bytes);
248 GZIPInputStream gzS = new GZIPInputStream(byteS);
249 InputStreamReader inR = new InputStreamReader(gzS);
250 BufferedReader in = new BufferedReader(inR);) {
254 while ((content = in.readLine()) != null) {
258 } catch (Exception e) {
259 log.error("Failed get read GZIPInputStream", e);
262 return str.toString();