Skip to content

Instantly share code, notes, and snippets.

@augustl
Created December 12, 2016 08:46
Show Gist options
  • Save augustl/2caf337e43e5dc3ee85e18748db19db7 to your computer and use it in GitHub Desktop.
Save augustl/2caf337e43e5dc3ee85e18748db19db7 to your computer and use it in GitHub Desktop.
package no.nsb.altrans.gui.homeless
import javax.servlet.Filter
import javax.servlet.FilterChain
import javax.servlet.FilterConfig
import javax.servlet.ServletContext
import javax.servlet.ServletException
import javax.servlet.ServletRequest
import javax.servlet.ServletResponse
import javax.servlet.http.HttpServletRequest
import javax.servlet.http.HttpServletResponse
class StaticFilesServletFilter implements Filter {
private final String assetFsPath
private final String mapping
private ServletContext ctx
StaticFilesServletFilter(String assetFsPath, String mapping) {
this.assetFsPath = assetFsPath
this.mapping = mapping
}
@Override
void init(FilterConfig filterConfig) throws ServletException {
this.ctx = filterConfig.getServletContext()
}
@Override
void destroy() {
}
@Override
void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
if (request instanceof HttpServletRequest && response instanceof HttpServletResponse) {
doFilterHttp(request, response, chain)
} else {
chain.doFilter(request, response)
}
}
void doFilterHttp(HttpServletRequest request, HttpServletResponse response, FilterChain chain) {
String fileUri = request.requestURI
String baseAssetUrl = request.contextPath == "/" ? "/$mapping" : "${request.contextPath}/${mapping}"
if (fileUri.startsWith(baseAssetUrl)) {
fileUri = fileUri.substring(baseAssetUrl.length())
}
File assetFile = new File(assetFsPath + fileUri)
if (assetFile.isFile()) {
String providedEtag = request.getHeader("If-None-Match")
String currentEtag = "${assetFile.lastModified()}"
if (providedEtag == currentEtag) {
response.setStatus(304)
} else {
response.setCharacterEncoding("UTF-8")
response.setHeader("ETag", currentEtag)
response.setContentType(ctx.getMimeType(request.requestURI))
response.outputStream << new FileInputStream(assetFile)
response.flushBuffer()
}
} else {
chain.doFilter(request, response)
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment