mirror of
https://github.com/go-gitea/gitea
synced 2025-07-22 18:28:37 +00:00
Fix "redirect link" handling (#33440)
`a%2fb` should not redirect to `a/b` --------- Co-authored-by: delvh <dev.lh@web.de>
This commit is contained in:
@@ -93,7 +93,7 @@ func Branches(ctx *context.Context) {
|
||||
|
||||
// DeleteBranchPost responses for delete merged branch
|
||||
func DeleteBranchPost(ctx *context.Context) {
|
||||
defer redirect(ctx)
|
||||
defer jsonRedirectBranches(ctx)
|
||||
branchName := ctx.FormString("name")
|
||||
|
||||
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) {
|
||||
|
||||
// RestoreBranchPost responses for delete merged branch
|
||||
func RestoreBranchPost(ctx *context.Context) {
|
||||
defer redirect(ctx)
|
||||
defer jsonRedirectBranches(ctx)
|
||||
|
||||
branchID := ctx.FormInt64("branch_id")
|
||||
branchName := ctx.FormString("name")
|
||||
@@ -170,7 +170,7 @@ func RestoreBranchPost(ctx *context.Context) {
|
||||
ctx.Flash.Success(ctx.Tr("repo.branch.restore_success", deletedBranch.Name))
|
||||
}
|
||||
|
||||
func redirect(ctx *context.Context) {
|
||||
func jsonRedirectBranches(ctx *context.Context) {
|
||||
ctx.JSONRedirect(ctx.Repo.RepoLink + "/branches?page=" + url.QueryEscape(ctx.FormString("page")))
|
||||
}
|
||||
|
||||
|
@@ -413,8 +413,19 @@ func Home(ctx *context.Context) {
|
||||
ctx.HTML(http.StatusOK, tplRepoHome)
|
||||
}
|
||||
|
||||
// HomeRedirect redirects from /tree/* to /src/* in order to maintain a similar URL structure.
|
||||
func HomeRedirect(ctx *context.Context) {
|
||||
remainder := ctx.PathParam("*")
|
||||
ctx.Redirect(ctx.Repo.RepoLink + "/src/" + util.PathEscapeSegments(remainder))
|
||||
func RedirectRepoTreeToSrc(ctx *context.Context) {
|
||||
// Redirect "/owner/repo/tree/*" requests to "/owner/repo/src/*",
|
||||
// then use the deprecated "/src/*" handler to guess the ref type and render a file list page.
|
||||
// This is done intentionally so that Gitea's repo URL structure matches other forges (GitHub/GitLab) provide,
|
||||
// allowing us to construct submodule URLs across forges easily.
|
||||
// For example, when viewing a submodule, we can simply construct the link as:
|
||||
// * "https://gitea/owner/repo/tree/{CommitID}"
|
||||
// * "https://github/owner/repo/tree/{CommitID}"
|
||||
// * "https://gitlab/owner/repo/tree/{CommitID}"
|
||||
// Then no matter which forge the submodule is using, the link works.
|
||||
redirect := ctx.Repo.RepoLink + "/src/" + ctx.PathParamRaw("*")
|
||||
if ctx.Req.URL.RawQuery != "" {
|
||||
redirect += "?" + ctx.Req.URL.RawQuery
|
||||
}
|
||||
ctx.Redirect(redirect)
|
||||
}
|
||||
|
@@ -1583,13 +1583,7 @@ func registerRoutes(m *web.Router) {
|
||||
m.Get("/commit/*", context.RepoRefByType(git.RefTypeCommit), repo.Home)
|
||||
m.Get("/*", context.RepoRefByType(""), repo.Home) // "/*" route is deprecated, and kept for backward compatibility
|
||||
}, repo.SetEditorconfigIfExists)
|
||||
|
||||
// Add a /tree/* path to redirect to the /src/* path, which
|
||||
// will redirect to the canonical URL for that ref. This is
|
||||
// included so that Gitea's repo URL structure matches what
|
||||
// other forges provide, allowing clients to construct URLs
|
||||
// that work across forges.
|
||||
m.Get("/tree/*", repo.HomeRedirect)
|
||||
m.Get("/tree/*", repo.RedirectRepoTreeToSrc) // redirect "/owner/repo/tree/*" requests to "/owner/repo/src/*"
|
||||
|
||||
m.Get("/forks", context.RepoRef(), repo.Forks)
|
||||
m.Get("/commit/{sha:([a-f0-9]{7,64})}.{ext:patch|diff}", repo.MustBeNotEmpty, repo.RawDiff)
|
||||
|
Reference in New Issue
Block a user