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
pool sync.Pool
trees methodTrees
// Use http.Server under the hood
server *http.Server
}
var _ IRouter = &Engine{}
@ -139,6 +142,7 @@ func New() *Engine {
trees: make(methodTrees, 0, 9),
delims: render.Delims{Left: "{{", Right: "}}"},
secureJsonPrefix: "while(1);",
server: &http.Server{},
}
engine.RouterGroup.engine = engine
engine.pool.New = func() interface{} {
@ -292,7 +296,9 @@ func (engine *Engine) Run(addr ...string) (err error) {
address := resolveAddress(addr)
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
}
@ -303,7 +309,9 @@ func (engine *Engine) RunTLS(addr, certFile, keyFile string) (err error) {
debugPrint("Listening and serving HTTPS on %s\n", addr)
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
}
@ -321,7 +329,9 @@ func (engine *Engine) RunUnix(file string) (err error) {
}
defer listener.Close()
os.Chmod(file, 0777)
err = http.Serve(listener, engine)
engine.server.Handler = engine
err = engine.server.Serve(listener)
return
}
@ -338,7 +348,8 @@ func (engine *Engine) RunFd(fd int) (err error) {
return
}
defer listener.Close()
err = http.Serve(listener, engine)
engine.server.Handler = engine
err = engine.server.Serve(listener)
return
}
@ -354,6 +365,13 @@ func (engine *Engine) ServeHTTP(w http.ResponseWriter, req *http.Request) {
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.
// 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.