Skip to content

Commit eda6aa4

Browse files
committed
fix incorrect redirect handling
1 parent 5ed25be commit eda6aa4

File tree

4 files changed

+24
-13
lines changed

4 files changed

+24
-13
lines changed

routers/web/repo/branch.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ func Branches(ctx *context.Context) {
9393

9494
// DeleteBranchPost responses for delete merged branch
9595
func DeleteBranchPost(ctx *context.Context) {
96-
defer redirect(ctx)
96+
defer jsonRedirectBranches(ctx)
9797
branchName := ctx.FormString("name")
9898

9999
if err := repo_service.DeleteBranch(ctx, ctx.Doer, ctx.Repo.Repository, ctx.Repo.GitRepo, branchName, nil); err != nil {
@@ -120,7 +120,7 @@ func DeleteBranchPost(ctx *context.Context) {
120120

121121
// RestoreBranchPost responses for delete merged branch
122122
func RestoreBranchPost(ctx *context.Context) {
123-
defer redirect(ctx)
123+
defer jsonRedirectBranches(ctx)
124124

125125
branchID := ctx.FormInt64("branch_id")
126126
branchName := ctx.FormString("name")
@@ -170,7 +170,7 @@ func RestoreBranchPost(ctx *context.Context) {
170170
ctx.Flash.Success(ctx.Tr("repo.branch.restore_success", deletedBranch.Name))
171171
}
172172

173-
func redirect(ctx *context.Context) {
173+
func jsonRedirectBranches(ctx *context.Context) {
174174
ctx.JSONRedirect(ctx.Repo.RepoLink + "/branches?page=" + url.QueryEscape(ctx.FormString("page")))
175175
}
176176

routers/web/repo/view_home.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -423,5 +423,9 @@ func RedirectRepoTreeToSrc(ctx *context.Context) {
423423
// * "https://github/owner/repo/tree/{CommitID}"
424424
// * "https://gitlab/owner/repo/tree/{CommitID}"
425425
// Then no matter which forge the submodule is using, the link works.
426-
ctx.Redirect(ctx.Repo.RepoLink + "/src/" + ctx.PathParamRaw("*"))
426+
redirect := ctx.Repo.RepoLink + "/src/" + ctx.PathParamRaw("*")
427+
if ctx.Req.URL.RawQuery != "" {
428+
redirect += "?" + ctx.Req.URL.RawQuery
429+
}
430+
ctx.Redirect(redirect)
427431
}

services/context/repo.go

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -897,13 +897,20 @@ func RepoRefByType(detectRefType git.RefType) func(*Context) {
897897

898898
if guessLegacyPath {
899899
// redirect from old URL scheme to new URL scheme
900-
// FIXME: the path handling is not right here
901-
prefix := strings.TrimPrefix(setting.AppSubURL+strings.ToLower(strings.TrimSuffix(ctx.Req.URL.Path, ctx.PathParam("*"))), strings.ToLower(ctx.Repo.RepoLink))
902-
redirect := path.Join(
903-
ctx.Repo.RepoLink,
904-
util.PathEscapeSegments(prefix),
905-
ctx.Repo.RefTypeNameSubURL(),
906-
util.PathEscapeSegments(ctx.Repo.TreePath))
900+
// * /user2/repo1/commits/master => /user2/repo1/commits/branch/master
901+
// * /user2/repo1/src/master => /user2/repo1/src/branch/master
902+
903+
var redirect string
904+
refSubPath := "src"
905+
// remove the "/subpath/owner/repo/" prefix, the names are case-insensitive
906+
remainingLowerPath, cut := strings.CutPrefix(setting.AppSubURL+strings.ToLower(ctx.Req.URL.Path), strings.ToLower(ctx.Repo.RepoLink)+"/")
907+
if cut {
908+
refSubPath, _, _ = strings.Cut(remainingLowerPath, "/") // it could be "src" or "commits"
909+
}
910+
redirect = fmt.Sprintf("%s/%s/%s/%s", ctx.Repo.RepoLink, refSubPath, refType, ctx.PathParamRaw("*"))
911+
if ctx.Req.URL.RawQuery != "" {
912+
redirect += "?" + ctx.Req.URL.RawQuery
913+
}
907914
ctx.Redirect(redirect)
908915
return
909916
}

tests/integration/links_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,8 @@ func TestRedirectsNoLogin(t *testing.T) {
5353
{"/user2/repo1/commits/master", "/user2/repo1/commits/branch/master"},
5454
{"/user2/repo1/src/master", "/user2/repo1/src/branch/master"},
5555
{"/user2/repo1/src/master/a%2fb.txt", "/user2/repo1/src/branch/master/a%2fb.txt"},
56-
{"/user2/repo1/src/master/directory/file.txt", "/user2/repo1/src/branch/master/directory/file.txt"},
57-
{"/user2/repo1/tree/a%2fb", "/user2/repo1/src/a%2fb"},
56+
{"/user2/repo1/src/master/directory/file.txt?a=1", "/user2/repo1/src/branch/master/directory/file.txt?a=1"},
57+
{"/user2/repo1/tree/a%2fb?a=1", "/user2/repo1/src/a%2fb?a=1"},
5858
{"/user/avatar/GhosT/-1", "/assets/img/avatar_default.png"},
5959
{"/user/avatar/Gitea-ActionS/0", "/assets/img/avatar_default.png"},
6060
{"/api/v1/swagger", "/api/swagger"},

0 commit comments

Comments
 (0)