All Downloads are FREE. Search and download functionalities are using the official Maven repository.

gitbucket.core.servlet.PluginAssetsServlet.scala Maven / Gradle / Ivy

The newest version!
package gitbucket.core.servlet

import javax.servlet.http.{HttpServlet, HttpServletRequest, HttpServletResponse}
import gitbucket.core.plugin.PluginRegistry
import gitbucket.core.util.FileUtil
import org.apache.commons.io.IOUtils

/**
 * Supply assets which are provided by plugins.
 */
class PluginAssetsServlet extends HttpServlet {

  override def doGet(req: HttpServletRequest, resp: HttpServletResponse): Unit = {
    val assetsMappings = PluginRegistry().getAssetsMappings
    val path = req.getRequestURI.substring(req.getContextPath.length)

    assetsMappings
      .find { case (prefix, _, _) => path.startsWith("/plugin-assets" + prefix) }
      .foreach { case (prefix, resourcePath, classLoader) =>
        val ifNoneMatch = req.getHeader("If-None-Match")
        PluginRegistry.getPluginInfoFromClassLoader(classLoader).map { info =>
          val etag = s""""${info.pluginJar.lastModified}"""" // ETag must wrapped with double quote
          if (ifNoneMatch == etag) {
            resp.setStatus(304)
          } else {
            val resourceName = path.substring(("/plugin-assets" + prefix).length)
            Option(classLoader.getResourceAsStream(resourcePath.stripPrefix("/") + resourceName))
              .map { in =>
                try {
                  val bytes = IOUtils.toByteArray(in)
                  resp.setContentLength(bytes.length)
                  resp.setContentType(FileUtil.getMimeType(path, bytes))
                  resp.setHeader("ETag", etag)
                  resp.getOutputStream.write(bytes)
                } finally {
                  in.close()
                }
              }
              .getOrElse {
                resp.setStatus(404)
              }
          }
        }
      }
  }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy