mirror of
https://github.com/gitbucket/gitbucket.git
synced 2025-11-12 08:25:50 +01:00
Improve GitHub compatible URL
This commit is contained in:
@@ -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 = {}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user