diff --git a/services/context/context_template.go b/services/context/context_template.go index 2b34681faa..2c8fde6870 100644 --- a/services/context/context_template.go +++ b/services/context/context_template.go @@ -88,7 +88,7 @@ func (c TemplateContext) AppFullLink(link ...string) template.URL { if len(link) == 0 { return template.URL(s) } - return template.URL(s + strings.TrimPrefix(link[0], "/")) + return template.URL(s + "/" + strings.TrimPrefix(link[0], "/")) } var globalVars = sync.OnceValue(func() (ret struct { diff --git a/services/context/context_test.go b/services/context/context_test.go index 54044644f0..aaf79de716 100644 --- a/services/context/context_test.go +++ b/services/context/context_test.go @@ -49,3 +49,17 @@ func TestRedirectToCurrentSite(t *testing.T) { }) } } + +func TestAppFullLink(t *testing.T) { + setting.IsInTesting = true + defer test.MockVariableValue(&setting.AppURL, "https://gitea.example.com/sub/")() + defer test.MockVariableValue(&setting.AppSubURL, "/sub")() + defer test.MockVariableValue(&setting.PublicURLDetection, setting.PublicURLNever)() + + req := httptest.NewRequest(http.MethodGet, "https://gitea.example.com/sub/", nil) + tmplCtx := NewTemplateContext(req.Context(), req) + + assert.Equal(t, "https://gitea.example.com/sub", string(tmplCtx.AppFullLink())) + assert.Equal(t, "https://gitea.example.com/sub/user/repo", string(tmplCtx.AppFullLink("user/repo"))) + assert.Equal(t, "https://gitea.example.com/sub/user/repo", string(tmplCtx.AppFullLink("/user/repo"))) +}