diff --git a/src/main/scala/gitbucket/core/servlet/GHCompatRepositoryAccessFilter.scala b/src/main/scala/gitbucket/core/servlet/GHCompatRepositoryAccessFilter.scala index 0a19060..7fa5fc9 100644 --- a/src/main/scala/gitbucket/core/servlet/GHCompatRepositoryAccessFilter.scala +++ b/src/main/scala/gitbucket/core/servlet/GHCompatRepositoryAccessFilter.scala @@ -4,35 +4,33 @@ 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 { - /** - * Pattern of GitHub compatible repository URL. - * /:user/:repo.git/ - */ - private val githubRepositoryPattern = """^/[^/]+/[^/]+\.git/.*""".r + override def init(filterConfig: FilterConfig): Unit = {} - override def init(filterConfig: FilterConfig) = {} + 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) - override def doFilter(req: ServletRequest, res: ServletResponse, chain: FilterChain) = { - implicit val request = req.asInstanceOf[HttpServletRequest] - val agent = request.getHeader("USER-AGENT") - val response = res.asInstanceOf[HttpServletResponse] - val requestPath = request.getRequestURI.substring(request.getContextPath.length) - val queryString = if (request.getQueryString != null) "?" + request.getQueryString else "" - - requestPath match { - case githubRepositoryPattern() if agent != null && agent.toLowerCase.indexOf("git") >= 0 => - response.sendRedirect(baseUrl + "/git" + requestPath + queryString) - case _ => - chain.doFilter(req, res) + case _ => chain.doFilter(req, res) } } - override def destroy() = {} + 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 = {} }