Support http.Server customization

This commit is contained in:
Roc Chan 2019-07-24 19:48:21 +08:00
parent 502c898d75
commit 085c04a2a3

26
gin.go
View File

@ -107,6 +107,9 @@ type Engine struct {
noMethod HandlersChain noMethod HandlersChain
pool sync.Pool pool sync.Pool
trees methodTrees trees methodTrees
// Use http.Server under the hood
server *http.Server
} }
var _ IRouter = &Engine{} var _ IRouter = &Engine{}
@ -139,6 +142,7 @@ func New() *Engine {
trees: make(methodTrees, 0, 9), trees: make(methodTrees, 0, 9),
delims: render.Delims{Left: "{{", Right: "}}"}, delims: render.Delims{Left: "{{", Right: "}}"},
secureJsonPrefix: "while(1);", secureJsonPrefix: "while(1);",
server: &http.Server{},
} }
engine.RouterGroup.engine = engine engine.RouterGroup.engine = engine
engine.pool.New = func() interface{} { engine.pool.New = func() interface{} {
@ -292,7 +296,9 @@ func (engine *Engine) Run(addr ...string) (err error) {
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) engine.server.Addr = address
engine.server.Handler = engine
err = engine.server.ListenAndServe()
return return
} }
@ -303,7 +309,9 @@ func (engine *Engine) RunTLS(addr, certFile, keyFile string) (err error) {
debugPrint("Listening and serving HTTPS on %s\n", addr) debugPrint("Listening and serving HTTPS on %s\n", addr)
defer func() { debugPrintError(err) }() defer func() { debugPrintError(err) }()
err = http.ListenAndServeTLS(addr, certFile, keyFile, engine) engine.server.Addr = addr
engine.server.Handler = engine
err = engine.server.ListenAndServeTLS(certFile, keyFile)
return return
} }
@ -321,7 +329,9 @@ func (engine *Engine) RunUnix(file string) (err error) {
} }
defer listener.Close() defer listener.Close()
os.Chmod(file, 0777) os.Chmod(file, 0777)
err = http.Serve(listener, engine)
engine.server.Handler = engine
err = engine.server.Serve(listener)
return return
} }
@ -338,7 +348,8 @@ func (engine *Engine) RunFd(fd int) (err error) {
return return
} }
defer listener.Close() defer listener.Close()
err = http.Serve(listener, engine) engine.server.Handler = engine
err = engine.server.Serve(listener)
return return
} }
@ -354,6 +365,13 @@ func (engine *Engine) ServeHTTP(w http.ResponseWriter, req *http.Request) {
engine.pool.Put(c) engine.pool.Put(c)
} }
// SetServer customize the http.Server under the hood.
func (engine *Engine) SetServer(server *http.Server) {
if server != nil {
engine.server = server
}
}
// HandleContext re-enter a context that has been rewritten. // HandleContext re-enter a context that has been rewritten.
// This can be done by setting c.Request.URL.Path to your new target. // This can be done by setting c.Request.URL.Path to your new target.
// Disclaimer: You can loop yourself to death with this, use wisely. // Disclaimer: You can loop yourself to death with this, use wisely.