package de.is24.infrastructure.gridfs.http.web.filter; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponseWrapper; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.io.UnsupportedEncodingException; /** * Code from http://axelfontaine.com/blog/http-head.html */ public class HttpHeadFilter implements Filter { public void init(FilterConfig filterConfig) throws ServletException { } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpServletRequest = (HttpServletRequest) request; if (isHttpHead(httpServletRequest)) { HttpServletResponse httpServletResponse = (HttpServletResponse) response; NoBodyResponseWrapper noBodyResponseWrapper = new NoBodyResponseWrapper(httpServletResponse); chain.doFilter(new ForceGetRequestWrapper(httpServletRequest), noBodyResponseWrapper); noBodyResponseWrapper.setContentLength(); } else { chain.doFilter(request, response); } } public void destroy() { } private boolean isHttpHead(HttpServletRequest request) { return "HEAD".equals(request.getMethod()); } private class ForceGetRequestWrapper extends HttpServletRequestWrapper { public ForceGetRequestWrapper(HttpServletRequest request) { super(request); } public String getMethod() { return "GET"; } } private class NoBodyResponseWrapper extends HttpServletResponseWrapper { private final NoBodyOutputStream noBodyOutputStream = new NoBodyOutputStream(); private PrintWriter writer; public NoBodyResponseWrapper(HttpServletResponse response) { super(response); } public ServletOutputStream getOutputStream() throws IOException { return noBodyOutputStream; } public PrintWriter getWriter() throws UnsupportedEncodingException { if (writer == null) { writer = new PrintWriter(new OutputStreamWriter(noBodyOutputStream, getCharacterEncoding())); } return writer; } void setContentLength() { super.setContentLength(noBodyOutputStream.getContentLength()); } } private class NoBodyOutputStream extends ServletOutputStream { private int contentLength = 0; int getContentLength() { return contentLength; } public void write(int b) { contentLength++; } public void write(byte[] buf, int offset, int len) throws IOException { contentLength += len; } } }