mirror of
https://github.com/gin-gonic/gin.git
synced 2025-10-14 12:12:12 +08:00
feat: Add gracefully shut down methods for gin
This commit is contained in:
parent
ebe5e2a6bf
commit
8ebb9ec5cd
37
gin.go
37
gin.go
@ -5,6 +5,7 @@
|
|||||||
package gin
|
package gin
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
"html/template"
|
"html/template"
|
||||||
"net"
|
"net"
|
||||||
@ -178,6 +179,7 @@ type Engine struct {
|
|||||||
maxSections uint16
|
maxSections uint16
|
||||||
trustedProxies []string
|
trustedProxies []string
|
||||||
trustedCIDRs []*net.IPNet
|
trustedCIDRs []*net.IPNet
|
||||||
|
shutdown func(ctx context.Context) error
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ IRouter = (*Engine)(nil)
|
var _ IRouter = (*Engine)(nil)
|
||||||
@ -524,7 +526,10 @@ func (engine *Engine) Run(addr ...string) (err error) {
|
|||||||
engine.updateRouteTrees()
|
engine.updateRouteTrees()
|
||||||
address := resolveAddress(addr)
|
address := resolveAddress(addr)
|
||||||
debugPrint("Listening and serving HTTP on %s\n", address)
|
debugPrint("Listening and serving HTTP on %s\n", address)
|
||||||
err = http.ListenAndServe(address, engine.Handler())
|
|
||||||
|
s := &http.Server{Addr: address, Handler: engine.Handler()}
|
||||||
|
err = s.ListenAndServe()
|
||||||
|
engine.shutdown = s.Shutdown
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -540,7 +545,9 @@ func (engine *Engine) RunTLS(addr, certFile, keyFile string) (err error) {
|
|||||||
"Please check https://github.com/gin-gonic/gin/blob/master/docs/doc.md#dont-trust-all-proxies for details.")
|
"Please check https://github.com/gin-gonic/gin/blob/master/docs/doc.md#dont-trust-all-proxies for details.")
|
||||||
}
|
}
|
||||||
|
|
||||||
err = http.ListenAndServeTLS(addr, certFile, keyFile, engine.Handler())
|
s := &http.Server{Addr: addr, Handler: engine.Handler()}
|
||||||
|
err = s.ListenAndServeTLS(certFile, keyFile)
|
||||||
|
engine.shutdown = s.Shutdown
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -563,7 +570,9 @@ func (engine *Engine) RunUnix(file string) (err error) {
|
|||||||
defer listener.Close()
|
defer listener.Close()
|
||||||
defer os.Remove(file)
|
defer os.Remove(file)
|
||||||
|
|
||||||
err = http.Serve(listener, engine.Handler())
|
s := &http.Server{Handler: engine.Handler()}
|
||||||
|
err = s.Serve(listener)
|
||||||
|
engine.shutdown = s.Shutdown
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -601,7 +610,9 @@ func (engine *Engine) RunQUIC(addr, certFile, keyFile string) (err error) {
|
|||||||
"Please check https://github.com/gin-gonic/gin/blob/master/docs/doc.md#dont-trust-all-proxies for details.")
|
"Please check https://github.com/gin-gonic/gin/blob/master/docs/doc.md#dont-trust-all-proxies for details.")
|
||||||
}
|
}
|
||||||
|
|
||||||
err = http3.ListenAndServeQUIC(addr, certFile, keyFile, engine.Handler())
|
s := &http3.Server{Addr: addr, Handler: engine.Handler()}
|
||||||
|
err = s.ListenAndServeTLS(certFile, keyFile)
|
||||||
|
engine.shutdown = s.Shutdown
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -616,10 +627,26 @@ func (engine *Engine) RunListener(listener net.Listener) (err error) {
|
|||||||
"Please check https://github.com/gin-gonic/gin/blob/master/docs/doc.md#dont-trust-all-proxies for details.")
|
"Please check https://github.com/gin-gonic/gin/blob/master/docs/doc.md#dont-trust-all-proxies for details.")
|
||||||
}
|
}
|
||||||
|
|
||||||
err = http.Serve(listener, engine.Handler())
|
s := &http.Server{Handler: engine.Handler()}
|
||||||
|
err = s.Serve(listener)
|
||||||
|
engine.shutdown = s.Shutdown
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetShutdown Obtain an gracefully shuts down method.
|
||||||
|
func (engine *Engine) GetShutdown() func(ctx context.Context) error {
|
||||||
|
return engine.shutdown
|
||||||
|
}
|
||||||
|
|
||||||
|
// Shutdown gracefully shuts down the server without interrupting any
|
||||||
|
// active connections.
|
||||||
|
func (engine *Engine) Shutdown(ctx context.Context) error {
|
||||||
|
if engine.shutdown != nil {
|
||||||
|
return engine.shutdown(ctx)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// ServeHTTP conforms to the http.Handler interface.
|
// ServeHTTP conforms to the http.Handler interface.
|
||||||
func (engine *Engine) ServeHTTP(w http.ResponseWriter, req *http.Request) {
|
func (engine *Engine) ServeHTTP(w http.ResponseWriter, req *http.Request) {
|
||||||
c := engine.pool.Get().(*Context)
|
c := engine.pool.Get().(*Context)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user