From 443925238662f93c179d235938f68332ff0a42e1 Mon Sep 17 00:00:00 2001 From: Juan Calderon-Perez <835733+gaby@users.noreply.github.com> Date: Sun, 9 Nov 2025 17:32:08 -0500 Subject: [PATCH 1/2] Add integration test for unsupported method request --- app.go | 2 ++ app_test.go | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+) diff --git a/app.go b/app.go index 7987848586a..119607a13ff 100644 --- a/app.go +++ b/app.go @@ -1321,6 +1321,8 @@ func (app *App) serverErrorHandler(fctx *fasthttp.RequestCtx, err error) { err = ErrRequestEntityTooLarge case errors.Is(err, fasthttp.ErrGetOnly): err = ErrMethodNotAllowed + case strings.Contains(err.Error(), "unsupported http request method"): + err = ErrNotImplemented case strings.Contains(err.Error(), "timeout"): err = ErrRequestTimeout default: diff --git a/app_test.go b/app_test.go index ae6b3aca4a9..ec50279d62e 100644 --- a/app_test.go +++ b/app_test.go @@ -628,6 +628,64 @@ func Test_App_serverErrorHandler_Network_Error(t *testing.T) { require.Equal(t, StatusBadGateway, c.fasthttp.Response.StatusCode()) } +func Test_App_serverErrorHandler_Unsupported_Method_Error(t *testing.T) { + t.Parallel() + app := New() + c := app.AcquireCtx(&fasthttp.RequestCtx{}).(*DefaultCtx) //nolint:errcheck,forcetypeassert // not needed + + app.serverErrorHandler(c.fasthttp, errors.New("unsupported http request method 'FOO'")) + require.Equal(t, string(c.fasthttp.Response.Body()), utils.StatusMessage(StatusNotImplemented)) + require.Equal(t, StatusNotImplemented, c.fasthttp.Response.StatusCode()) +} + +func Test_App_serverErrorHandler_Unsupported_Method_Request(t *testing.T) { + t.Parallel() + + app := New() + app.Get("/bar", func(c Ctx) error { + return c.SendString("bar") + }) + + ln := fasthttputil.NewInmemoryListener() + t.Cleanup(func() { + _ = ln.Close() + }) + + serverStarted := make(chan struct{}, 1) + serverErr := make(chan error, 1) + + go func() { + serverStarted <- struct{}{} + if err := app.Listener(ln); err != nil && !errors.Is(err, http.ErrServerClosed) { + serverErr <- err + return + } + serverErr <- nil + }() + + <-serverStarted + + conn, err := ln.Dial() + require.NoError(t, err) + require.NoError(t, conn.SetDeadline(time.Now().Add(5*time.Second))) + + _, err = conn.Write([]byte("FOO /bar HTTP/1.1\r\nHost: example.com\r\n\r\n")) + require.NoError(t, err) + + resp, err := http.ReadResponse(bufio.NewReader(conn), nil) + require.NoError(t, err) + require.Equal(t, StatusNotImplemented, resp.StatusCode) + + body, err := io.ReadAll(resp.Body) + require.NoError(t, err) + require.Equal(t, utils.StatusMessage(StatusNotImplemented), string(body)) + require.NoError(t, resp.Body.Close()) + require.NoError(t, conn.Close()) + + require.NoError(t, app.Shutdown()) + require.NoError(t, <-serverErr) +} + func Test_App_Nested_Params(t *testing.T) { t.Parallel() app := New() From 6ccc255cefe5cbe582653d84c5ab171e0ec204f5 Mon Sep 17 00:00:00 2001 From: Juan Calderon-Perez <835733+gaby@users.noreply.github.com> Date: Sun, 9 Nov 2025 17:57:00 -0500 Subject: [PATCH 2/2] Adjust unsupported method test cleanup --- app_test.go | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/app_test.go b/app_test.go index ec50279d62e..29948e0d134 100644 --- a/app_test.go +++ b/app_test.go @@ -634,7 +634,7 @@ func Test_App_serverErrorHandler_Unsupported_Method_Error(t *testing.T) { c := app.AcquireCtx(&fasthttp.RequestCtx{}).(*DefaultCtx) //nolint:errcheck,forcetypeassert // not needed app.serverErrorHandler(c.fasthttp, errors.New("unsupported http request method 'FOO'")) - require.Equal(t, string(c.fasthttp.Response.Body()), utils.StatusMessage(StatusNotImplemented)) + require.Equal(t, utils.StatusMessage(StatusNotImplemented), string(c.fasthttp.Response.Body())) require.Equal(t, StatusNotImplemented, c.fasthttp.Response.StatusCode()) } @@ -647,9 +647,6 @@ func Test_App_serverErrorHandler_Unsupported_Method_Request(t *testing.T) { }) ln := fasthttputil.NewInmemoryListener() - t.Cleanup(func() { - _ = ln.Close() - }) serverStarted := make(chan struct{}, 1) serverErr := make(chan error, 1)