Answer 504, not 408, when a request outlasts its time limit (closes #70)
check / check (push) Canceled after 0s
check / check (push) Canceled after 0s
The 30-second limit is now chi's middleware.Timeout, which answers 504 and never writes from a second goroutine. It runs after JSONResponseMiddleware, so a handler that wrote nothing is not sent a 200 first. One rule covers the handlers: right after each database read or host name lookup, before looking at what came back, error or not, a handler asks deadlinePassed whether the time limit has passed and, if so, answers 504, with the JSON error body on JSON routes. A cut-off read can return an error, or part of its rows or none without one, so only this check tells it from a complete read. JSONValidationMiddleware answers 504 with the JSON error body when the limit has passed and the handler wrote nothing. Model: opus-5-5
This commit is contained in:
@@ -16,9 +16,12 @@ func (s *Server) setupRoutes() {
|
||||
r.Use(middleware.RealIP)
|
||||
r.Use(RequestLoggerMiddleware(s.logger.Logger)) // Structured request logging
|
||||
r.Use(middleware.Recoverer)
|
||||
const requestTimeout = 30 * time.Second // Increased from 8s for slow queries
|
||||
r.Use(TimeoutMiddleware(requestTimeout, s.logger.Logger))
|
||||
r.Use(JSONResponseMiddleware)
|
||||
// Timeout must come after JSONResponseMiddleware, which sends its answer
|
||||
// when the handler returns and would send a 200 ahead of Timeout's 504 for
|
||||
// a handler that wrote nothing.
|
||||
const requestTimeout = 30 * time.Second // Increased from 8s for slow queries
|
||||
r.Use(middleware.Timeout(requestTimeout))
|
||||
|
||||
// Routes
|
||||
r.Get("/", s.handleIndex())
|
||||
|
||||
Reference in New Issue
Block a user