/*
* Copyright 2009-2010 Markus KARG
*
* This file is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This file is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* For a copy of the GNU Lesser General Public License
* see .
*/
package eu.headcrashing.javax.servlet;
import java.io.IOException;
import java.util.Collections;
import java.util.Enumeration;
import java.util.logging.Logger;
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;
/**
* Implementation of {@link Filter} logging request and response.
*
* @author Markus KARG (markus@headcrashing.eu)
*/
@SuppressWarnings("deprecation")
/*
* When using Servlet API 3.0, replace ReadableHttpServletResponseWrapper by
* HttpServletResponseWrapper
*/
public final class LoggingFilter implements Filter {
private static final Logger LOGGER = Logger.getLogger(LoggingFilter.class.getPackage().getName());
@Override
public void init(final FilterConfig config) throws ServletException {
// Intentionally left blank.
}
@Override
public final void destroy() {
// Intentionally left blank.
}
@Override
public final void doFilter(final ServletRequest request, final ServletResponse response, final FilterChain chain) throws IOException, ServletException {
/*
* This filter is only able to handle HTTP, so we bypass anything else.
*/
if (!(request instanceof HttpServletRequest) || !(response instanceof HttpServletResponse)) {
chain.doFilter(request, response);
return;
}
this.doFilter((HttpServletRequest) request, (HttpServletResponse) response, chain);
}
private final void doFilter(final HttpServletRequest request, final HttpServletResponse response, final FilterChain chain) throws IOException,
ServletException {
this.log(request);
final ReadableHttpServletResponseWrapper wrapper = new ReadableHttpServletResponseWrapper(response);
chain.doFilter(request, wrapper);
this.log(wrapper);
}
@SuppressWarnings("unchecked")
/*
* When using Servlet API 3.0, remove casting to Enumeration, as
* this is the actual return type already.
*/
private final void log(final HttpServletRequest request) {
final StringBuilder message = new StringBuilder();
message.append(String.format("--> %1$s %2$s", request.getMethod(), request.getPathInfo()));
for (final String headerName : Collections.list((Enumeration) request.getHeaderNames()))
for (final String headerValue : Collections.list((Enumeration) request.getHeaders(headerName)))
message.append(String.format(" %s=%s", headerName, headerValue));
LOGGER.fine(message.toString());
}
private final void log(final ReadableHttpServletResponseWrapper response) {
final StringBuilder message = new StringBuilder();
message.append(String.format("<-- %1$d", response.getStatus()));
for (final String headerName : response.getHeaderNames())
for (final String headerValue : response.getHeaders(headerName))
message.append(String.format(" %s=%s", headerName, headerValue));
LOGGER.fine(message.toString());
}
}