1 package org.onap.ccsdk.apps.filters;
3 import java.io.BufferedReader;
4 import java.io.ByteArrayInputStream;
5 import java.io.CharArrayWriter;
6 import java.io.IOException;
7 import java.io.InputStream;
8 import java.io.InputStreamReader;
9 import java.io.PrintWriter;
10 import java.util.ArrayList;
11 import java.util.Arrays;
12 import java.util.Collection;
13 import java.util.Enumeration;
14 import java.util.HashMap;
15 import java.util.List;
17 import java.util.Map.Entry;
19 import javax.servlet.Filter;
20 import javax.servlet.FilterChain;
21 import javax.servlet.FilterConfig;
22 import javax.servlet.ReadListener;
23 import javax.servlet.ServletException;
24 import javax.servlet.ServletInputStream;
25 import javax.servlet.ServletOutputStream;
26 import javax.servlet.ServletRequest;
27 import javax.servlet.ServletResponse;
28 import javax.servlet.WriteListener;
29 import javax.servlet.http.HttpServletRequest;
30 import javax.servlet.http.HttpServletRequestWrapper;
31 import javax.servlet.http.HttpServletResponse;
32 import javax.servlet.http.HttpServletResponseWrapper;
34 import org.onap.logging.filter.base.AbstractServletFilter;
35 import org.slf4j.Logger;
36 import org.slf4j.LoggerFactory;
37 import org.springframework.stereotype.Component;
40 public class PayloadLoggingFilter extends AbstractServletFilter implements Filter {
42 private static final Logger log = LoggerFactory.getLogger(PayloadLoggingFilter.class);
45 public void init(FilterConfig filterConfig) throws ServletException {
49 public void destroy() {
53 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
54 RequestWrapper req = new RequestWrapper((HttpServletRequest) request);
55 Request requestData = req.getMessageRequest();
57 StringBuilder requestHeaders = new StringBuilder("REQUEST|");
58 requestHeaders.append(requestData.method);
59 requestHeaders.append(":");
60 requestHeaders.append(requestData.uri);
61 requestHeaders.append("|");
62 mapstr(requestHeaders, requestData.headers);
64 log.info(requestHeaders.toString());
65 log.info("REQUEST BODY|{}", requestData.body);
67 ResponseWrapper res = new ResponseWrapper((HttpServletResponse) response);
69 chain.doFilter(req, res);
71 Response responseData = res.getMessageResponse();
73 StringBuilder responseHeaders = new StringBuilder();
74 responseHeaders.append("RESPONSE HEADERS|");
75 mapstr(responseHeaders, responseData.headers);
76 responseHeaders.append("Status:").append(responseData.code);
77 responseHeaders.append(";IsCommitted:").append(res.isCommitted());
79 log.info(responseHeaders.toString());
80 log.info("RESPONSE BODY|{}", responseData.body);
85 private static class Request {
89 public Map<String, Object> headers;
90 public Map<String, Object> param;
94 public String toString() {
95 StringBuilder ss = new StringBuilder();
96 ss.append("REQUEST|").append(method).append(":").append(uri).append("|");
97 ss.append("Headers: ");
99 if (param != null && !param.isEmpty()) {
100 ss.append("Parameters: ");
103 ss.append("REQUEST BODY|\n");
105 return ss.toString();
109 private static class Response {
112 public String message;
113 public Map<String, Object> headers;
117 public String toString() {
118 StringBuilder ss = new StringBuilder();
119 ss.append("HTTP Response: ").append(code).append(" ").append(message).append("\n");
120 ss.append("Headers:\n");
122 ss.append("Body:\n");
124 return ss.toString();
128 private static class RequestWrapper extends HttpServletRequestWrapper {
130 private final String body;
132 public RequestWrapper(HttpServletRequest request) throws IOException {
135 StringBuilder stringBuilder = new StringBuilder();
136 InputStream inputStream = request.getInputStream();
137 if (inputStream != null) {
138 try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream))) {
139 char[] charBuffer = new char[128];
141 while ((bytesRead = bufferedReader.read(charBuffer)) > 0) {
142 stringBuilder.append(charBuffer, 0, bytesRead);
146 body = stringBuilder.toString();
150 public ServletInputStream getInputStream() throws IOException {
151 final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(body.getBytes());
152 ServletInputStream servletInputStream = new ServletInputStream() {
155 public int read() throws IOException {
156 return byteArrayInputStream.read();
160 public boolean isFinished() {
161 return byteArrayInputStream.available() == 0;
165 public boolean isReady() {
170 public void setReadListener(ReadListener listener) {
173 return servletInputStream;
177 public BufferedReader getReader() throws IOException {
178 return new BufferedReader(new InputStreamReader(getInputStream()));
181 public String getBody() {
185 public Request getMessageRequest() {
186 Request r = new Request();
187 r.method = getMethod();
188 r.uri = getRequestURI();
189 r.param = getParamMap();
191 r.headers = new HashMap<>();
192 Enumeration<String> headerNames = getHeaderNames();
193 while (headerNames.hasMoreElements()) {
194 String name = headerNames.nextElement();
196 if (name.equalsIgnoreCase("authorization")) {
197 r.headers.put(name, "***REDACTED***");
201 Enumeration<String> values = getHeaders(name);
202 List<String> valueList = new ArrayList<>();
203 while (values.hasMoreElements()) {
204 valueList.add(values.nextElement());
206 if (valueList.size() > 1) {
207 r.headers.put(name, valueList);
208 } else if (valueList.size() > 0) {
209 r.headers.put(name, valueList.get(0));
218 private Map<String, Object> getParamMap() {
219 Map<String, String[]> parameterMap = getParameterMap();
220 Map<String, Object> paramMap = new HashMap<>();
221 if (parameterMap != null) {
222 for (Entry<String, String[]> entry : parameterMap.entrySet()) {
223 String name = entry.getKey();
224 String[] values = entry.getValue();
225 if (values != null && values.length > 0) {
226 if (values.length == 1) {
227 paramMap.put(name, values[0]);
229 paramMap.put(name, Arrays.<String> asList(values));
238 public class ResponseWrapper extends HttpServletResponseWrapper {
240 private CharArrayWriter writer = new CharArrayWriter();
242 private String statusMessage;
244 public ResponseWrapper(HttpServletResponse response) {
249 public PrintWriter getWriter() {
250 return new PrintWriter(writer);
254 public ServletOutputStream getOutputStream() {
255 return new ServletOutputStream() {
258 public void write(int b) throws IOException {
263 public void setWriteListener(WriteListener listener) {
267 public boolean isReady() {
273 @SuppressWarnings("deprecation")
275 public void setStatus(int sc, String sm) {
276 super.setStatus(sc, sm);
280 public Response getMessageResponse() {
281 Response r = new Response();
282 r.code = getStatus();
283 r.message = statusMessage == null ? "" : statusMessage;
285 r.headers = new HashMap<>();
286 Collection<String> headerNames = getHeaderNames();
287 for (String name : headerNames) {
289 if (name.equalsIgnoreCase("authorization")) {
290 r.headers.put(name, "***REDACTED***");
294 Collection<String> values = getHeaders(name);
295 List<String> valueList = new ArrayList<>(values);
296 if (valueList.size() > 1) {
297 r.headers.put(name, valueList);
299 r.headers.put(name, valueList.get(0));
303 r.body = writer.toString();
308 public void writeBody() throws IOException {
309 String body = writer.toString();
310 setContentLength(body.length());
311 super.getWriter().write(body);
315 private static void mapstr(StringBuilder ss, Map<String, Object> m) {
317 for (Entry<String, Object> entry : m.entrySet()) {
318 ss.append(entry.getKey()).append(": ").append(entry.getValue()).append(";");