Newer
Older
GitBucket / src / main / scala / gitbucket / core / controller / GitHubCompatibleAccessController.scala
@Hidetake Iwata Hidetake Iwata on 18 Aug 2017 842 bytes Implement as controller instead of filter
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))
  }
}