Handle plugin controllers by loop as same as CompositeScalatraFilter

This commit is contained in:
Naoki Takezoe
2017-11-17 18:20:12 +09:00
parent 581bcb3dc8
commit 30a1968793
2 changed files with 20 additions and 20 deletions

View File

@@ -33,13 +33,14 @@ class CompositeScalatraFilter extends Filter {
chain.doFilter(request, response)
}
class MockFilterChain extends FilterChain {
var continue: Boolean = false
override def doFilter(request: ServletRequest, response: ServletResponse): Unit = {
continue = true
}
}
}
class MockFilterChain extends FilterChain {
var continue: Boolean = false
override def doFilter(request: ServletRequest, response: ServletResponse): Unit = {
continue = true
}
}

View File

@@ -3,7 +3,7 @@ package gitbucket.core.servlet
import javax.servlet._
import javax.servlet.http.HttpServletRequest
import gitbucket.core.controller.ControllerBase
import gitbucket.core.controller.MockFilterChain
import gitbucket.core.plugin.PluginRegistry
class PluginControllerFilter extends Filter {
@@ -21,25 +21,24 @@ class PluginControllerFilter extends Filter {
}
override def doFilter(request: ServletRequest, response: ServletResponse, chain: FilterChain): Unit = {
val controller = PluginRegistry().getControllers().filter { case (_, path) =>
val controllers = PluginRegistry().getControllers().filter { case (_, path) =>
val requestUri = request.asInstanceOf[HttpServletRequest].getRequestURI
val start = path.replaceFirst("/\\*$", "/")
(requestUri + "/").startsWith(start)
}
val filterChainWrapper = controller.foldLeft(chain){ case (chain, (controller, _)) =>
new FilterChainWrapper(controller, chain)
}
filterChainWrapper.doFilter(request, response)
}
class FilterChainWrapper(controller: ControllerBase, chain: FilterChain) extends FilterChain {
override def doFilter(request: ServletRequest, response: ServletResponse): Unit = {
controllers.foreach { case (controller, _) =>
if(controller.config == null){
controller.init(filterConfig)
}
controller.doFilter(request, response, chain)
val mockChain = new MockFilterChain()
controller.doFilter(request, response, mockChain)
if(mockChain.continue == false){
return ()
}
}
chain.doFilter(request, response)
}
}