@@ -256,6 +256,7 @@ func APIContexter() func(http.Handler) http.Handler { | |||
}, | |||
Org: &APIOrganization{}, | |||
} | |||
defer ctx.Close() | |||
ctx.Req = WithAPIContext(WithContext(req, ctx.Context), &ctx) | |||
@@ -75,6 +75,16 @@ type Context struct { | |||
Package *Package | |||
} | |||
// Close frees all resources hold by Context | |||
func (ctx *Context) Close() error { | |||
var err error | |||
if ctx.Req != nil && ctx.Req.MultipartForm != nil { | |||
err = ctx.Req.MultipartForm.RemoveAll() // remove the temp files buffered to tmp directory | |||
} | |||
// TODO: close opened repo, and more | |||
return err | |||
} | |||
// TrHTMLEscapeArgs runs Tr but pre-escapes all arguments with html.EscapeString. | |||
// This is useful if the locale message is intended to only produce HTML content. | |||
func (ctx *Context) TrHTMLEscapeArgs(msg string, args ...string) string { | |||
@@ -693,6 +703,8 @@ func Contexter() func(next http.Handler) http.Handler { | |||
"RunModeIsProd": setting.IsProd, | |||
}, | |||
} | |||
defer ctx.Close() | |||
// PageData is passed by reference, and it will be rendered to `window.config.pageData` in `head.tmpl` for JavaScript modules | |||
ctx.PageData = map[string]interface{}{} | |||
ctx.Data["PageData"] = ctx.PageData |
@@ -100,6 +100,7 @@ func PackageContexter() func(next http.Handler) http.Handler { | |||
Resp: NewResponse(resp), | |||
Data: map[string]interface{}{}, | |||
} | |||
defer ctx.Close() | |||
ctx.Req = WithContext(req, &ctx) | |||
@@ -66,6 +66,8 @@ func PrivateContexter() func(http.Handler) http.Handler { | |||
Data: map[string]interface{}{}, | |||
}, | |||
} | |||
defer ctx.Close() | |||
ctx.Req = WithPrivateContext(req, ctx) | |||
ctx.Data["Context"] = ctx | |||
next.ServeHTTP(ctx.Resp, ctx.Req) |
@@ -38,6 +38,7 @@ func MockContext(t *testing.T, path string) *context.Context { | |||
Resp: context.NewResponse(resp), | |||
Locale: &mockLocale{}, | |||
} | |||
defer ctx.Close() | |||
requestURL, err := url.Parse(path) | |||
assert.NoError(t, err) |
@@ -37,6 +37,8 @@ func createContext(req *http.Request) (*context.Context, *httptest.ResponseRecor | |||
Render: rnd, | |||
Data: make(map[string]interface{}), | |||
} | |||
defer c.Close() | |||
return c, resp | |||
} | |||
@@ -79,6 +79,8 @@ func Init(next http.Handler) http.Handler { | |||
"PasswordHashAlgorithms": user_model.AvailableHashAlgorithms, | |||
}, | |||
} | |||
defer ctx.Close() | |||
ctx.Req = context.WithContext(req, &ctx) | |||
next.ServeHTTP(resp, ctx.Req) | |||
}) |