diff --git a/services/context/context.go b/services/context/context.go index 8d286f67385..e8b1663b221 100644 --- a/services/context/context.go +++ b/services/context/context.go @@ -163,6 +163,7 @@ func Contexter() func(next http.Handler) http.Handler { base := NewBaseContext(resp, req) ctx := NewWebContext(base, rnd, session.GetContextSession(req)) ctx.Data.MergeFrom(middleware.CommonTemplateContextData()) + ctx.Data["CurrentURL"] = setting.AppSubURL + req.URL.RequestURI() ctx.Data["Link"] = ctx.Link // PageData is passed by reference, and it will be rendered to `window.config.pageData` in `head.tmpl` for JavaScript modules diff --git a/tests/integration/view_test.go b/tests/integration/view_test.go index f51469d0f4e..4dbf7717050 100644 --- a/tests/integration/view_test.go +++ b/tests/integration/view_test.go @@ -10,6 +10,9 @@ import ( "testing" "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/test" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/services/context" "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" @@ -21,6 +24,7 @@ func TestView(t *testing.T) { t.Run("CommitListActions", testCommitListActions) t.Run("SecurityHeadersDefaults", testSecurityHeadersDefaults) t.Run("SiteManifest", testSiteManifest) + t.Run("CurrentURL", testViewPageCurrentURL) } func testRenderFileSVGIsInImgTag(t *testing.T) { @@ -113,3 +117,15 @@ func testSiteManifest(t *testing.T) { ) assert.JSONEq(t, expectedJSON, resp.Body.String()) } + +func testViewPageCurrentURL(t *testing.T) { + defer test.MockVariableValue(&setting.AppSubURL, "/subpath")() + var currentURL string + web.RouteMock(web.MockAfterMiddlewares, func(ctx *context.Context) { + // Some custom template users need this template variable to construct links in their templates + currentURL, _ = ctx.Data["CurrentURL"].(string) + }) + defer web.RouteMockReset() + MakeRequest(t, NewRequest(t, "GET", "/any-page?k=v"), http.StatusNotFound) + assert.Equal(t, "/subpath/any-page?k=v", currentURL) +}