package router import ( "log" "net/http" "strings" "videoweb/app/appg" "videoweb/app/middleware/auth" "videoweb/app/middleware/cors" "videoweb/app/middleware/ipblacklist" "videoweb/app/middleware/ipstat" "videoweb/app/middleware/reptilerecord" "videoweb/app/service/displaycount" "videoweb/pub/common" "videoweb/pub/common/enum/consts" "videoweb/pub/common/useragent" "github.com/DeanThompson/ginpprof" "github.com/gin-gonic/gin" swaggerFiles "github.com/swaggo/files" ginSwagger "github.com/swaggo/gin-swagger" _ "videoweb/app/docs" ) func Init() (engine *gin.Engine) { // 设置启动模式 switch appg.Conf.RunMod { case "dev": gin.SetMode(gin.DebugMode) case "test": gin.SetMode(gin.TestMode) case "prod": gin.SetMode(gin.ReleaseMode) default: gin.SetMode(gin.DebugMode) } // 初始化gin引擎 engine = gin.Default() engine.HandleMethodNotAllowed = true engine.MaxMultipartMemory = 60 << 20 // 从配置文件读取可信代理列表(字符串,多个 IP 用逗号分隔) // 配置了则只信任这些 IP 的 X-Forwarded-For,未配置则不信任任何代理(直接用 TCP 连接 IP) // 配置示例(app.yaml) // trustedProxies: "10.0.0.1" // trustedProxies: "10.0.0.1,10.0.0.2" if appg.Conf.TrustedProxies != "" { proxies := strings.Split(appg.Conf.TrustedProxies, ",") for i, p := range proxies { proxies[i] = strings.TrimSpace(p) } _ = engine.SetTrustedProxies(proxies) log.Printf("SetTrustedProxies: %v", proxies) } else { _ = engine.SetTrustedProxies([]string{}) log.Printf("SetTrustedProxies: none (direct TCP IP mode)") } common.InitGinSecret(appg.Conf.ResKey, consts.RunMod(appg.Conf.RunMod)) common.SetResponseDataTransform(displaycount.Transform) // 注册中间件 registeMiddleware(engine) // 注册路由 registeRouter(engine) if appg.Conf.RunMod != "prod" { setGinSwagger(engine) } // 是否开启监控服务 if appg.Conf.Pprof { ginpprof.Wrap(engine) } return } func registeMiddleware(engine *gin.Engine) { engine.Use( // gin.Recovery(), cors.Cors(&cors.Options{ Origin: nil, // "*" Methods: []string{http.MethodGet, http.MethodPost, http.MethodPut, http.MethodHead, http.MethodDelete}, AllowedHeaders: []string{"Content-Length", "Content-Type", "Authorization", "X-User-Agent", "device", "api_version", "x-api-key", useragent.SDKCommonHeader}, ExposedHeaders: []string{"Content-Disposition", "Refresh-Authorization"}, OptionsSuccessStatus: http.StatusOK, }), // 必须是此顺序, happens before原则 //monitor.Check, ipblacklist.IpBlackListMiddleware, reptilerecord.ReptileRecord, ipstat.IpStatMiddleware, useragent.UserAgent, auth.Auth, // calllimit.Check, // visit.Visit, ) } // 注册路由 func registeRouter(r *gin.Engine) { homeRouter(r) videoRouter(r) commentRouter(r) searchRouter(r) dhRouter(r) lawAndTrustRouter(r) actressRouter(r) configRouter(r) navigationRouter(r) playletRouter(r) authRouter(r) uploadRouter(r) questionnaireRouter(r) appInfoRouter(r) healthRouter(r) richTextRouter(r) } // 设置swag 接口信息 func setGinSwagger(router *gin.Engine) { // 使用相对路径,无需依赖 Host 配置,本地/测试环境均可直接访问 url := ginSwagger.URL("/swagger/doc.json") router.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler, url)) }