diff --git a/build.sbt b/build.sbt index d219ff3..d3532de 100644 --- a/build.sbt +++ b/build.sbt @@ -1,6 +1,6 @@ val Organization = "io.github.gitbucket" val Name = "gitbucket" -val GitBucketVersion = "4.10.0" +val GitBucketVersion = "4.11.0-SNAPSHOT" val ScalatraVersion = "2.5.0" val JettyVersion = "9.3.9.v20160517" diff --git a/src/main/scala/ScalatraBootstrap.scala b/src/main/scala/ScalatraBootstrap.scala index 949bf80..c767f59 100644 --- a/src/main/scala/ScalatraBootstrap.scala +++ b/src/main/scala/ScalatraBootstrap.scala @@ -31,9 +31,8 @@ // Register controllers context.mount(new AnonymousAccessController, "/*") - PluginRegistry().getControllers.foreach { case (controller, path) => - context.mount(controller, path) - } + context.addFilter("pluginControllerFilter", new PluginControllerFilter) + context.getFilterRegistration("pluginControllerFilter").addMappingForUrlPatterns(EnumSet.allOf(classOf[DispatcherType]), true, "/*") context.mount(new IndexController, "/") context.mount(new ApiController, "/api/v3") diff --git a/src/main/scala/gitbucket/core/servlet/PluginControllerFilter.scala b/src/main/scala/gitbucket/core/servlet/PluginControllerFilter.scala new file mode 100644 index 0000000..95060f0 --- /dev/null +++ b/src/main/scala/gitbucket/core/servlet/PluginControllerFilter.scala @@ -0,0 +1,34 @@ +package gitbucket.core.servlet + +import javax.servlet._ +import javax.servlet.http.HttpServletRequest + +import gitbucket.core.plugin.PluginRegistry + +class PluginControllerFilter extends Filter { + + override def init(filterConfig: FilterConfig): Unit = { + PluginRegistry().getControllers().foreach { case (controller, _) => + controller.init(filterConfig) + } + } + + override def destroy(): Unit = { + PluginRegistry().getControllers().foreach { case (controller, _) => + controller.destroy() + } + } + + override def doFilter(request: ServletRequest, response: ServletResponse, chain: FilterChain): Unit = { + val controller = PluginRegistry().getControllers().find { case (_, path) => + val requestUri = request.asInstanceOf[HttpServletRequest].getRequestURI + path.endsWith("/*") && requestUri.startsWith(path.replaceFirst("/\\*$", "/")) + } + + controller.map { case (controller, _) => + controller.doFilter(request, response, chain) + }.getOrElse{ + chain.doFilter(request, response) + } + } +}