/** * Copyright (c) 2011-2012, Thilo Planz. All rights reserved. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program 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 Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package v7db.files.milton; import java.io.IOException; import java.util.Properties; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.slf4j.MDC; import v7db.files.Configuration; import com.bradmcevoy.http.AuthenticationService; import com.bradmcevoy.http.Handler; import com.bradmcevoy.http.HttpExtension; import com.bradmcevoy.http.http11.Http11Protocol; import com.bradmcevoy.http.webdav.DefaultWebDavResponseHandler; public class MiltonServlet extends com.bradmcevoy.http.MiltonServlet { private static Logger log = LoggerFactory.getLogger(MiltonServlet.class); // our resourceFactoryFactory needs the endpoint configuration final static ThreadLocal<Properties> endpointProperties = new ThreadLocal<Properties>(); private String dbName; @Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { long time = System.nanoTime(); HttpServletRequest r = (HttpServletRequest) servletRequest; HttpServletResponse s = (HttpServletResponse) servletResponse; try { MDC.put("tenant", dbName); MDC.put("path", r.getRequestURI()); MDC.put("method", r.getMethod()); super.service(servletRequest, servletResponse); } finally { long taken = System.nanoTime() - time; try { log.info("request took " + taken / (1000 * 1000) + " ms, status " + s.getStatus()); } catch (Throwable e) { // httpunit does not implement getStatus() (@since Servlet API // 3.0 ) log.info("request took " + taken / (1000 * 1000) + " ms"); } MDC.clear(); } } @Override public void init(ServletConfig config) throws ServletException { String endpoint = config.getInitParameter("webdav.endpoint"); Properties ep = Configuration.getEndpointProperties(endpoint); dbName = ep.getProperty("mongo.db"); try { endpointProperties.set(ep); super.init(config); } finally { endpointProperties.remove(); } // http://stackoverflow.com/questions/8380324/ httpManager.getHandlers().setEnableExpectContinue(false); // http://jira.ettrema.com:8080/browse/MIL-11 handlers: for (HttpExtension x : httpManager.getHandlers()) { if (x instanceof Http11Protocol) { Http11Protocol p = (Http11Protocol) x; for (Handler h : x.getHandlers()) { if (h instanceof com.bradmcevoy.http.http11.GetHandler) { httpManager.addFilter(0, new GetHandler( new DefaultWebDavResponseHandler( new AuthenticationService()), p .getHandlerHelper())); break handlers; } } } } } }