package io.lumify.web;
import io.lumify.core.util.LumifyLogger;
import io.lumify.core.util.LumifyLoggerFactory;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class RequestDebugFilter implements Filter {
private static final LumifyLogger LOGGER = LumifyLoggerFactory.getLogger(RequestDebugFilter.class);
public static final String LUMIFY_REQUEST_DEBUG = "lumify.request.debug";
public static final String HEADER_DELAY = "Lumify-Request-Delay-Millis";
public static final String HEADER_ERROR = "Lumify-Request-Error";
static {
if ("true".equals(System.getProperty(LUMIFY_REQUEST_DEBUG))) {
LOGGER.warn("Request debugging is enabled. Set -D%s=false to disable", LUMIFY_REQUEST_DEBUG);
}
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
if ("true".equals(System.getProperty(LUMIFY_REQUEST_DEBUG))) {
if (processDebugCommands(request, response)) {
return;
}
}
chain.doFilter(request, response);
}
private boolean processDebugCommands(ServletRequest request, ServletResponse response) throws IOException {
if (request instanceof HttpServletRequest && response instanceof HttpServletResponse) {
HttpServletRequest httpRequest = (HttpServletRequest) request;
HttpServletResponse httpResponse = (HttpServletResponse) response;
String delay = httpRequest.getHeader(HEADER_DELAY);
String error = httpRequest.getHeader(HEADER_ERROR);
if (delay != null) {
try {
LOGGER.warn("Lumify Debug Header Found %s. Delaying for %s", HEADER_DELAY, delay);
Thread.sleep(Integer.parseInt(delay));
} catch (InterruptedException e) { }
}
if (error != null) {
LOGGER.warn("Lumify Debug Header Found %s. Sending error instead: %s", HEADER_DELAY, error);
Integer code = Integer.parseInt(error);
((HttpServletResponse) response).sendError(code);
return true;
}
}
return false;
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void destroy() {
}
}