/*
* Copyright 2015 ThoughtWorks, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package com.thoughtworks.go.server;
import com.thoughtworks.go.util.SystemEnvironment;
import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.server.handler.AbstractHandler;
import org.eclipse.jetty.server.handler.ContextHandler;
import org.eclipse.jetty.server.handler.ResourceHandler;
import org.eclipse.jetty.servlets.gzip.GzipHandler;
import org.eclipse.jetty.webapp.WebAppContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class AssetsContextHandler extends ContextHandler {
private final AssetsHandler handler;
private SystemEnvironment systemEnvironment;
public AssetsContextHandler(SystemEnvironment systemEnvironment) throws IOException {
super(systemEnvironment.getWebappContextPath() + "/assets");
this.systemEnvironment = systemEnvironment;
handler = new AssetsHandler();
GzipHandler gzipHandler = new GzipHandler();
gzipHandler.addIncludedMimeTypes("text/html,text/plain,text/xml,application/xhtml+xml,text/css,application/javascript,image/svg+xml,application/vnd.go.cd.v1+json,application/json");
gzipHandler.setHandler(handler);
setHandler(gzipHandler);
}
public void init(WebAppContext webAppContext) throws IOException {
String railsRootDirName = webAppContext.getInitParameter("rails.root").replaceAll("/WEB-INF/", "");
String assetsDir = webAppContext.getWebInf().addPath(String.format("%s/public/assets/", railsRootDirName)).getName();
handler.setAssetsDir(assetsDir);
}
private boolean shouldNotHandle() {
return !systemEnvironment.useCompressedJs();
}
class AssetsHandler extends AbstractHandler {
private ResourceHandler resourceHandler = new ResourceHandler();
private AssetsHandler() {
resourceHandler.setCacheControl("max-age=31536000,public");
resourceHandler.setEtags(false);
}
public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
if (shouldNotHandle()) return;
this.resourceHandler.handle(target, baseRequest, request, response);
}
private void setAssetsDir(String assetsDir) {
resourceHandler.setResourceBase(assetsDir);
}
}
}