From 7aaecdbc52e952fa1291eec4d43ca46e4b092e2f Mon Sep 17 00:00:00 2001 From: yyoshiki41 Date: Wed, 3 Feb 2016 10:21:47 +0900 Subject: [PATCH] Add RunFd --- gin.go | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/gin.go b/gin.go index 60f4ab29..7269c8a2 100644 --- a/gin.go +++ b/gin.go @@ -5,6 +5,7 @@ package gin import ( + "fmt" "html/template" "net" "net/http" @@ -255,6 +256,23 @@ func (engine *Engine) RunUnix(file string) (err error) { return } +// RunFd attaches the router to a http.Server and starts listening and serving HTTP requests +// through the specified file descriptor. +// Note: this method will block the calling goroutine indefinitely unless an error happens. +func (engine *Engine) RunFd(fd int) (err error) { + debugPrint("Listening and serving HTTP on fd@%d", fd) + defer func() { debugPrintError(err) }() + + f := os.NewFile(uintptr(fd), fmt.Sprintf("fd@%d", fd)) + listener, err := net.FileListener(f) + if err != nil { + return + } + defer listener.Close() + err = http.Serve(listener, engine) + return +} + // Conforms to the http.Handler interface. func (engine *Engine) ServeHTTP(w http.ResponseWriter, req *http.Request) { c := engine.pool.Get().(*Context)