Implement as controller instead of filter

This commit is contained in:
Hidetake Iwata
2017-08-18 18:55:05 +09:00
parent 772ac80764
commit e208dd5966
3 changed files with 30 additions and 38 deletions

View File

@@ -25,10 +25,9 @@ class ScalatraBootstrap extends LifeCycle with SystemSettingsService {
context.getFilterRegistration("gitAuthenticationFilter").addMappingForUrlPatterns(EnumSet.allOf(classOf[DispatcherType]), true, "/git/*") context.getFilterRegistration("gitAuthenticationFilter").addMappingForUrlPatterns(EnumSet.allOf(classOf[DispatcherType]), true, "/git/*")
context.addFilter("apiAuthenticationFilter", new ApiAuthenticationFilter) context.addFilter("apiAuthenticationFilter", new ApiAuthenticationFilter)
context.getFilterRegistration("apiAuthenticationFilter").addMappingForUrlPatterns(EnumSet.allOf(classOf[DispatcherType]), true, "/api/v3/*") context.getFilterRegistration("apiAuthenticationFilter").addMappingForUrlPatterns(EnumSet.allOf(classOf[DispatcherType]), true, "/api/v3/*")
context.addFilter("ghCompatRepositoryAccessFilter", new GHCompatRepositoryAccessFilter)
context.getFilterRegistration("ghCompatRepositoryAccessFilter").addMappingForUrlPatterns(EnumSet.allOf(classOf[DispatcherType]), true, "/*")
// Register controllers // Register controllers
context.mount(new GitHubCompatibleAccessController, "/*")
context.mount(new AnonymousAccessController, "/*") context.mount(new AnonymousAccessController, "/*")
context.addFilter("pluginControllerFilter", new PluginControllerFilter) context.addFilter("pluginControllerFilter", new PluginControllerFilter)

View File

@@ -0,0 +1,29 @@
package gitbucket.core.controller
import org.scalatra.MovedPermanently
class GitHubCompatibleAccessController extends GitHubCompatibleAccessControllerBase
/**
* Provides GitHub compatible URLs for Git client.
*
* <ul>
* <li>git clone http://localhost:8080/owner/repo</li>
* <li>git clone http://localhost:8080/owner/repo.git</li>
* </ul>
*/
trait GitHubCompatibleAccessControllerBase extends ControllerBase {
/**
* Git client initiates a connection with /info/refs
*
* @see https://git-scm.com/book/en/v2/Git-Internals-Transfer-Protocols
*/
get("/*/*/info/refs") {
redirectToGitServlet()
}
private def redirectToGitServlet(): Unit = {
val query = Option(request.getQueryString).map("?" + _).getOrElse("")
halt(MovedPermanently(baseUrl + "/git" + request.getRequestURI + query))
}
}

View File

@@ -1,36 +0,0 @@
package gitbucket.core.servlet
import javax.servlet._
import javax.servlet.http.{HttpServletRequest, HttpServletResponse}
import gitbucket.core.service.SystemSettingsService
import gitbucket.core.util.Implicits._
/**
* A controller to provide GitHub compatible URL for Git clients.
*/
class GHCompatRepositoryAccessFilter extends Filter with SystemSettingsService {
override def init(filterConfig: FilterConfig): Unit = {}
override def doFilter(req: ServletRequest, res: ServletResponse, chain: FilterChain): Unit = {
val request = req.asInstanceOf[HttpServletRequest]
request.paths match {
// baseUrl/repositoryOwner/repositoryName/info/refs
// baseUrl/repositoryOwner/repositoryName.git/info/refs
case Array(repositoryOwner, repositoryName, "info", "refs", _*) => redirectToGitServlet(req, res)
case _ => chain.doFilter(req, res)
}
}
private def redirectToGitServlet(req: ServletRequest, res: ServletResponse): Unit = {
val request = req.asInstanceOf[HttpServletRequest]
val response = res.asInstanceOf[HttpServletResponse]
val query = Option(request.getQueryString).map("?" + _).getOrElse("")
response.sendRedirect(baseUrl(request) + "/git" + request.getRequestURI + query)
}
override def destroy(): Unit = {}
}