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")