From 908793e778714c5adb6ed980f65c0de828d401c9 Mon Sep 17 00:00:00 2001 From: 6543 <6543@obermui.de> Date: Thu, 21 Jul 2022 17:56:32 +0200 Subject: [PATCH 1/5] Add "X-Gitea-Content-Type" info to HEADEr for GET /raw/ and /media/ API --- routers/api/v1/repo/file.go | 18 ++++++++++++++---- services/repository/files/content.go | 16 ++++++++++++++++ 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/routers/api/v1/repo/file.go b/routers/api/v1/repo/file.go index 1ac1088839231..45fc8c3c78c1a 100644 --- a/routers/api/v1/repo/file.go +++ b/routers/api/v1/repo/file.go @@ -33,6 +33,10 @@ import ( files_service "code.gitea.io/gitea/services/repository/files" ) +const ( + giteaContentTypeHeader = "X-Gitea-Content-Type" +) + // GetRawFile get a file by path on a repository func GetRawFile(ctx *context.APIContext) { // swagger:operation GET /repos/{owner}/{repo}/raw/{filepath} repository repoGetRawFile @@ -72,11 +76,14 @@ func GetRawFile(ctx *context.APIContext) { return } - blob, lastModified := getBlobForEntry(ctx) + blob, entry, lastModified := getBlobForEntry(ctx) if ctx.Written() { return } + ctx.RespHeader().Set(giteaContentTypeHeader, + string(files_service.GetContentTypeFromTreeEntry(entry))) + if err := common.ServeBlob(ctx.Context, blob, lastModified); err != nil { ctx.Error(http.StatusInternalServerError, "ServeBlob", err) } @@ -119,11 +126,14 @@ func GetRawFileOrLFS(ctx *context.APIContext) { return } - blob, lastModified := getBlobForEntry(ctx) + blob, entry, lastModified := getBlobForEntry(ctx) if ctx.Written() { return } + ctx.RespHeader().Set(giteaContentTypeHeader, + string(files_service.GetContentTypeFromTreeEntry(entry))) + // LFS Pointer files are at most 1024 bytes - so any blob greater than 1024 bytes cannot be an LFS file if blob.Size() > 1024 { // First handle caching for the blob @@ -218,7 +228,7 @@ func GetRawFileOrLFS(ctx *context.APIContext) { } } -func getBlobForEntry(ctx *context.APIContext) (blob *git.Blob, lastModified time.Time) { +func getBlobForEntry(ctx *context.APIContext) (blob *git.Blob, entry *git.TreeEntry, lastModified time.Time) { entry, err := ctx.Repo.Commit.GetTreeEntryByPath(ctx.Repo.TreePath) if err != nil { if git.IsErrNotExist(err) { @@ -251,7 +261,7 @@ func getBlobForEntry(ctx *context.APIContext) (blob *git.Blob, lastModified time } blob = entry.Blob() - return blob, lastModified + return blob, entry, lastModified } // GetArchive get archive of a repository diff --git a/services/repository/files/content.go b/services/repository/files/content.go index 2237671a60cbb..b8a80277246a1 100644 --- a/services/repository/files/content.go +++ b/services/repository/files/content.go @@ -101,6 +101,22 @@ func GetContentsOrList(ctx context.Context, repo *repo_model.Repository, treePat return fileList, nil } +// GetContentTypeFromTreeEntry check what content is behind it +func GetContentTypeFromTreeEntry(entry *git.TreeEntry) ContentType { + switch { + case entry.IsDir(): + return ContentTypeDir + case entry.IsSubModule(): + return ContentTypeSubmodule + case entry.IsExecutable(), entry.IsRegular(): + return ContentTypeRegular + case entry.IsLink(): + return ContentTypeLink + default: + return "" + } +} + // GetContents gets the meta data on a file's contents. Ref can be a branch, commit or tag func GetContents(ctx context.Context, repo *repo_model.Repository, treePath, ref string, forList bool) (*api.ContentsResponse, error) { if ref == "" { From 5e77912e5ca88914e3f10f833e197cc2997fa492 Mon Sep 17 00:00:00 2001 From: 6543 <6543@obermui.de> Date: Thu, 21 Jul 2022 18:01:36 +0200 Subject: [PATCH 2/5] add test --- integrations/api_repo_raw_test.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/integrations/api_repo_raw_test.go b/integrations/api_repo_raw_test.go index 2a77d1ba630dc..fc9aaa94a7fe3 100644 --- a/integrations/api_repo_raw_test.go +++ b/integrations/api_repo_raw_test.go @@ -10,6 +10,8 @@ import ( "code.gitea.io/gitea/models/unittest" user_model "code.gitea.io/gitea/models/user" + + "github.com/stretchr/testify/assert" ) func TestAPIReposRaw(t *testing.T) { @@ -25,9 +27,11 @@ func TestAPIReposRaw(t *testing.T) { "65f1bf27bc3bf70f64657658635e66094edbcb4d", // Commit } { req := NewRequestf(t, "GET", "/api/v1/repos/%s/repo1/raw/%s/README.md?token="+token, user.Name, ref) - session.MakeRequest(t, req, http.StatusOK) + resp := session.MakeRequest(t, req, http.StatusOK) + assert.EqualValues(t, "file", resp.Header().Get("X-Gitea-Content-Type")) } // Test default branch req := NewRequestf(t, "GET", "/api/v1/repos/%s/repo1/raw/README.md?token="+token, user.Name) - session.MakeRequest(t, req, http.StatusOK) + resp := session.MakeRequest(t, req, http.StatusOK) + assert.EqualValues(t, "file", resp.Header().Get("X-Gitea-Content-Type")) } From 6519d4ce7a788fa84268d37d101b54f1be454c30 Mon Sep 17 00:00:00 2001 From: 6543 <6543@obermui.de> Date: Thu, 21 Jul 2022 18:57:21 +0200 Subject: [PATCH 3/5] X-Gitea-Content-Type -> X-Gitea-Object-Type --- integrations/api_repo_raw_test.go | 4 ++-- routers/api/v1/repo/file.go | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/integrations/api_repo_raw_test.go b/integrations/api_repo_raw_test.go index fc9aaa94a7fe3..258b409befb87 100644 --- a/integrations/api_repo_raw_test.go +++ b/integrations/api_repo_raw_test.go @@ -28,10 +28,10 @@ func TestAPIReposRaw(t *testing.T) { } { req := NewRequestf(t, "GET", "/api/v1/repos/%s/repo1/raw/%s/README.md?token="+token, user.Name, ref) resp := session.MakeRequest(t, req, http.StatusOK) - assert.EqualValues(t, "file", resp.Header().Get("X-Gitea-Content-Type")) + assert.EqualValues(t, "file", resp.Header().Get("x-gitea-object-type")) } // Test default branch req := NewRequestf(t, "GET", "/api/v1/repos/%s/repo1/raw/README.md?token="+token, user.Name) resp := session.MakeRequest(t, req, http.StatusOK) - assert.EqualValues(t, "file", resp.Header().Get("X-Gitea-Content-Type")) + assert.EqualValues(t, "file", resp.Header().Get("x-gitea-object-type")) } diff --git a/routers/api/v1/repo/file.go b/routers/api/v1/repo/file.go index 45fc8c3c78c1a..de59d7a88cc5f 100644 --- a/routers/api/v1/repo/file.go +++ b/routers/api/v1/repo/file.go @@ -34,7 +34,7 @@ import ( ) const ( - giteaContentTypeHeader = "X-Gitea-Content-Type" + giteaObjectTypeHeader = "X-Gitea-Object-Type" ) // GetRawFile get a file by path on a repository @@ -81,7 +81,7 @@ func GetRawFile(ctx *context.APIContext) { return } - ctx.RespHeader().Set(giteaContentTypeHeader, + ctx.RespHeader().Set(giteaObjectTypeHeader, string(files_service.GetContentTypeFromTreeEntry(entry))) if err := common.ServeBlob(ctx.Context, blob, lastModified); err != nil { @@ -131,7 +131,7 @@ func GetRawFileOrLFS(ctx *context.APIContext) { return } - ctx.RespHeader().Set(giteaContentTypeHeader, + ctx.RespHeader().Set(giteaObjectTypeHeader, string(files_service.GetContentTypeFromTreeEntry(entry))) // LFS Pointer files are at most 1024 bytes - so any blob greater than 1024 bytes cannot be an LFS file From 0c6a6568cf68654feb0e5b430ad296abb3f83acc Mon Sep 17 00:00:00 2001 From: 6543 <6543@obermui.de> Date: Thu, 21 Jul 2022 19:10:23 +0200 Subject: [PATCH 4/5] just another rename --- routers/api/v1/repo/file.go | 4 ++-- services/repository/files/content.go | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/routers/api/v1/repo/file.go b/routers/api/v1/repo/file.go index de59d7a88cc5f..c313ad7378114 100644 --- a/routers/api/v1/repo/file.go +++ b/routers/api/v1/repo/file.go @@ -82,7 +82,7 @@ func GetRawFile(ctx *context.APIContext) { } ctx.RespHeader().Set(giteaObjectTypeHeader, - string(files_service.GetContentTypeFromTreeEntry(entry))) + string(files_service.GetObjectTypeFromTreeEntry(entry))) if err := common.ServeBlob(ctx.Context, blob, lastModified); err != nil { ctx.Error(http.StatusInternalServerError, "ServeBlob", err) @@ -132,7 +132,7 @@ func GetRawFileOrLFS(ctx *context.APIContext) { } ctx.RespHeader().Set(giteaObjectTypeHeader, - string(files_service.GetContentTypeFromTreeEntry(entry))) + string(files_service.GetObjectTypeFromTreeEntry(entry))) // LFS Pointer files are at most 1024 bytes - so any blob greater than 1024 bytes cannot be an LFS file if blob.Size() > 1024 { diff --git a/services/repository/files/content.go b/services/repository/files/content.go index b8a80277246a1..c2069092899ef 100644 --- a/services/repository/files/content.go +++ b/services/repository/files/content.go @@ -101,8 +101,8 @@ func GetContentsOrList(ctx context.Context, repo *repo_model.Repository, treePat return fileList, nil } -// GetContentTypeFromTreeEntry check what content is behind it -func GetContentTypeFromTreeEntry(entry *git.TreeEntry) ContentType { +// GetObjectTypeFromTreeEntry check what content is behind it +func GetObjectTypeFromTreeEntry(entry *git.TreeEntry) ContentType { switch { case entry.IsDir(): return ContentTypeDir From 3b402915a702466c82006d458df5889a30376f35 Mon Sep 17 00:00:00 2001 From: 6543 <6543@obermui.de> Date: Thu, 21 Jul 2022 20:06:42 +0200 Subject: [PATCH 5/5] just another code format . . . I guess the diff was to easy ;) --- routers/api/v1/repo/file.go | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/routers/api/v1/repo/file.go b/routers/api/v1/repo/file.go index c313ad7378114..ba8a938b8308c 100644 --- a/routers/api/v1/repo/file.go +++ b/routers/api/v1/repo/file.go @@ -33,9 +33,7 @@ import ( files_service "code.gitea.io/gitea/services/repository/files" ) -const ( - giteaObjectTypeHeader = "X-Gitea-Object-Type" -) +const giteaObjectTypeHeader = "X-Gitea-Object-Type" // GetRawFile get a file by path on a repository func GetRawFile(ctx *context.APIContext) { @@ -81,8 +79,7 @@ func GetRawFile(ctx *context.APIContext) { return } - ctx.RespHeader().Set(giteaObjectTypeHeader, - string(files_service.GetObjectTypeFromTreeEntry(entry))) + ctx.RespHeader().Set(giteaObjectTypeHeader, string(files_service.GetObjectTypeFromTreeEntry(entry))) if err := common.ServeBlob(ctx.Context, blob, lastModified); err != nil { ctx.Error(http.StatusInternalServerError, "ServeBlob", err) @@ -131,8 +128,7 @@ func GetRawFileOrLFS(ctx *context.APIContext) { return } - ctx.RespHeader().Set(giteaObjectTypeHeader, - string(files_service.GetObjectTypeFromTreeEntry(entry))) + ctx.RespHeader().Set(giteaObjectTypeHeader, string(files_service.GetObjectTypeFromTreeEntry(entry))) // LFS Pointer files are at most 1024 bytes - so any blob greater than 1024 bytes cannot be an LFS file if blob.Size() > 1024 {