Skip to content

Commit a088566

Browse files
authored
Return 400 but not 500 when request archive with wrong format (#17691) (#17700)
* Return 400 but not 500 when request archive with wrong format (#17691) * Remove bundle because it's not in this version
1 parent 7be2d7b commit a088566

File tree

4 files changed

+72
-9
lines changed

4 files changed

+72
-9
lines changed

integrations/api_repo_archive_test.go

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
// Copyright 2021 The Gitea Authors. All rights reserved.
2+
// Use of this source code is governed by a MIT-style
3+
// license that can be found in the LICENSE file.
4+
5+
package integrations
6+
7+
import (
8+
"fmt"
9+
"io"
10+
"net/http"
11+
"net/url"
12+
"testing"
13+
14+
"code.gitea.io/gitea/models"
15+
16+
"github.com/stretchr/testify/assert"
17+
)
18+
19+
func TestAPIDownloadArchive(t *testing.T) {
20+
defer prepareTestEnv(t)()
21+
22+
repo := models.AssertExistsAndLoadBean(t, &models.Repository{ID: 1}).(*models.Repository)
23+
user2 := models.AssertExistsAndLoadBean(t, &models.User{ID: 2}).(*models.User)
24+
session := loginUser(t, user2.LowerName)
25+
token := getTokenForLoggedInUser(t, session)
26+
27+
link, _ := url.Parse(fmt.Sprintf("/api/v1/repos/%s/%s/archive/master.zip", user2.Name, repo.Name))
28+
link.RawQuery = url.Values{"token": {token}}.Encode()
29+
resp := MakeRequest(t, NewRequest(t, "GET", link.String()), http.StatusOK)
30+
bs, err := io.ReadAll(resp.Body)
31+
assert.NoError(t, err)
32+
assert.EqualValues(t, 320, len(bs))
33+
34+
link, _ = url.Parse(fmt.Sprintf("/api/v1/repos/%s/%s/archive/master.tar.gz", user2.Name, repo.Name))
35+
link.RawQuery = url.Values{"token": {token}}.Encode()
36+
resp = MakeRequest(t, NewRequest(t, "GET", link.String()), http.StatusOK)
37+
bs, err = io.ReadAll(resp.Body)
38+
assert.NoError(t, err)
39+
assert.EqualValues(t, 266, len(bs))
40+
41+
link, _ = url.Parse(fmt.Sprintf("/api/v1/repos/%s/%s/archive/master", user2.Name, repo.Name))
42+
link.RawQuery = url.Values{"token": {token}}.Encode()
43+
MakeRequest(t, NewRequest(t, "GET", link.String()), http.StatusBadRequest)
44+
}

routers/web/repo/repo.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -371,7 +371,11 @@ func Download(ctx *context.Context) {
371371
uri := ctx.Params("*")
372372
aReq, err := archiver_service.NewRequest(ctx.Repo.Repository.ID, ctx.Repo.GitRepo, uri)
373373
if err != nil {
374-
ctx.ServerError("archiver_service.NewRequest", err)
374+
if errors.Is(err, archiver_service.ErrUnknownArchiveFormat{}) {
375+
ctx.Error(http.StatusBadRequest, err.Error())
376+
} else {
377+
ctx.ServerError("archiver_service.NewRequest", err)
378+
}
375379
return
376380
}
377381
if aReq == nil {

services/archiver/archiver.go

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,22 @@ type ArchiveRequest struct {
3838
// the way to 64.
3939
var shaRegex = regexp.MustCompile(`^[0-9a-f]{4,64}$`)
4040

41+
// ErrUnknownArchiveFormat request archive format is not supported
42+
type ErrUnknownArchiveFormat struct {
43+
RequestFormat string
44+
}
45+
46+
// Error implements error
47+
func (err ErrUnknownArchiveFormat) Error() string {
48+
return fmt.Sprintf("unknown format: %s", err.RequestFormat)
49+
}
50+
51+
// Is implements error
52+
func (ErrUnknownArchiveFormat) Is(err error) bool {
53+
_, ok := err.(ErrUnknownArchiveFormat)
54+
return ok
55+
}
56+
4157
// NewRequest creates an archival request, based on the URI. The
4258
// resulting ArchiveRequest is suitable for being passed to ArchiveRepository()
4359
// if it's determined that the request still needs to be satisfied.
@@ -55,7 +71,7 @@ func NewRequest(repoID int64, repo *git.Repository, uri string) (*ArchiveRequest
5571
ext = ".tar.gz"
5672
r.Type = git.TARGZ
5773
default:
58-
return nil, fmt.Errorf("Unknown format: %s", uri)
74+
return nil, ErrUnknownArchiveFormat{RequestFormat: uri}
5975
}
6076

6177
r.refName = strings.TrimSuffix(uri, ext)

services/archiver/archiver_test.go

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
package archiver
66

77
import (
8+
"errors"
89
"path/filepath"
910
"testing"
1011
"time"
@@ -19,10 +20,6 @@ func TestMain(m *testing.M) {
1920
models.MainTest(m, filepath.Join("..", ".."))
2021
}
2122

22-
func waitForCount(t *testing.T, num int) {
23-
24-
}
25-
2623
func TestArchive_Basic(t *testing.T) {
2724
assert.NoError(t, models.PrepareTestDatabase())
2825

@@ -83,11 +80,8 @@ func TestArchive_Basic(t *testing.T) {
8380
inFlight[2] = secondReq
8481

8582
ArchiveRepository(zipReq)
86-
waitForCount(t, 1)
8783
ArchiveRepository(tgzReq)
88-
waitForCount(t, 2)
8984
ArchiveRepository(secondReq)
90-
waitForCount(t, 3)
9185

9286
// Make sure sending an unprocessed request through doesn't affect the queue
9387
// count.
@@ -132,3 +126,8 @@ func TestArchive_Basic(t *testing.T) {
132126
assert.NotEqual(t, zipReq.GetArchiveName(), tgzReq.GetArchiveName())
133127
assert.NotEqual(t, zipReq.GetArchiveName(), secondReq.GetArchiveName())
134128
}
129+
130+
func TestErrUnknownArchiveFormat(t *testing.T) {
131+
var err = ErrUnknownArchiveFormat{RequestFormat: "master"}
132+
assert.True(t, errors.Is(err, ErrUnknownArchiveFormat{}))
133+
}

0 commit comments

Comments
 (0)