From 7844bf1430d5d2701c70ff525b6455c10cb23484 Mon Sep 17 00:00:00 2001 From: Abner Date: Sun, 22 Aug 2021 02:22:06 +0800 Subject: [PATCH] Download lfs in git and web workflow from minio/s3 directly (#16731) --- routers/web/repo/download.go | 12 ++++++++++++ services/lfs/server.go | 8 ++++++++ 2 files changed, 20 insertions(+) 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}