-
Notifications
You must be signed in to change notification settings - Fork 0
/
server.go
111 lines (94 loc) · 2.28 KB
/
server.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
package ginx
import (
"fmt"
"io"
"net/http"
"os"
"path/filepath"
"github.com/gin-contrib/cors"
"github.com/gin-contrib/pprof"
"github.com/gin-contrib/requestid"
"github.com/gin-gonic/gin"
"github.com/penglongli/gin-metrics/ginmetrics"
"github.com/redis/go-redis/v9"
"github.com/virzz/vlog"
"github.com/virzz/ginx/apikey"
)
var engine = gin.New()
func R() *gin.Engine { return engine }
func New(prefix ...string) (*http.Server, error) {
if Conf == nil {
return nil, fmt.Errorf("HTTP Config is nil")
}
f, _ := os.Create(filepath.Join("logs", "gin.log"))
if Conf.Debug {
gin.SetMode(gin.DebugMode)
gin.DefaultWriter = io.MultiWriter(f, os.Stdout)
gin.DefaultErrorWriter = io.MultiWriter(f, os.Stderr)
engine.Use(gin.Logger())
} else {
gin.SetMode(gin.ReleaseMode)
gin.DefaultWriter = f
gin.DefaultErrorWriter = f
}
engine.Use(gin.Recovery())
if Conf.Metrics {
m := ginmetrics.GetMonitor()
m.SetMetricPath("/metrics")
m.SetSlowTime(10)
m.SetDuration([]float64{0.1, 0.3, 1.2, 5, 10})
m.Use(engine)
}
if Conf.Pprof {
pprof.Register(engine)
}
if Conf.RequestID {
engine.Use(requestid.New())
}
// CORS
c := cors.DefaultConfig()
c.AddAllowHeaders(Conf.Headers...)
if len(Conf.Origins) > 0 {
c.AllowAllOrigins = false
c.AllowOrigins = Conf.Origins
} else {
c.AllowAllOrigins = true
}
engine.Use(cors.New(c))
// Session
if Conf.Store.Addr != "" {
client := redis.NewClient(&redis.Options{
Addr: fmt.Sprintf("%s:%d", Conf.Store.Addr, Conf.Store.Port),
DB: Conf.Store.DB,
Password: Conf.Store.Pass,
})
store, err := apikey.NewRedisStore(apikey.WithClient(client))
if err != nil {
panic(err)
}
engine.Use(apikey.Init(store))
}
// Register Before Middleware
if len(mwBefore) > 0 {
engine.Use(mwBefore...)
}
// Register Router
var api *gin.RouterGroup
if len(prefix) > 0 {
api = engine.Group(prefix[0])
} else {
api = engine.Group("/")
}
api.POST("/api/errcode", CodesHandler)
api.POST("/api/captcha", CaptchaHandler)
for _, register := range Routers {
register(api)
}
// Register After Middleware
if len(mwAfter) > 0 {
engine.Use(mwAfter...)
}
addr := fmt.Sprintf("%s:%d", Conf.Addr, Conf.Port)
vlog.Info("HTTP Server Listening on : " + addr)
return &http.Server{Addr: addr, Handler: engine}, nil
}