|
- package http
-
- import (
- "context"
- "fmt"
- "net/http"
- "os"
- "strings"
- "time"
-
- "github.com/gin-contrib/static"
- "github.com/gin-gonic/gin"
-
- "github.com/didi/nightingale/v4/src/common/address"
- "github.com/didi/nightingale/v4/src/common/middleware"
- "github.com/didi/nightingale/v4/src/modules/server/config"
- )
-
- var srv = &http.Server{
- ReadTimeout: 10 * time.Second,
- WriteTimeout: 10 * time.Second,
- MaxHeaderBytes: 1 << 20,
- }
-
- var skipPaths = []string{"/api/rdb/auth/login"}
-
- func Start() {
- c := config.Config
-
- loggerMid := middleware.LoggerWithConfig(middleware.LoggerConfig{SkipPaths: skipPaths})
- recoveryMid := middleware.Recovery()
-
- if strings.ToLower(c.HTTP.Mode) == "release" {
- gin.SetMode(gin.ReleaseMode)
- middleware.DisableConsoleColor()
- }
-
- r := gin.New()
- r.Use(recoveryMid)
-
- if c.HTTP.ShowLog {
- r.Use(loggerMid)
- }
-
- r.Use(static.Serve("/", static.LocalFile("./pub", false)))
-
- Config(r)
-
- initStats()
-
- srv.Addr = address.GetHTTPListen("server")
- srv.Handler = r
-
- go func() {
- fmt.Println("http.listening:", srv.Addr)
- if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
- fmt.Printf("listening %s occur error: %s\n", srv.Addr, err)
- os.Exit(3)
- }
- }()
- }
-
- // Shutdown http server
- func Shutdown() {
- ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
- defer cancel()
- if err := srv.Shutdown(ctx); err != nil {
- fmt.Println("cannot shutdown http server:", err)
- os.Exit(2)
- }
-
- // catching ctx.Done(). timeout of 5 seconds.
- select {
- case <-ctx.Done():
- fmt.Println("shutdown http server timeout of 5 seconds.")
- default:
- fmt.Println("http server stopped")
- }
- }
|