diff --git a/src/main/scala/ScalatraBootstrap.scala b/src/main/scala/ScalatraBootstrap.scala index 623fded..949bf80 100644 --- a/src/main/scala/ScalatraBootstrap.scala +++ b/src/main/scala/ScalatraBootstrap.scala @@ -1,12 +1,12 @@ -import gitbucket.core.controller._ -import gitbucket.core.plugin.PluginRegistry -import gitbucket.core.servlet.{ApiAuthenticationFilter, Database, GitAuthenticationFilter, TransactionFilter} -import gitbucket.core.util.Directory import java.util.EnumSet import javax.servlet._ +import gitbucket.core.controller._ +import gitbucket.core.plugin.PluginRegistry import gitbucket.core.service.SystemSettingsService +import gitbucket.core.servlet._ +import gitbucket.core.util.Directory import org.scalatra._ @@ -25,6 +25,9 @@ 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 AnonymousAccessController, "/*") diff --git a/src/main/scala/gitbucket/core/servlet/GHCompatRepositoryAccessFilter.scala b/src/main/scala/gitbucket/core/servlet/GHCompatRepositoryAccessFilter.scala new file mode 100644 index 0000000..0f1322d --- /dev/null +++ b/src/main/scala/gitbucket/core/servlet/GHCompatRepositoryAccessFilter.scala @@ -0,0 +1,36 @@ +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. + * /:user/:repo.git/ + */ + 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 response = res.asInstanceOf[HttpServletResponse] + val requestPath = request.getRequestURI.substring(request.getContextPath.length) + requestPath match { + case githubRepositoryPattern() => + response.sendRedirect(baseUrl + "/git" + requestPath) + + case _ => + chain.doFilter(req, res) + } + } + + override def destroy() = {} + +}