fix: #2700, timeout not enough for writing responses (#2738)

* fix: #2700, timeout not enough for writing responses

* fix: test fail

* chore: add comments
master
Kevin Wan 2 years ago committed by GitHub
parent 3e9d0161bc
commit dd294e8cd6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -287,10 +287,9 @@ func (ng *engine) withTimeout() internal.StartOption {
// without this timeout setting, the server will time out and respond 503 Service Unavailable, // without this timeout setting, the server will time out and respond 503 Service Unavailable,
// which triggers the circuit breaker. // which triggers the circuit breaker.
svr.ReadTimeout = 4 * time.Duration(timeout) * time.Millisecond / 5 svr.ReadTimeout = 4 * time.Duration(timeout) * time.Millisecond / 5
// factor 0.9, to avoid clients not reading the response // factor 1.1, to avoid servers don't have enough time to write responses.
// without this timeout setting, the server will time out and respond 503 Service Unavailable, // setting the factor less than 1.0 may lead clients not receiving the responses.
// which triggers the circuit breaker. svr.WriteTimeout = 11 * time.Duration(timeout) * time.Millisecond / 10
svr.WriteTimeout = 9 * time.Duration(timeout) * time.Millisecond / 10
} }
} }
} }

@ -323,7 +323,7 @@ func TestEngine_withTimeout(t *testing.T) {
assert.Equal(t, time.Duration(test.timeout)*time.Millisecond*4/5, svr.ReadTimeout) assert.Equal(t, time.Duration(test.timeout)*time.Millisecond*4/5, svr.ReadTimeout)
assert.Equal(t, time.Duration(0), svr.ReadHeaderTimeout) assert.Equal(t, time.Duration(0), svr.ReadHeaderTimeout)
assert.Equal(t, time.Duration(test.timeout)*time.Millisecond*9/10, svr.WriteTimeout) assert.Equal(t, time.Duration(test.timeout)*time.Millisecond*11/10, svr.WriteTimeout)
assert.Equal(t, time.Duration(0), svr.IdleTimeout) assert.Equal(t, time.Duration(0), svr.IdleTimeout)
}) })
} }

@ -90,6 +90,25 @@ func (s *Server) Routes() []Route {
return routes return routes
} }
// ServeHTTP is for test purpose, allow developer to do a unit test with
// all defined router without starting an HTTP Server.
//
// For example:
//
// server := MustNewServer(...)
// server.addRoute(...) // router a
// server.addRoute(...) // router b
// server.addRoute(...) // router c
//
// r, _ := http.NewRequest(...)
// w := httptest.NewRecorder(...)
// server.ServeHTTP(w, r)
// // verify the response
func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
s.ngin.bindRoutes(s.router)
s.router.ServeHTTP(w, r)
}
// Start starts the Server. // Start starts the Server.
// Graceful shutdown is enabled by default. // Graceful shutdown is enabled by default.
// Use proc.SetTimeToForceQuit to customize the graceful shutdown period. // Use proc.SetTimeToForceQuit to customize the graceful shutdown period.
@ -307,8 +326,3 @@ func newCorsRouter(router httpx.Router, headerFn func(http.Header), origins ...s
func (c *corsRouter) ServeHTTP(w http.ResponseWriter, r *http.Request) { func (c *corsRouter) ServeHTTP(w http.ResponseWriter, r *http.Request) {
c.middleware(c.Router.ServeHTTP)(w, r) c.middleware(c.Router.ServeHTTP)(w, r)
} }
func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
s.ngin.bindRoutes(s.router)
s.router.ServeHTTP(w, r)
}

Loading…
Cancel
Save