From 19fec36d241ed8aeae90f4e3d37340c06cf36cd7 Mon Sep 17 00:00:00 2001 From: spectatorMrZ Date: Sun, 8 Jun 2025 22:50:21 +0800 Subject: [PATCH] fix: api group set timeout: 0s not working. (#4785) --- rest/engine.go | 10 +++++----- rest/engine_test.go | 28 ++++++++++++++++++++-------- rest/server.go | 4 ++-- rest/server_test.go | 2 +- rest/types.go | 2 +- 5 files changed, 29 insertions(+), 17 deletions(-) diff --git a/rest/engine.go b/rest/engine.go index 1fb0f2f40..b048b5ee0 100644 --- a/rest/engine.go +++ b/rest/engine.go @@ -62,8 +62,8 @@ func (ng *engine) addRoutes(r featuredRoutes) { // need to guarantee the timeout is the max of all routes // otherwise impossible to set http.Server.ReadTimeout & WriteTimeout - if r.timeout > ng.timeout { - ng.timeout = r.timeout + if r.timeout != nil { + ng.timeout = *r.timeout } } @@ -192,9 +192,9 @@ func (ng *engine) checkedMaxBytes(bytes int64) int64 { return ng.conf.MaxBytes } -func (ng *engine) checkedTimeout(timeout time.Duration) time.Duration { - if timeout > 0 { - return timeout +func (ng *engine) checkedTimeout(timeout *time.Duration) time.Duration { + if timeout != nil { + return *timeout } return time.Duration(ng.conf.Timeout) * time.Millisecond diff --git a/rest/engine_test.go b/rest/engine_test.go index e7a08eb43..9cae95904 100644 --- a/rest/engine_test.go +++ b/rest/engine_test.go @@ -64,6 +64,9 @@ Verbose: true `, } + minuteDuration := time.Minute + secondDuration := time.Second + routes := []featuredRoutes{ { jwt: jwtSetting{}, @@ -73,7 +76,7 @@ Verbose: true Path: "/", Handler: func(w http.ResponseWriter, r *http.Request) {}, }}, - timeout: time.Minute, + timeout: &minuteDuration, }, { priority: true, @@ -84,7 +87,7 @@ Verbose: true Path: "/", Handler: func(w http.ResponseWriter, r *http.Request) {}, }}, - timeout: time.Second, + timeout: &secondDuration, }, { priority: true, @@ -227,8 +230,8 @@ Verbose: true })) timeout := time.Second * 3 - if route.timeout > timeout { - timeout = route.timeout + if route.timeout != nil { + timeout = *route.timeout } assert.Equal(t, timeout, ng.timeout) }) @@ -236,10 +239,14 @@ Verbose: true } } +func getPtrTimeDuration(dur time.Duration) *time.Duration { + return &dur +} + func TestEngine_checkedTimeout(t *testing.T) { tests := []struct { name string - timeout time.Duration + timeout *time.Duration expect time.Duration }{ { @@ -248,19 +255,24 @@ func TestEngine_checkedTimeout(t *testing.T) { }, { name: "less", - timeout: time.Millisecond * 500, + timeout: getPtrTimeDuration(time.Millisecond * 500), expect: time.Millisecond * 500, }, { name: "equal", - timeout: time.Second, + timeout: getPtrTimeDuration(time.Second), expect: time.Second, }, { name: "more", - timeout: time.Millisecond * 1500, + timeout: getPtrTimeDuration(time.Millisecond * 1500), expect: time.Millisecond * 1500, }, + { + name: "set zero", + timeout: getPtrTimeDuration(0), + expect: 0, + }, } ng := newEngine(RestConf{ diff --git a/rest/server.go b/rest/server.go index b97ec5aa5..eb7aed1bc 100644 --- a/rest/server.go +++ b/rest/server.go @@ -283,14 +283,14 @@ func WithSignature(signature SignatureConf) RouteOption { func WithSSE() RouteOption { return func(r *featuredRoutes) { r.sse = true - r.timeout = 0 + r.timeout = nil } } // WithTimeout returns a RouteOption to set timeout with given value. func WithTimeout(timeout time.Duration) RouteOption { return func(r *featuredRoutes) { - r.timeout = timeout + r.timeout = &timeout } } diff --git a/rest/server_test.go b/rest/server_test.go index 9a513ddc3..9676b3f87 100644 --- a/rest/server_test.go +++ b/rest/server_test.go @@ -345,7 +345,7 @@ func TestWithPriority(t *testing.T) { func TestWithTimeout(t *testing.T) { var fr featuredRoutes WithTimeout(time.Hour)(&fr) - assert.Equal(t, time.Hour, fr.timeout) + assert.Equal(t, time.Hour, *fr.timeout) } func TestWithTLSConfig(t *testing.T) { diff --git a/rest/types.go b/rest/types.go index 6d0bcab54..c69e750a9 100644 --- a/rest/types.go +++ b/rest/types.go @@ -31,7 +31,7 @@ type ( } featuredRoutes struct { - timeout time.Duration + timeout *time.Duration priority bool jwt jwtSetting signature signatureSetting