Improve GitHub compatible URL

This commit is contained in:
Hidetake Iwata
2017-08-16 00:19:12 +09:00
parent cbd16169e4
commit 772ac80764

View File

@@ -4,35 +4,33 @@ import javax.servlet._
import javax.servlet.http.{HttpServletRequest, HttpServletResponse} import javax.servlet.http.{HttpServletRequest, HttpServletResponse}
import gitbucket.core.service.SystemSettingsService import gitbucket.core.service.SystemSettingsService
import gitbucket.core.util.Implicits._
/** /**
* A controller to provide GitHub compatible URL for Git clients. * A controller to provide GitHub compatible URL for Git clients.
*/ */
class GHCompatRepositoryAccessFilter extends Filter with SystemSettingsService { class GHCompatRepositoryAccessFilter extends Filter with SystemSettingsService {
/** override def init(filterConfig: FilterConfig): Unit = {}
* Pattern of GitHub compatible repository URL.
* <code>/:user/:repo.git/</code>
*/
private val githubRepositoryPattern = """^/[^/]+/[^/]+\.git/.*""".r
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) = { case _ => chain.doFilter(req, res)
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)
} }
} }
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 = {}
} }