/**
* Logback: the reliable, generic, fast and flexible logging framework.
* Copyright (C) 1999-2015, QOS.ch. All rights reserved.
*
* This program and the accompanying materials are dual-licensed under
* either the terms of the Eclipse Public License v1.0 as published by
* the Eclipse Foundation
*
* or (per the licensee's choosing)
*
* under the terms of the GNU Lesser General Public License version 2.1
* as published by the Free Software Foundation.
*/
package ch.qos.logback.access.servlet;
import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import static ch.qos.logback.access.AccessConstants.LB_OUTPUT_BUFFER;
import static ch.qos.logback.access.AccessConstants.TEE_FILTER_INCLUDES_PARAM;
import static ch.qos.logback.access.AccessConstants.TEE_FILTER_EXCLUDES_PARAM;
public class TeeFilter implements Filter {
boolean active;
@Override
public void destroy() {
// NOP
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
if (active && request instanceof HttpServletRequest) {
try {
TeeHttpServletRequest teeRequest = new TeeHttpServletRequest((HttpServletRequest) request);
TeeHttpServletResponse teeResponse = new TeeHttpServletResponse((HttpServletResponse) response);
// System.out.println("BEFORE TeeFilter. filterChain.doFilter()");
filterChain.doFilter(teeRequest, teeResponse);
// System.out.println("AFTER TeeFilter. filterChain.doFilter()");
teeResponse.finish();
// let the output contents be available for later use by
// logback-access-logging
teeRequest.setAttribute(LB_OUTPUT_BUFFER, teeResponse.getOutputBuffer());
} catch (IOException e) {
e.printStackTrace();
throw e;
} catch (ServletException e) {
e.printStackTrace();
throw e;
}
} else {
filterChain.doFilter(request, response);
}
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
String includeListAsStr = filterConfig.getInitParameter(TEE_FILTER_INCLUDES_PARAM);
String excludeListAsStr = filterConfig.getInitParameter(TEE_FILTER_EXCLUDES_PARAM);
String localhostName = getLocalhostName();
active = computeActivation(localhostName, includeListAsStr, excludeListAsStr);
if (active)
System.out.println("TeeFilter will be ACTIVE on this host [" + localhostName + "]");
else
System.out.println("TeeFilter will be DISABLED on this host [" + localhostName + "]");
}
static List<String> extractNameList(String nameListAsStr) {
List<String> nameList = new ArrayList<String>();
if (nameListAsStr == null) {
return nameList;
}
nameListAsStr = nameListAsStr.trim();
if (nameListAsStr.length() == 0) {
return nameList;
}
String[] nameArray = nameListAsStr.split("[,;]");
for (String n : nameArray) {
n = n.trim();
nameList.add(n);
}
return nameList;
}
static String getLocalhostName() {
String hostname = "127.0.0.1";
try {
hostname = InetAddress.getLocalHost().getHostName();
} catch (UnknownHostException uhe) {
uhe.printStackTrace();
}
return hostname;
}
static boolean computeActivation(String hostname, String includeListAsStr, String excludeListAsStr) {
List<String> includeList = extractNameList(includeListAsStr);
List<String> excludeList = extractNameList(excludeListAsStr);
boolean inIncludesList = mathesIncludesList(hostname, includeList);
boolean inExcludesList = mathesExcludesList(hostname, excludeList);
return inIncludesList && (!inExcludesList);
}
static boolean mathesIncludesList(String hostname, List<String> includeList) {
if (includeList.isEmpty())
return true;
return includeList.contains(hostname);
}
static boolean mathesExcludesList(String hostname, List<String> excludesList) {
if (excludesList.isEmpty())
return false;
return excludesList.contains(hostname);
}
}