Merge pull request #1678 from int128/github-compat-url
Improve GitHub compatible URL
commit 95748a2f2fc163a67732f2e088b447b47367ae03
2 parents 8893a4a + d73ddbd
@Naoki Takezoe Naoki Takezoe authored on 20 Aug 2017
GitHub committed on 20 Aug 2017
Showing 3 changed files
View
3
■■
src/main/scala/ScalatraBootstrap.scala
context.addFilter("gitAuthenticationFilter", new GitAuthenticationFilter)
context.getFilterRegistration("gitAuthenticationFilter").addMappingForUrlPatterns(EnumSet.allOf(classOf[DispatcherType]), true, "/git/*")
context.addFilter("apiAuthenticationFilter", new ApiAuthenticationFilter)
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
context.mount(new GitHubCompatibleAccessController, "/*")
context.mount(new AnonymousAccessController, "/*")
 
context.addFilter("pluginControllerFilter", new PluginControllerFilter)
context.getFilterRegistration("pluginControllerFilter").addMappingForUrlPatterns(EnumSet.allOf(classOf[DispatcherType]), true, "/*")
View
30
src/main/scala/gitbucket/core/controller/GitHubCompatibleAccessController.scala 0 → 100644
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
39
src/main/scala/gitbucket/core/servlet/GHCompatRepositoryAccessFilter.scala 100644 → 0
package gitbucket.core.servlet
 
import javax.servlet._
import javax.servlet.http.{HttpServletRequest, HttpServletResponse}
 
import gitbucket.core.service.SystemSettingsService
 
/**
* A controller to provide GitHub compatible URL for Git clients.
*/
class GHCompatRepositoryAccessFilter extends Filter with SystemSettingsService {
 
/**
* 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) = {
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() = {}
 
}