package http import ( "context" "fmt" "net/http" "os" "path" "strings" "time" "github.com/gin-contrib/sessions" "github.com/gin-contrib/sessions/cookie" "github.com/gin-gonic/gin" "github.com/didi/nightingale/v5/config" "github.com/didi/nightingale/v5/pkg/iaop" ) var srv = &http.Server{ ReadTimeout: 10 * time.Second, WriteTimeout: 10 * time.Second, MaxHeaderBytes: 1 << 20, } var skipPaths = []string{ "/api/n9e/auth/login", "/api/n9e/self/password", "/api/n9e/push", "/v1/n9e/series", } func Start() { c := config.Config loggerMid := iaop.LoggerWithConfig(iaop.LoggerConfig{SkipPaths: skipPaths}) recoveryMid := iaop.Recovery() if strings.ToLower(c.HTTP.Mode) == "release" { gin.SetMode(gin.ReleaseMode) iaop.DisableConsoleColor() } r := gin.New() r.Use(recoveryMid) // whether print access log if c.HTTP.Access { r.Use(loggerMid) } // use cookie to save session store := cookie.NewStore([]byte(config.Config.HTTP.CookieSecret)) store.Options(sessions.Options{ Domain: config.Config.HTTP.CookieDomain, MaxAge: config.Config.HTTP.CookieMaxAge, Secure: config.Config.HTTP.CookieSecure, HttpOnly: config.Config.HTTP.CookieHttpOnly, Path: "/", }) session := sessions.Sessions(config.Config.HTTP.CookieName, store) r.Use(session) configRoutes(r) configNoRoute(r) srv.Addr = c.HTTP.Listen 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") } } func configNoRoute(r *gin.Engine) { r.NoRoute(func(c *gin.Context) { arr := strings.Split(c.Request.URL.Path, ".") suffix := arr[len(arr)-1] switch suffix { case "png": fallthrough case "jpeg": fallthrough case "jpg": fallthrough case "gif": fallthrough case "css": fallthrough case "js": fallthrough case "html": fallthrough case "htm": c.File(path.Join(strings.Split("pub/"+c.Request.URL.Path, "/")...)) default: c.File(path.Join("pub", "index.html")) } }) }