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 jakarta.servlet.Filter;
20 import jakarta.servlet.FilterChain;
21 import jakarta.servlet.FilterConfig;
22 import jakarta.servlet.ReadListener;
23 import jakarta.servlet.ServletException;
24 import jakarta.servlet.ServletInputStream;
25 import jakarta.servlet.ServletOutputStream;
26 import jakarta.servlet.ServletRequest;
27 import jakarta.servlet.ServletResponse;
28 import jakarta.servlet.WriteListener;
29 import jakarta.servlet.http.HttpServletRequest;
30 import jakarta.servlet.http.HttpServletRequestWrapper;
31 import jakarta.servlet.http.HttpServletResponse;
32 import jakarta.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;
39 public class PayloadLoggingFilter extends AbstractServletFilter implements Filter {
41 private static final Logger log = LoggerFactory.getLogger(PayloadLoggingFilter.class);
44 public void init(FilterConfig filterConfig) throws ServletException {
48 public void destroy() {
52 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
53 RequestWrapper req = new RequestWrapper((HttpServletRequest) request);
54 Request requestData = req.getMessageRequest();
56 StringBuilder requestHeaders = new StringBuilder("REQUEST|");
57 requestHeaders.append(requestData.method);
58 requestHeaders.append(":");
59 requestHeaders.append(requestData.uri);
60 requestHeaders.append("|");
61 mapstr(requestHeaders, requestData.headers);
63 log.info(requestHeaders.toString());
64 log.info("REQUEST BODY|{}", requestData.body);
66 ResponseWrapper res = new ResponseWrapper((HttpServletResponse) response);
68 chain.doFilter(req, res);
70 Response responseData = res.getMessageResponse();
72 StringBuilder responseHeaders = new StringBuilder();
73 responseHeaders.append("RESPONSE HEADERS|");
74 mapstr(responseHeaders, responseData.headers);
75 responseHeaders.append("Status:").append(responseData.code);
76 responseHeaders.append(";IsCommitted:").append(res.isCommitted());
78 log.info(responseHeaders.toString());
79 log.info("RESPONSE BODY|{}", responseData.body);
84 private static class Request {
88 public Map<String, Object> headers;
89 public Map<String, Object> param;
93 public String toString() {
94 StringBuilder ss = new StringBuilder();
95 ss.append("REQUEST|").append(method).append(":").append(uri).append("|");
96 ss.append("Headers: ");
98 if (param != null && !param.isEmpty()) {
99 ss.append("Parameters: ");
102 ss.append("REQUEST BODY|\n");
104 return ss.toString();
108 private static class Response {
111 public String message;
112 public Map<String, Object> headers;
116 public String toString() {
117 StringBuilder ss = new StringBuilder();
118 ss.append("HTTP Response: ").append(code).append(" ").append(message).append("\n");
119 ss.append("Headers:\n");
121 ss.append("Body:\n");
123 return ss.toString();
127 private static class RequestWrapper extends HttpServletRequestWrapper {
129 private final String body;
131 public RequestWrapper(HttpServletRequest request) throws IOException {
134 StringBuilder stringBuilder = new StringBuilder();
135 InputStream inputStream = request.getInputStream();
136 if (inputStream != null) {
137 try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream))) {
138 char[] charBuffer = new char[128];
140 while ((bytesRead = bufferedReader.read(charBuffer)) > 0) {
141 stringBuilder.append(charBuffer, 0, bytesRead);
145 body = stringBuilder.toString();
149 public ServletInputStream getInputStream() throws IOException {
150 final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(body.getBytes());
151 ServletInputStream servletInputStream = new ServletInputStream() {
154 public int read() throws IOException {
155 return byteArrayInputStream.read();
159 public boolean isFinished() {
160 return byteArrayInputStream.available() == 0;
164 public boolean isReady() {
169 public void setReadListener(ReadListener listener) {
172 return servletInputStream;
176 public BufferedReader getReader() throws IOException {
177 return new BufferedReader(new InputStreamReader(getInputStream()));
180 public String getBody() {
184 public Request getMessageRequest() {
185 Request r = new Request();
186 r.method = getMethod();
187 r.uri = getRequestURI();
188 r.param = getParamMap();
190 r.headers = new HashMap<>();
191 Enumeration<String> headerNames = getHeaderNames();
192 while (headerNames.hasMoreElements()) {
193 String name = headerNames.nextElement();
195 if (name.equalsIgnoreCase("authorization")) {
196 r.headers.put(name, "***REDACTED***");
200 Enumeration<String> values = getHeaders(name);
201 List<String> valueList = new ArrayList<>();
202 while (values.hasMoreElements()) {
203 valueList.add(values.nextElement());
205 if (valueList.size() > 1) {
206 r.headers.put(name, valueList);
207 } else if (valueList.size() > 0) {
208 r.headers.put(name, valueList.get(0));
217 private Map<String, Object> getParamMap() {
218 Map<String, String[]> parameterMap = getParameterMap();
219 Map<String, Object> paramMap = new HashMap<>();
220 if (parameterMap != null) {
221 for (Entry<String, String[]> entry : parameterMap.entrySet()) {
222 String name = entry.getKey();
223 String[] values = entry.getValue();
224 if (values != null && values.length > 0) {
225 if (values.length == 1) {
226 paramMap.put(name, values[0]);
228 paramMap.put(name, Arrays.<String> asList(values));
237 public class ResponseWrapper extends HttpServletResponseWrapper {
239 private CharArrayWriter writer = new CharArrayWriter();
241 private String statusMessage;
243 public ResponseWrapper(HttpServletResponse response) {
248 public PrintWriter getWriter() {
249 return new PrintWriter(writer);
253 public ServletOutputStream getOutputStream() {
254 return new ServletOutputStream() {
257 public void write(int b) throws IOException {
262 public void setWriteListener(WriteListener listener) {
266 public boolean isReady() {
272 @SuppressWarnings("deprecation")
274 public void setStatus(int sc) {
278 public Response getMessageResponse() {
279 Response r = new Response();
280 r.code = getStatus();
281 r.message = statusMessage == null ? "" : statusMessage;
283 r.headers = new HashMap<>();
284 Collection<String> headerNames = getHeaderNames();
285 for (String name : headerNames) {
287 if (name.equalsIgnoreCase("authorization")) {
288 r.headers.put(name, "***REDACTED***");
292 Collection<String> values = getHeaders(name);
293 List<String> valueList = new ArrayList<>(values);
294 if (valueList.size() > 1) {
295 r.headers.put(name, valueList);
297 r.headers.put(name, valueList.get(0));
301 r.body = writer.toString();
306 public void writeBody() throws IOException {
307 String body = writer.toString();
308 setContentLength(body.length());
309 super.getWriter().write(body);
313 private static void mapstr(StringBuilder ss, Map<String, Object> m) {
315 for (Entry<String, Object> entry : m.entrySet()) {
316 ss.append(entry.getKey()).append(": ").append(entry.getValue()).append(";");