summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAbner <abner199709@gmail.com>2021-08-22 02:22:06 +0800
committerGitHub <noreply@github.com>2021-08-21 20:22:06 +0200
commit7844bf1430d5d2701c70ff525b6455c10cb23484 (patch)
treeff0b86c9e20f765338195c73d5a9b2adb8cbbded
parent06f82641cb65c88d89bfaeca01f9fc3b32bb76b8 (diff)
downloadgitea-7844bf1430d5d2701c70ff525b6455c10cb23484.tar.gz
gitea-7844bf1430d5d2701c70ff525b6455c10cb23484.zip
Download lfs in git and web workflow from minio/s3 directly (#16731)
-rw-r--r--routers/web/repo/download.go12
-rw-r--r--services/lfs/server.go8
2 files changed, 20 insertions, 0 deletions
diff --git a/routers/web/repo/download.go b/routers/web/repo/download.go
index 6f43d4b839..2307f736ad 100644
--- a/routers/web/repo/download.go
+++ b/routers/web/repo/download.go
@@ -11,6 +11,8 @@ import (
"code.gitea.io/gitea/modules/httpcache"
"code.gitea.io/gitea/modules/lfs"
"code.gitea.io/gitea/modules/log"
+ "code.gitea.io/gitea/modules/setting"
+ "code.gitea.io/gitea/modules/storage"
"code.gitea.io/gitea/routers/common"
)
@@ -47,6 +49,16 @@ func ServeBlobOrLFS(ctx *context.Context, blob *git.Blob) error {
if httpcache.HandleGenericETagCache(ctx.Req, ctx.Resp, `"`+pointer.Oid+`"`) {
return nil
}
+
+ if setting.LFS.ServeDirect {
+ //If we have a signed url (S3, object storage), redirect to this directly.
+ u, err := storage.LFS.URL(pointer.RelativePath(), blob.Name())
+ if u != nil && err == nil {
+ ctx.Redirect(u.String())
+ return nil
+ }
+ }
+
lfsDataRc, err := lfs.ReadMetaObject(meta.Pointer)
if err != nil {
return err
diff --git a/services/lfs/server.go b/services/lfs/server.go
index 0d357939d5..81d535beec 100644
--- a/services/lfs/server.go
+++ b/services/lfs/server.go
@@ -21,6 +21,7 @@ import (
lfs_module "code.gitea.io/gitea/modules/lfs"
"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/setting"
+ "code.gitea.io/gitea/modules/storage"
"github.com/golang-jwt/jwt"
)
@@ -401,6 +402,13 @@ func buildObjectResponse(rc *requestContext, pointer lfs_module.Pointer, downloa
if download {
rep.Actions["download"] = &lfs_module.Link{Href: rc.DownloadLink(pointer), Header: header}
+ if setting.LFS.ServeDirect {
+ //If we have a signed url (S3, object storage), redirect to this directly.
+ u, err := storage.LFS.URL(pointer.RelativePath(), pointer.Oid)
+ if u != nil && err == nil {
+ rep.Actions["download"] = &lfs_module.Link{Href: u.String(), Header: header}
+ }
+ }
}
if upload {
rep.Actions["upload"] = &lfs_module.Link{Href: rc.UploadLink(pointer), Header: header}