diff --git a/src/main/scala/gitbucket/core/servlet/GitLfsBatchServlet.scala b/src/main/scala/gitbucket/core/servlet/GitLfsBatchServlet.scala
deleted file mode 100644
index 7b53ddf..0000000
--- a/src/main/scala/gitbucket/core/servlet/GitLfsBatchServlet.scala
+++ /dev/null
@@ -1,96 +0,0 @@
-package gitbucket.core.servlet
-
-import javax.servlet.http.{HttpServlet, HttpServletRequest, HttpServletResponse}
-
-import org.json4s._
-import org.json4s.jackson.Serialization.{read, write}
-import java.util.Date
-
-import gitbucket.core.service.SystemSettingsService
-
-/**
- * Provides GitLFS Batch API.
- *
- * https://github.com/git-lfs/git-lfs/blob/master/docs/api/batch.md
- */
-class GitLfsBatchServlet extends HttpServlet with SystemSettingsService {
-
- private implicit val jsonFormats = gitbucket.core.api.JsonFormat.jsonFormats
-
- override protected def doPost(req: HttpServletRequest, res: HttpServletResponse): Unit = {
- val batchRequest = read[BatchRequest](req.getInputStream)
- val settings = loadSystemSettings()
-
- settings.lfs.serverUrl match {
- case None =>
- throw new IllegalStateException("lfs.server_url is not configured.")
-
- case Some(serverUrl) =>
- val batchResponse = batchRequest.operation match {
- case "upload" =>
- BatchUploadResponse("basic", batchRequest.objects.map { requestObject =>
- BatchResponseObject(requestObject.oid, requestObject.size, true,
- Actions(
- upload = Some(Action(
- href = serverUrl + "/" + requestObject.oid,
- expires_at = new Date(System.currentTimeMillis + 60000L)
- ))
- )
- )
- })
- case "download" =>
- BatchUploadResponse("basic", batchRequest.objects.map { requestObject =>
- BatchResponseObject(requestObject.oid, requestObject.size, true,
- Actions(
- download = Some(Action(
- href = serverUrl + "/" + requestObject.oid,
- expires_at = new Date(System.currentTimeMillis + 60000L)
- ))
- )
- )
- })
- }
-
- res.setContentType("application/vnd.git-lfs+json")
-
- val out = res.getWriter
- out.print(write(batchResponse))
- out.flush()
- }
- }
-
-}
-
-case class BatchRequest(
- operation: String,
- transfers: Seq[String],
- objects: Seq[BatchRequestObject]
-)
-
-case class BatchRequestObject(
- oid: String,
- size: Long
-)
-
-case class BatchUploadResponse(
- transfer: String,
- objects: Seq[BatchResponseObject]
-)
-
-case class BatchResponseObject(
- oid: String,
- size: Long,
- authenticated: Boolean,
- actions: Actions
-)
-
-case class Actions(
- download: Option[Action] = None,
- upload: Option[Action] = None
-)
-
-case class Action(
- href: String,
- header: Map[String, String] = Map.empty,
- expires_at: Date
-)
\ No newline at end of file
diff --git a/src/main/scala/gitbucket/core/servlet/GitRepositoryServlet.scala b/src/main/scala/gitbucket/core/servlet/GitRepositoryServlet.scala
index e85804e..879ab5c 100644
--- a/src/main/scala/gitbucket/core/servlet/GitRepositoryServlet.scala
+++ b/src/main/scala/gitbucket/core/servlet/GitRepositoryServlet.scala
@@ -1,6 +1,7 @@
package gitbucket.core.servlet
import java.io.File
+import java.util.Date
import gitbucket.core.api
import gitbucket.core.model.{Session, WebHook}
@@ -11,16 +12,16 @@
import gitbucket.core.util.ControlUtil._
import gitbucket.core.util.Implicits._
import gitbucket.core.util._
-
import org.eclipse.jgit.api.Git
import org.eclipse.jgit.http.server.GitServlet
import org.eclipse.jgit.lib._
import org.eclipse.jgit.transport._
import org.eclipse.jgit.transport.resolver._
import org.slf4j.LoggerFactory
-
import javax.servlet.ServletConfig
-import javax.servlet.http.{HttpServletResponse, HttpServletRequest}
+import javax.servlet.http.{HttpServletRequest, HttpServletResponse}
+
+import org.json4s.jackson.Serialization._
/**
@@ -32,7 +33,8 @@
class GitRepositoryServlet extends GitServlet with SystemSettingsService {
private val logger = LoggerFactory.getLogger(classOf[GitRepositoryServlet])
-
+ private implicit val jsonFormats = gitbucket.core.api.JsonFormat.jsonFormats
+
override def init(config: ServletConfig): Unit = {
setReceivePackFactory(new GitBucketReceivePackFactory())
@@ -45,15 +47,61 @@
override def service(req: HttpServletRequest, res: HttpServletResponse): Unit = {
val agent = req.getHeader("USER-AGENT")
val index = req.getRequestURI.indexOf(".git")
- if(index >= 0 && (agent == null || agent.toLowerCase.indexOf("git/") < 0)){
+ if(index >= 0 && (agent == null || agent.toLowerCase.indexOf("git") < 0)){
// redirect for browsers
val paths = req.getRequestURI.substring(0, index).split("/")
res.sendRedirect(baseUrl(req) + "/" + paths.dropRight(1).last + "/" + paths.last)
+
+ } else if(req.getMethod.toUpperCase == "POST" && req.getRequestURI.endsWith("/info/lfs/objects/batch")){
+ serviceGitLfsBatchAPI(req, res)
+
} else {
// response for git client
super.service(req, res)
}
}
+
+ protected def serviceGitLfsBatchAPI(req: HttpServletRequest, res: HttpServletResponse): Unit = {
+ val batchRequest = read[GitLfs.BatchRequest](req.getInputStream)
+ val settings = loadSystemSettings()
+
+ settings.lfs.serverUrl match {
+ case None =>
+ throw new IllegalStateException("lfs.server_url is not configured.")
+
+ case Some(serverUrl) =>
+ val batchResponse = batchRequest.operation match {
+ case "upload" =>
+ GitLfs.BatchUploadResponse("basic", batchRequest.objects.map { requestObject =>
+ GitLfs.BatchResponseObject(requestObject.oid, requestObject.size, true,
+ GitLfs.Actions(
+ upload = Some(GitLfs.Action(
+ href = serverUrl + "/" + requestObject.oid,
+ expires_at = new Date(System.currentTimeMillis + 60000L)
+ ))
+ )
+ )
+ })
+ case "download" =>
+ GitLfs.BatchUploadResponse("basic", batchRequest.objects.map { requestObject =>
+ GitLfs.BatchResponseObject(requestObject.oid, requestObject.size, true,
+ GitLfs.Actions(
+ download = Some(GitLfs.Action(
+ href = serverUrl + "/" + requestObject.oid,
+ expires_at = new Date(System.currentTimeMillis + 60000L)
+ ))
+ )
+ )
+ })
+ }
+
+ res.setContentType("application/vnd.git-lfs+json")
+
+ val out = res.getWriter
+ out.print(write(batchResponse))
+ out.flush()
+ }
+ }
}
class GitBucketRepositoryResolver(parent: FileResolver[HttpServletRequest]) extends RepositoryResolver[HttpServletRequest] {
@@ -232,3 +280,41 @@
}
}
+
+object GitLfs {
+
+ case class BatchRequest(
+ operation: String,
+ transfers: Seq[String],
+ objects: Seq[BatchRequestObject]
+ )
+
+ case class BatchRequestObject(
+ oid: String,
+ size: Long
+ )
+
+ case class BatchUploadResponse(
+ transfer: String,
+ objects: Seq[BatchResponseObject]
+ )
+
+ case class BatchResponseObject(
+ oid: String,
+ size: Long,
+ authenticated: Boolean,
+ actions: Actions
+ )
+
+ case class Actions(
+ download: Option[Action] = None,
+ upload: Option[Action] = None
+ )
+
+ case class Action(
+ href: String,
+ header: Map[String, String] = Map.empty,
+ expires_at: Date
+ )
+
+}
\ No newline at end of file
diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml
index 066f99f..9634066 100644
--- a/src/main/webapp/WEB-INF/web.xml
+++ b/src/main/webapp/WEB-INF/web.xml
@@ -46,17 +46,6 @@
/git/*
-
- GitLfsBatchServlet
- gitbucket.core.servlet.GitLfsBatchServlet
- true
-
-
-
- GitLfsBatchServlet
- /git/root/git-lfs-test.git/info/lfs/*
-
-