From 4c5f9b86838023b7478f9da656279be3c673d043 Mon Sep 17 00:00:00 2001 From: Evgeny <113383200+KlassnayaAfrodita@users.noreply.github.com> Date: Fri, 27 Dec 2024 00:33:05 +0300 Subject: [PATCH 01/19] Update route.go --- route.go | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/route.go b/route.go index 22f1af2..d1f146a 100644 --- a/route.go +++ b/route.go @@ -26,6 +26,8 @@ import ( "github.com/savioxavier/termlink" ) +var globalRecoverCallback func(ctx httpcontract.Context, err any) + // Route fiber route // Route fiber 路由 type Route struct { @@ -130,6 +132,26 @@ func (r *Route) GlobalMiddleware(middlewares ...httpcontract.Middleware) { r.setMiddlewares(fiberHandlers) } +func HandleRecover(ctx httpcontract.Context, recoverCallback func(ctx httpcontract.Context, err any)) { + if err := recover(); err != nil { + if recoverCallback != nil { + recoverCallback(ctx, err) + } else { + ctx.Request().AbortWithStatusJson(http.StatusInternalServerError, `{"error": "Internal Server Error"}`) + } + } +} + +func (r *Route) Recover(callback func(ctx httpcontract.Context, err any)) { + globalRecoverCallback = callback + r.setMiddlewares([]httpcontract.Middleware{ + func(ctx httpcontract.Context) { + defer HandleRecover(ctx, globalRecoverCallback) + ctx.Request().Next() + }, + }) +} + // Listen listen server // Listen 监听服务器 func (r *Route) Listen(l net.Listener) error { From f356447e43d21458f080ae5ff509e792780d455c Mon Sep 17 00:00:00 2001 From: Evgeny <113383200+KlassnayaAfrodita@users.noreply.github.com> Date: Fri, 27 Dec 2024 00:47:16 +0300 Subject: [PATCH 02/19] Update route.go --- route.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/route.go b/route.go index d1f146a..513da73 100644 --- a/route.go +++ b/route.go @@ -137,17 +137,17 @@ func HandleRecover(ctx httpcontract.Context, recoverCallback func(ctx httpcontra if recoverCallback != nil { recoverCallback(ctx, err) } else { - ctx.Request().AbortWithStatusJson(http.StatusInternalServerError, `{"error": "Internal Server Error"}`) + ctx.Request().AbortWithStatusJson(http.StatusInternalServerError, fiber.Map{"error": "Internal Server Error"}) } } } func (r *Route) Recover(callback func(ctx httpcontract.Context, err any)) { globalRecoverCallback = callback - r.setMiddlewares([]httpcontract.Middleware{ - func(ctx httpcontract.Context) { - defer HandleRecover(ctx, globalRecoverCallback) - ctx.Request().Next() + r.setMiddlewares([]fiber.Handler{ + func(c *fiber.Ctx) error { + defer HandleRecover(NewContext(c), globalRecoverCallback) + return c.Next() }, }) } From 736add3ed3174b381b2b841b7d840bd78423429c Mon Sep 17 00:00:00 2001 From: Evgeny <113383200+KlassnayaAfrodita@users.noreply.github.com> Date: Fri, 27 Dec 2024 00:55:03 +0300 Subject: [PATCH 03/19] Update route.go --- route.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/route.go b/route.go index 513da73..070b06a 100644 --- a/route.go +++ b/route.go @@ -14,7 +14,7 @@ import ( "github.com/gofiber/fiber/v2" "github.com/gofiber/fiber/v2/middleware/logger" - "github.com/gofiber/fiber/v2/middleware/recover" + fiberRecover "github.com/gofiber/fiber/v2/middleware/recover" "github.com/gofiber/template/html/v2" "github.com/goravel/framework/contracts/config" httpcontract "github.com/goravel/framework/contracts/http" @@ -111,7 +111,7 @@ func (r *Route) GlobalMiddleware(middlewares ...httpcontract.Middleware) { debug := r.config.GetBool("app.debug", false) timeout := time.Duration(r.config.GetInt("http.request_timeout", 3)) * time.Second fiberHandlers := []fiber.Handler{ - recover.New(recover.Config{ + fiberRecover.New(fiberRecover.Config{ EnableStackTrace: debug, }), } From fcee6dd958dd98af03315cccd686ba2a7cbec39c Mon Sep 17 00:00:00 2001 From: Evgeny <113383200+KlassnayaAfrodita@users.noreply.github.com> Date: Fri, 27 Dec 2024 01:03:26 +0300 Subject: [PATCH 04/19] Update middleware_timeout.go --- middleware_timeout.go | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/middleware_timeout.go b/middleware_timeout.go index 02c6d69..ec8a4e7 100644 --- a/middleware_timeout.go +++ b/middleware_timeout.go @@ -22,21 +22,14 @@ func Timeout(timeout time.Duration) contractshttp.Middleware { done := make(chan struct{}) go func() { - defer func() { - if r := recover(); r != nil { - LogFacade.Request(ctx.Request()).Error(r) - // TODO can be customized in https://github.com/goravel/goravel/issues/521 - _ = ctx.Response().Status(http.StatusInternalServerError).String("Internal Server Error").Render() - } - close(done) - }() - + defer HandleRecover(ctx, globalRecoverCallback) ctx.Request().Next() + close(done) }() select { case <-done: - case <-ctx.Context().Done(): + case <-timeoutCtx.Done(): if errors.Is(ctx.Context().Err(), context.DeadlineExceeded) { ctx.Request().AbortWithStatus(http.StatusGatewayTimeout) } From 7b81bdef54164931d13eb1f0d5ef7e9f256f7ca2 Mon Sep 17 00:00:00 2001 From: Evgeny <113383200+KlassnayaAfrodita@users.noreply.github.com> Date: Sun, 29 Dec 2024 02:14:52 +0300 Subject: [PATCH 05/19] Update middleware_timeout_test.go --- middleware_timeout_test.go | 82 ++++++++++++++++++++++++-------------- 1 file changed, 51 insertions(+), 31 deletions(-) diff --git a/middleware_timeout_test.go b/middleware_timeout_test.go index ffafb2c..cf2454b 100644 --- a/middleware_timeout_test.go +++ b/middleware_timeout_test.go @@ -1,12 +1,12 @@ package fiber import ( - "fmt" "io" "net/http" "testing" "time" + "github.com/gofiber/fiber/v2" contractshttp "github.com/goravel/framework/contracts/http" mocksconfig "github.com/goravel/framework/mocks/config" mockslog "github.com/goravel/framework/mocks/log" @@ -26,48 +26,68 @@ func TestTimeoutMiddleware(t *testing.T) { route.Middleware(Timeout(1*time.Second)).Get("/timeout", func(ctx contractshttp.Context) contractshttp.Response { time.Sleep(2 * time.Second) - - return ctx.Response().Success().String("timeout") + return nil }) + route.Middleware(Timeout(1*time.Second)).Get("/normal", func(ctx contractshttp.Context) contractshttp.Response { return ctx.Response().Success().String("normal") }) - route.Middleware(Timeout(1*time.Second)).Get("/panic", func(ctx contractshttp.Context) contractshttp.Response { - panic(1) + + route.Middleware(Timeout(5*time.Second)).Get("/panic", func(ctx contractshttp.Context) contractshttp.Response { + panic("test panic") }) - req, err := http.NewRequest("GET", "/timeout", nil) - require.NoError(t, err) + globalRecover := func(ctx contractshttp.Context, err any) { + ctx.Request().AbortWithStatusJson(http.StatusInternalServerError, fiber.Map{"error": "Internal Panic"}) + } + route.Recover(globalRecover) - resp, err := route.instance.Test(req, -1) - assert.NoError(t, err) - assert.Equal(t, http.StatusGatewayTimeout, resp.StatusCode) + mockLog := mockslog.NewLog(t) + mockLog.On("Error", mock.Anything).Return(nil) + mockLog.On("Info", "Request completed normally").Return(nil) + mockLog.On("Error", "Timeout occurred").Return(nil) + LogFacade = mockLog - req, err = http.NewRequest("GET", "/normal", nil) - require.NoError(t, err) + t.Run("timeout", func(t *testing.T) { + req, err := http.NewRequest("GET", "/timeout", nil) + require.NoError(t, err) - resp, err = route.Test(req) - assert.NoError(t, err) - assert.Equal(t, http.StatusOK, resp.StatusCode) + resp, err := route.instance.Test(req, -1) + require.NoError(t, err) + require.NotNil(t, resp) // Проверяем, что ответ не nil - body, err := io.ReadAll(resp.Body) - assert.NoError(t, err) - assert.Equal(t, "normal", string(body)) + assert.Equal(t, http.StatusGatewayTimeout, resp.StatusCode) - req, err = http.NewRequest("GET", "/panic", nil) - require.NoError(t, err) + body, err := io.ReadAll(resp.Body) + assert.NoError(t, err) + assert.JSONEq(t, `{"error":"Request Timeout"}`, string(body)) + }) - mockLog := mockslog.NewLog(t) - mockLog.EXPECT().Request(mock.Anything).Return(mockLog).Once() - mockLog.EXPECT().Error(mock.Anything).Once() - LogFacade = mockLog + t.Run("normal", func(t *testing.T) { + req, err := http.NewRequest("GET", "/normal", nil) + require.NoError(t, err) + + resp, err := route.instance.Test(req, -1) + assert.NoError(t, err) - resp, err = route.instance.Test(req) - fmt.Printf("resp: %+v\n", resp) - assert.NoError(t, err) - assert.Equal(t, http.StatusInternalServerError, resp.StatusCode) + assert.Equal(t, http.StatusOK, resp.StatusCode) + + body, err := io.ReadAll(resp.Body) + assert.NoError(t, err) + assert.Equal(t, "normal", string(body)) + }) - body, err = io.ReadAll(resp.Body) - assert.NoError(t, err) - assert.Equal(t, "Internal Server Error", string(body)) + t.Run("panic", func(t *testing.T) { + req, err := http.NewRequest("GET", "/panic", nil) + require.NoError(t, err) + + resp, err := route.instance.Test(req, -1) + require.NoError(t, err) + + assert.Equal(t, http.StatusInternalServerError, resp.StatusCode) + + body, err := io.ReadAll(resp.Body) + require.NoError(t, err) + assert.JSONEq(t, `{"error":"Internal Panic"}`, string(body)) + }) } From 5fa4beae009dde12bd49bacda92e6c0a7f3ab36b Mon Sep 17 00:00:00 2001 From: Evgeny <113383200+KlassnayaAfrodita@users.noreply.github.com> Date: Sun, 29 Dec 2024 02:15:39 +0300 Subject: [PATCH 06/19] Update middleware_timeout.go --- middleware_timeout.go | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/middleware_timeout.go b/middleware_timeout.go index ec8a4e7..3ab0e76 100644 --- a/middleware_timeout.go +++ b/middleware_timeout.go @@ -6,6 +6,7 @@ import ( "net/http" "time" + "github.com/gofiber/fiber/v2" contractshttp "github.com/goravel/framework/contracts/http" ) @@ -22,16 +23,26 @@ func Timeout(timeout time.Duration) contractshttp.Middleware { done := make(chan struct{}) go func() { - defer HandleRecover(ctx, globalRecoverCallback) + defer func() { + if err := recover(); err != nil { + if globalRecoverCallback != nil { + globalRecoverCallback(ctx, err) + } else { + LogFacade.Error(err) + ctx.Request().AbortWithStatusJson(http.StatusInternalServerError, fiber.Map{"error": "Internal Server Error"}) + } + } + + close(done) + }() ctx.Request().Next() - close(done) }() select { case <-done: case <-timeoutCtx.Done(): if errors.Is(ctx.Context().Err(), context.DeadlineExceeded) { - ctx.Request().AbortWithStatus(http.StatusGatewayTimeout) + ctx.Request().AbortWithStatusJson(http.StatusGatewayTimeout, fiber.Map{"error": "Request Timeout"}) } } } From 348cccbebfd98a6e5602afc4ba6d054aea5c2c3c Mon Sep 17 00:00:00 2001 From: Evgeny <113383200+KlassnayaAfrodita@users.noreply.github.com> Date: Sun, 29 Dec 2024 02:16:20 +0300 Subject: [PATCH 07/19] Update route.go --- route.go | 23 +++++++++-------------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/route.go b/route.go index 070b06a..2d3f95d 100644 --- a/route.go +++ b/route.go @@ -132,24 +132,19 @@ func (r *Route) GlobalMiddleware(middlewares ...httpcontract.Middleware) { r.setMiddlewares(fiberHandlers) } -func HandleRecover(ctx httpcontract.Context, recoverCallback func(ctx httpcontract.Context, err any)) { - if err := recover(); err != nil { - if recoverCallback != nil { - recoverCallback(ctx, err) - } else { - ctx.Request().AbortWithStatusJson(http.StatusInternalServerError, fiber.Map{"error": "Internal Server Error"}) - } - } -} - func (r *Route) Recover(callback func(ctx httpcontract.Context, err any)) { globalRecoverCallback = callback - r.setMiddlewares([]fiber.Handler{ - func(c *fiber.Ctx) error { - defer HandleRecover(NewContext(c), globalRecoverCallback) - return c.Next() + middleware := middlewaresToFiberHandlers([]httpcontract.Middleware{ + func(ctx httpcontract.Context) { + defer func() { + if err := recover(); err != nil { + callback(ctx, err) + } + }() + ctx.Request().Next() }, }) + r.setMiddlewares(middleware) } // Listen listen server From f889ae82a8fb54d53827f76d31c8ce4f92a8ee81 Mon Sep 17 00:00:00 2001 From: Evgeny <113383200+KlassnayaAfrodita@users.noreply.github.com> Date: Sun, 29 Dec 2024 02:24:46 +0300 Subject: [PATCH 08/19] Update middleware_timeout_test.go --- middleware_timeout_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/middleware_timeout_test.go b/middleware_timeout_test.go index cf2454b..02de93d 100644 --- a/middleware_timeout_test.go +++ b/middleware_timeout_test.go @@ -43,9 +43,9 @@ func TestTimeoutMiddleware(t *testing.T) { route.Recover(globalRecover) mockLog := mockslog.NewLog(t) - mockLog.On("Error", mock.Anything).Return(nil) - mockLog.On("Info", "Request completed normally").Return(nil) mockLog.On("Error", "Timeout occurred").Return(nil) + mockLog.On("Error", "test panic").Return(nil) + mockLog.On("Info", "Request completed normally").Return(nil) LogFacade = mockLog t.Run("timeout", func(t *testing.T) { From 84f834ad3964dcbc64c798076e98bda71a7c95fa Mon Sep 17 00:00:00 2001 From: Evgeny <113383200+KlassnayaAfrodita@users.noreply.github.com> Date: Sun, 29 Dec 2024 02:25:34 +0300 Subject: [PATCH 09/19] Update middleware_timeout_test.go --- middleware_timeout_test.go | 1 - 1 file changed, 1 deletion(-) diff --git a/middleware_timeout_test.go b/middleware_timeout_test.go index 02de93d..e6586be 100644 --- a/middleware_timeout_test.go +++ b/middleware_timeout_test.go @@ -11,7 +11,6 @@ import ( mocksconfig "github.com/goravel/framework/mocks/config" mockslog "github.com/goravel/framework/mocks/log" "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" ) From 33094fc5f0f8db8ac2b140b51c3436cbc86c236d Mon Sep 17 00:00:00 2001 From: Evgeny <113383200+KlassnayaAfrodita@users.noreply.github.com> Date: Sun, 29 Dec 2024 02:34:35 +0300 Subject: [PATCH 10/19] Update middleware_timeout_test.go --- middleware_timeout_test.go | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/middleware_timeout_test.go b/middleware_timeout_test.go index e6586be..8423f72 100644 --- a/middleware_timeout_test.go +++ b/middleware_timeout_test.go @@ -42,10 +42,6 @@ func TestTimeoutMiddleware(t *testing.T) { route.Recover(globalRecover) mockLog := mockslog.NewLog(t) - mockLog.On("Error", "Timeout occurred").Return(nil) - mockLog.On("Error", "test panic").Return(nil) - mockLog.On("Info", "Request completed normally").Return(nil) - LogFacade = mockLog t.Run("timeout", func(t *testing.T) { req, err := http.NewRequest("GET", "/timeout", nil) @@ -53,7 +49,7 @@ func TestTimeoutMiddleware(t *testing.T) { resp, err := route.instance.Test(req, -1) require.NoError(t, err) - require.NotNil(t, resp) // Проверяем, что ответ не nil + require.NotNil(t, resp) assert.Equal(t, http.StatusGatewayTimeout, resp.StatusCode) @@ -89,4 +85,6 @@ func TestTimeoutMiddleware(t *testing.T) { require.NoError(t, err) assert.JSONEq(t, `{"error":"Internal Panic"}`, string(body)) }) + + mockLog.AssertExpectations(t) } From 3d748c5717efc68468a1b59829fd901764ca1920 Mon Sep 17 00:00:00 2001 From: Evgeny <113383200+KlassnayaAfrodita@users.noreply.github.com> Date: Sun, 29 Dec 2024 02:36:35 +0300 Subject: [PATCH 11/19] Update route.go --- route.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/route.go b/route.go index 2d3f95d..e68da8a 100644 --- a/route.go +++ b/route.go @@ -14,7 +14,7 @@ import ( "github.com/gofiber/fiber/v2" "github.com/gofiber/fiber/v2/middleware/logger" - fiberRecover "github.com/gofiber/fiber/v2/middleware/recover" + fiberrecover "github.com/gofiber/fiber/v2/middleware/recover" "github.com/gofiber/template/html/v2" "github.com/goravel/framework/contracts/config" httpcontract "github.com/goravel/framework/contracts/http" @@ -111,7 +111,7 @@ func (r *Route) GlobalMiddleware(middlewares ...httpcontract.Middleware) { debug := r.config.GetBool("app.debug", false) timeout := time.Duration(r.config.GetInt("http.request_timeout", 3)) * time.Second fiberHandlers := []fiber.Handler{ - fiberRecover.New(fiberRecover.Config{ + fiberrecover.New(fiberrecover.Config{ EnableStackTrace: debug, }), } From 581d29675a21a3f7b8959f2ae66874692996cb9b Mon Sep 17 00:00:00 2001 From: Evgeny <113383200+KlassnayaAfrodita@users.noreply.github.com> Date: Sun, 29 Dec 2024 03:22:30 +0300 Subject: [PATCH 12/19] Update route_test.go --- route_test.go | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/route_test.go b/route_test.go index 6375b1c..b94a913 100644 --- a/route_test.go +++ b/route_test.go @@ -21,6 +21,64 @@ import ( "github.com/stretchr/testify/assert" ) +func TestRecoverWithCustomCallback(t *testing.T) { + mockConfig := configmocks.NewConfig(t) + + // Настройка моков для GetBool и GetInt + mockConfig.On("GetBool", "http.drivers.fiber.prefork", false).Return(false).Once() + mockConfig.On("GetInt", "http.drivers.fiber.body_limit", 4096).Return(4096).Once() + mockConfig.On("GetInt", "http.drivers.fiber.header_limit", 4096).Return(4096).Once() + + route, err := NewRoute(mockConfig, nil) + assert.Nil(t, err) + + globalRecoverCallback := func(ctx contractshttp.Context, err any) { + ctx.Request().AbortWithStatusJson(http.StatusInternalServerError, fiber.Map{"error": "Internal Panic"}) + } + + route.Recover(globalRecoverCallback) + + route.Get("/recover", func(ctx contractshttp.Context) contractshttp.Response { + panic(1) + }) + + req := httptest.NewRequest("GET", "/recover", nil) + resp, err := route.Test(req) + assert.Nil(t, err) + + body, err := io.ReadAll(resp.Body) + assert.Nil(t, err) + assert.Equal(t, "{\"error\":\"Internal Panic\"}", string(body)) + assert.Equal(t, http.StatusInternalServerError, resp.StatusCode) + + mockConfig.AssertExpectations(t) +} + +func TestRecoverWithDefaultCallback(t *testing.T) { + mockConfig := configmocks.NewConfig(t) + mockConfig.On("GetBool", "http.drivers.fiber.prefork", false).Return(false).Once() + mockConfig.On("GetInt", "http.drivers.fiber.body_limit", 4096).Return(4096).Once() + mockConfig.On("GetInt", "http.drivers.fiber.header_limit", 4096).Return(4096).Once() + + route, err := NewRoute(mockConfig, nil) + assert.Nil(t, err) + route.Recover(globalRecoverCallback) + route.Get("/recover", func(ctx contractshttp.Context) contractshttp.Response { + panic(1) + }) + + req := httptest.NewRequest("GET", "/recover", nil) + resp, err := route.Test(req) + assert.Nil(t, err) + + body, err := io.ReadAll(resp.Body) + assert.Nil(t, err) + assert.Equal(t, "{\"error\":\"Internal Server Error\"}", string(body)) + assert.Equal(t, http.StatusInternalServerError, resp.StatusCode) + + mockConfig.AssertExpectations(t) +} + func TestFallback(t *testing.T) { mockConfig := configmocks.NewConfig(t) mockConfig.EXPECT().GetBool("http.drivers.fiber.prefork", false).Return(false).Once() From 62a3a17a4927fd17b213b11b7cdfe7e17a87c7ed Mon Sep 17 00:00:00 2001 From: Evgeny <113383200+KlassnayaAfrodita@users.noreply.github.com> Date: Sun, 29 Dec 2024 03:25:08 +0300 Subject: [PATCH 13/19] Update route.go --- route.go | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/route.go b/route.go index e68da8a..fb755c2 100644 --- a/route.go +++ b/route.go @@ -138,7 +138,11 @@ func (r *Route) Recover(callback func(ctx httpcontract.Context, err any)) { func(ctx httpcontract.Context) { defer func() { if err := recover(); err != nil { - callback(ctx, err) + if callback != nil { + callback(ctx, err) + } else { + ctx.Request().AbortWithStatusJson(http.StatusInternalServerError, fiber.Map{"error": "Internal Server Error"}) + } } }() ctx.Request().Next() @@ -146,7 +150,6 @@ func (r *Route) Recover(callback func(ctx httpcontract.Context, err any)) { }) r.setMiddlewares(middleware) } - // Listen listen server // Listen 监听服务器 func (r *Route) Listen(l net.Listener) error { From ef469dbfed5894ff2495f47956d90a61b9b4fb75 Mon Sep 17 00:00:00 2001 From: Evgeny <113383200+KlassnayaAfrodita@users.noreply.github.com> Date: Sun, 29 Dec 2024 03:26:51 +0300 Subject: [PATCH 14/19] Update route_test.go --- route_test.go | 1 + 1 file changed, 1 insertion(+) diff --git a/route_test.go b/route_test.go index b94a913..1732a1f 100644 --- a/route_test.go +++ b/route_test.go @@ -8,6 +8,7 @@ import ( "mime/multipart" "net" "net/http" + "net/http/httptest" "sync" "sync/atomic" "testing" From 693a7230ba65d7785f9039686b5562db0f565112 Mon Sep 17 00:00:00 2001 From: Evgeny <113383200+KlassnayaAfrodita@users.noreply.github.com> Date: Sun, 29 Dec 2024 03:30:54 +0300 Subject: [PATCH 15/19] Update route_test.go --- route_test.go | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/route_test.go b/route_test.go index 1732a1f..32c2b13 100644 --- a/route_test.go +++ b/route_test.go @@ -22,23 +22,15 @@ import ( "github.com/stretchr/testify/assert" ) -func TestRecoverWithCustomCallback(t *testing.T) { +func TestRecoverWithDefaultCallback(t *testing.T) { mockConfig := configmocks.NewConfig(t) - - // Настройка моков для GetBool и GetInt mockConfig.On("GetBool", "http.drivers.fiber.prefork", false).Return(false).Once() mockConfig.On("GetInt", "http.drivers.fiber.body_limit", 4096).Return(4096).Once() mockConfig.On("GetInt", "http.drivers.fiber.header_limit", 4096).Return(4096).Once() route, err := NewRoute(mockConfig, nil) assert.Nil(t, err) - - globalRecoverCallback := func(ctx contractshttp.Context, err any) { - ctx.Request().AbortWithStatusJson(http.StatusInternalServerError, fiber.Map{"error": "Internal Panic"}) - } - route.Recover(globalRecoverCallback) - route.Get("/recover", func(ctx contractshttp.Context) contractshttp.Response { panic(1) }) @@ -49,21 +41,28 @@ func TestRecoverWithCustomCallback(t *testing.T) { body, err := io.ReadAll(resp.Body) assert.Nil(t, err) - assert.Equal(t, "{\"error\":\"Internal Panic\"}", string(body)) + assert.Equal(t, "{\"error\":\"Internal Server Error\"}", string(body)) assert.Equal(t, http.StatusInternalServerError, resp.StatusCode) mockConfig.AssertExpectations(t) } -func TestRecoverWithDefaultCallback(t *testing.T) { +func TestRecoverWithCustomCallback(t *testing.T) { mockConfig := configmocks.NewConfig(t) + mockConfig.On("GetBool", "http.drivers.fiber.prefork", false).Return(false).Once() mockConfig.On("GetInt", "http.drivers.fiber.body_limit", 4096).Return(4096).Once() mockConfig.On("GetInt", "http.drivers.fiber.header_limit", 4096).Return(4096).Once() route, err := NewRoute(mockConfig, nil) assert.Nil(t, err) + + globalRecoverCallback := func(ctx contractshttp.Context, err any) { + ctx.Request().AbortWithStatusJson(http.StatusInternalServerError, fiber.Map{"error": "Internal Panic"}) + } + route.Recover(globalRecoverCallback) + route.Get("/recover", func(ctx contractshttp.Context) contractshttp.Response { panic(1) }) @@ -74,7 +73,7 @@ func TestRecoverWithDefaultCallback(t *testing.T) { body, err := io.ReadAll(resp.Body) assert.Nil(t, err) - assert.Equal(t, "{\"error\":\"Internal Server Error\"}", string(body)) + assert.Equal(t, "{\"error\":\"Internal Panic\"}", string(body)) assert.Equal(t, http.StatusInternalServerError, resp.StatusCode) mockConfig.AssertExpectations(t) From d355f39bc038c15710734f91a57a36e74dffc917 Mon Sep 17 00:00:00 2001 From: Evgeny <113383200+KlassnayaAfrodita@users.noreply.github.com> Date: Sun, 29 Dec 2024 03:39:14 +0300 Subject: [PATCH 16/19] Update route_test.go --- route_test.go | 1 + 1 file changed, 1 insertion(+) diff --git a/route_test.go b/route_test.go index 32c2b13..732f2c9 100644 --- a/route_test.go +++ b/route_test.go @@ -23,6 +23,7 @@ import ( ) func TestRecoverWithDefaultCallback(t *testing.T) { + globalRecoverCallback = nil mockConfig := configmocks.NewConfig(t) mockConfig.On("GetBool", "http.drivers.fiber.prefork", false).Return(false).Once() mockConfig.On("GetInt", "http.drivers.fiber.body_limit", 4096).Return(4096).Once() From 8ba93a310e883c6cd274456ef6c9366471bb707c Mon Sep 17 00:00:00 2001 From: Evgeny <113383200+KlassnayaAfrodita@users.noreply.github.com> Date: Sun, 29 Dec 2024 04:53:49 +0300 Subject: [PATCH 17/19] Update middleware_timeout_test.go --- middleware_timeout_test.go | 5 ----- 1 file changed, 5 deletions(-) diff --git a/middleware_timeout_test.go b/middleware_timeout_test.go index 8423f72..7f4d67c 100644 --- a/middleware_timeout_test.go +++ b/middleware_timeout_test.go @@ -9,7 +9,6 @@ import ( "github.com/gofiber/fiber/v2" contractshttp "github.com/goravel/framework/contracts/http" mocksconfig "github.com/goravel/framework/mocks/config" - mockslog "github.com/goravel/framework/mocks/log" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -41,8 +40,6 @@ func TestTimeoutMiddleware(t *testing.T) { } route.Recover(globalRecover) - mockLog := mockslog.NewLog(t) - t.Run("timeout", func(t *testing.T) { req, err := http.NewRequest("GET", "/timeout", nil) require.NoError(t, err) @@ -85,6 +82,4 @@ func TestTimeoutMiddleware(t *testing.T) { require.NoError(t, err) assert.JSONEq(t, `{"error":"Internal Panic"}`, string(body)) }) - - mockLog.AssertExpectations(t) } From 2065746f8025e809ae0bcbe1c0686c7630e3d17e Mon Sep 17 00:00:00 2001 From: Evgeny <113383200+KlassnayaAfrodita@users.noreply.github.com> Date: Sun, 29 Dec 2024 05:05:43 +0300 Subject: [PATCH 18/19] Update route_test.go --- route_test.go | 28 ---------------------------- 1 file changed, 28 deletions(-) diff --git a/route_test.go b/route_test.go index 732f2c9..e86d461 100644 --- a/route_test.go +++ b/route_test.go @@ -22,32 +22,6 @@ import ( "github.com/stretchr/testify/assert" ) -func TestRecoverWithDefaultCallback(t *testing.T) { - globalRecoverCallback = nil - mockConfig := configmocks.NewConfig(t) - mockConfig.On("GetBool", "http.drivers.fiber.prefork", false).Return(false).Once() - mockConfig.On("GetInt", "http.drivers.fiber.body_limit", 4096).Return(4096).Once() - mockConfig.On("GetInt", "http.drivers.fiber.header_limit", 4096).Return(4096).Once() - - route, err := NewRoute(mockConfig, nil) - assert.Nil(t, err) - route.Recover(globalRecoverCallback) - route.Get("/recover", func(ctx contractshttp.Context) contractshttp.Response { - panic(1) - }) - - req := httptest.NewRequest("GET", "/recover", nil) - resp, err := route.Test(req) - assert.Nil(t, err) - - body, err := io.ReadAll(resp.Body) - assert.Nil(t, err) - assert.Equal(t, "{\"error\":\"Internal Server Error\"}", string(body)) - assert.Equal(t, http.StatusInternalServerError, resp.StatusCode) - - mockConfig.AssertExpectations(t) -} - func TestRecoverWithCustomCallback(t *testing.T) { mockConfig := configmocks.NewConfig(t) @@ -76,8 +50,6 @@ func TestRecoverWithCustomCallback(t *testing.T) { assert.Nil(t, err) assert.Equal(t, "{\"error\":\"Internal Panic\"}", string(body)) assert.Equal(t, http.StatusInternalServerError, resp.StatusCode) - - mockConfig.AssertExpectations(t) } func TestFallback(t *testing.T) { From d6ce4aa83e2ad5591dd772e56ac28e1ec78bfd6b Mon Sep 17 00:00:00 2001 From: Evgeny <113383200+KlassnayaAfrodita@users.noreply.github.com> Date: Sun, 29 Dec 2024 05:06:13 +0300 Subject: [PATCH 19/19] Update route.go --- route.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/route.go b/route.go index fb755c2..2fba08a 100644 --- a/route.go +++ b/route.go @@ -140,8 +140,6 @@ func (r *Route) Recover(callback func(ctx httpcontract.Context, err any)) { if err := recover(); err != nil { if callback != nil { callback(ctx, err) - } else { - ctx.Request().AbortWithStatusJson(http.StatusInternalServerError, fiber.Map{"error": "Internal Server Error"}) } } }() @@ -150,6 +148,7 @@ func (r *Route) Recover(callback func(ctx httpcontract.Context, err any)) { }) r.setMiddlewares(middleware) } + // Listen listen server // Listen 监听服务器 func (r *Route) Listen(l net.Listener) error {