From 2a5c1cf7ee0f399c6aeae836e1ca5e6eb22f51da Mon Sep 17 00:00:00 2001 From: elix3r <157088510+22elix3r@users.noreply.github.com> Date: Thu, 27 Aug 2026 07:27:33 +0530 Subject: [PATCH] fix(context): prevent PostForm panic when Request is nil initFormCache called ParseMultipartForm without checking c.Request, so PostForm getters panicked on contexts from CreateTestContext. Match initQueryCache by initializing an empty form cache when there is no request. Fixes #4772 Signed-off-by: elix3r <157088510+22elix3r@users.noreply.github.com> --- context.go | 16 ++++++++++------ context_test.go | 27 +++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 6 deletions(-) diff --git a/context.go b/context.go index 1dc730e3..b3b2ad62 100644 --- a/context.go +++ b/context.go @@ -647,14 +647,18 @@ func (c *Context) PostFormArray(key string) (values []string) { func (c *Context) initFormCache() { if c.formCache == nil { - c.formCache = make(url.Values) - req := c.Request - if err := req.ParseMultipartForm(c.engine.MaxMultipartMemory); err != nil { - if !errors.Is(err, http.ErrNotMultipart) { - debugPrint("error on parse multipart form array: %v", err) + if c.Request != nil { + c.formCache = make(url.Values) + req := c.Request + if err := req.ParseMultipartForm(c.engine.MaxMultipartMemory); err != nil { + if !errors.Is(err, http.ErrNotMultipart) { + debugPrint("error on parse multipart form array: %v", err) + } } + c.formCache = req.PostForm + } else { + c.formCache = url.Values{} } - c.formCache = req.PostForm } } diff --git a/context_test.go b/context_test.go index e8d305e4..cb748f3e 100644 --- a/context_test.go +++ b/context_test.go @@ -903,6 +903,33 @@ func TestContextDefaultQueryOnEmptyRequest(t *testing.T) { }) } +func TestContextPostFormOnEmptyRequest(t *testing.T) { + c, _ := CreateTestContext(httptest.NewRecorder()) // here c.Request == nil + assert.NotPanics(t, func() { + value, ok := c.GetPostForm("key") + assert.False(t, ok) + assert.Empty(t, value) + }) + assert.NotPanics(t, func() { + assert.Empty(t, c.PostForm("key")) + }) + assert.NotPanics(t, func() { + assert.Equal(t, "fallback", c.DefaultPostForm("key", "fallback")) + }) + assert.NotPanics(t, func() { + values, ok := c.GetPostFormArray("key") + assert.False(t, ok) + assert.Empty(t, values) + assert.Empty(t, c.PostFormArray("key")) + }) + assert.NotPanics(t, func() { + dicts, ok := c.GetPostFormMap("key") + assert.False(t, ok) + assert.Empty(t, dicts) + assert.Empty(t, c.PostFormMap("key")) + }) +} + func TestContextQueryAndPostForm(t *testing.T) { c, _ := CreateTestContext(httptest.NewRecorder()) body := strings.NewReader("foo=bar&page=11&both=&foo=second")