Skip to content

Commit

Permalink
Fix git empty check and HEAD request (go-gitea#33690)
Browse files Browse the repository at this point in the history
  • Loading branch information
wxiaoguang authored Feb 24, 2025
1 parent 8ae46d9 commit 56a0a9c
Show file tree
Hide file tree
Showing 4 changed files with 36 additions and 16 deletions.
2 changes: 1 addition & 1 deletion routers/web/repo/githttp.go
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ func httpBase(ctx *context.Context) *serviceHandler {
strings.HasSuffix(ctx.Req.URL.Path, "git-upload-archive") {
isPull = true
} else {
isPull = ctx.Req.Method == "GET"
isPull = ctx.Req.Method == "HEAD" || ctx.Req.Method == "GET"
}

var accessMode perm.AccessMode
Expand Down
5 changes: 5 additions & 0 deletions services/context/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -291,6 +291,11 @@ func RepoRefForAPI(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
ctx := GetAPIContext(req)

if ctx.Repo.Repository.IsEmpty {
ctx.APIErrorNotFound("repository is empty")
return
}

if ctx.Repo.GitRepo == nil {
ctx.APIErrorInternal(fmt.Errorf("no open git repo"))
return
Expand Down
8 changes: 8 additions & 0 deletions tests/integration/empty_repo_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -60,12 +60,20 @@ func TestEmptyRepoAddFile(t *testing.T) {
defer tests.PrepareTestEnv(t)()

session := loginUser(t, "user30")
token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeReadRepository)

// test web page
req := NewRequest(t, "GET", "/user30/empty")
resp := session.MakeRequest(t, req, http.StatusOK)
bodyString := resp.Body.String()
assert.Contains(t, bodyString, "empty-repo-guide")
assert.True(t, test.IsNormalPageCompleted(bodyString))

// test api
req = NewRequest(t, "GET", "/api/v1/repos/user30/empty/raw/main/README.md").AddTokenAuth(token)
session.MakeRequest(t, req, http.StatusNotFound)

// create a new file
req = NewRequest(t, "GET", "/user30/empty/_new/"+setting.Repository.DefaultBranch)
resp = session.MakeRequest(t, req, http.StatusOK)
doc := NewHTMLParser(t, resp.Body).Find(`input[name="commit_choice"]`)
Expand Down
37 changes: 22 additions & 15 deletions tests/integration/git_smart_http_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,10 @@ import (
"net/url"
"testing"

"code.gitea.io/gitea/modules/util"

"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)

func TestGitSmartHTTP(t *testing.T) {
Expand All @@ -18,51 +21,55 @@ func TestGitSmartHTTP(t *testing.T) {

func testGitSmartHTTP(t *testing.T, u *url.URL) {
kases := []struct {
p string
code int
method, path string
code int
}{
{
p: "user2/repo1/info/refs",
path: "user2/repo1/info/refs",
code: http.StatusOK,
},
{
p: "user2/repo1/HEAD",
method: "HEAD",
path: "user2/repo1/info/refs",
code: http.StatusOK,
},
{
path: "user2/repo1/HEAD",
code: http.StatusOK,
},
{
p: "user2/repo1/objects/info/alternates",
path: "user2/repo1/objects/info/alternates",
code: http.StatusNotFound,
},
{
p: "user2/repo1/objects/info/http-alternates",
path: "user2/repo1/objects/info/http-alternates",
code: http.StatusNotFound,
},
{
p: "user2/repo1/../../custom/conf/app.ini",
path: "user2/repo1/../../custom/conf/app.ini",
code: http.StatusNotFound,
},
{
p: "user2/repo1/objects/info/../../../../custom/conf/app.ini",
path: "user2/repo1/objects/info/../../../../custom/conf/app.ini",
code: http.StatusNotFound,
},
{
p: `user2/repo1/objects/info/..\..\..\..\custom\conf\app.ini`,
path: `user2/repo1/objects/info/..\..\..\..\custom\conf\app.ini`,
code: http.StatusBadRequest,
},
}

for _, kase := range kases {
t.Run(kase.p, func(t *testing.T) {
p := u.String() + kase.p
req, err := http.NewRequest("GET", p, nil)
assert.NoError(t, err)
t.Run(kase.path, func(t *testing.T) {
req, err := http.NewRequest(util.IfZero(kase.method, "GET"), u.String()+kase.path, nil)
require.NoError(t, err)
req.SetBasicAuth("user2", userPassword)
resp, err := http.DefaultClient.Do(req)
assert.NoError(t, err)
require.NoError(t, err)
defer resp.Body.Close()
assert.EqualValues(t, kase.code, resp.StatusCode)
_, err = io.ReadAll(resp.Body)
assert.NoError(t, err)
require.NoError(t, err)
})
}
}

0 comments on commit 56a0a9c

Please sign in to comment.