-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathrouter.go
130 lines (118 loc) · 3.01 KB
/
router.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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
package td
import (
"net/http"
"path"
"strings"
"github.com/swxctx/gutil"
"github.com/swxctx/xlog"
"github.com/swxctx/malatd/httprouter"
)
// Router
type Router struct {
Plugins Plugins
basePath string
server *Server
root bool
}
// 注册组路由
func (r *Router) Group(relativePath string, plugins ...Plugin) *Router {
gPlugins := append(r.Plugins, plugins...)
return &Router{
Plugins: gPlugins,
basePath: getReqPath(r.basePath, relativePath),
server: r.server,
root: false,
}
}
// AddPlugin
func (r *Router) AddPlugin(plugins ...Plugin) {
r.Plugins = append(r.Plugins, plugins...)
}
// Get
func (r *Router) Get(relativePath string, plugins ...Plugin) {
path := getReqPath(r.basePath, relativePath)
plugin := append(r.Plugins, plugins...)
xlog.Infof("[ROUTE]: GET %s", path)
r.handle("GET", path, plugin)
}
// Post
func (r *Router) Post(relativePath string, plugins ...Plugin) {
path := getReqPath(r.basePath, relativePath)
plugin := append(r.Plugins, plugins...)
xlog.Infof("[ROUTE]: POST %s", path)
r.handle("POST", path, plugin)
}
// Options
func (r *Router) Options(relativePath string, plugins ...Plugin) {
path := getReqPath(r.basePath, relativePath)
plugin := append(r.Plugins, plugins...)
xlog.Infof("[ROUTE]: OPTIONS %s", path)
r.handle("OPTIONS", path, plugin)
}
// handle
func (r *Router) handle(httpMethod, relativePath string, plugins Plugins) {
switch httpMethod {
case "GET":
r.server.router.GET(relativePath, func(response http.ResponseWriter, request *http.Request, params httprouter.Params) {
ctx := Context{
index: 0,
server: r.server,
plugins: plugins,
}
defer func() {
if re := recover(); re != nil {
xlog.Errorf("[GET] err: %v", re)
ctx.Render(RerrInternalServer)
}
}()
ctx.Request = request
ctx.ResponseWriter = response
ctx.Next()
})
case "POST":
r.server.router.POST(relativePath, func(response http.ResponseWriter, request *http.Request, params httprouter.Params) {
ctx := Context{
index: 0,
server: r.server,
plugins: plugins,
}
defer func() {
if re := recover(); re != nil {
xlog.Errorf("[POST] err: %v", re)
ctx.Render(RerrInternalServer)
}
}()
ctx.Request = request
ctx.ResponseWriter = response
ctx.Next()
})
case "OPTIONS":
r.server.router.OPTIONS(relativePath, func(response http.ResponseWriter, request *http.Request, params httprouter.Params) {
ctx := Context{
index: 0,
server: r.server,
plugins: plugins,
}
defer func() {
if re := recover(); re != nil {
xlog.Errorf("[POST] err: %v", re)
ctx.Render(RerrInternalServer)
}
}()
ctx.Request = request
ctx.ResponseWriter = response
ctx.Next()
})
}
}
// ToUriPath maps struct(func) name to URI path.
func ToUriPath(name string) string {
p := strings.Replace(name, "__", ".", -1)
a := strings.Split(p, "_")
for k, v := range a {
a[k] = gutil.FieldSnakeString(v)
}
p = path.Join(a...)
p = path.Join("/", p)
return strings.Replace(p, ".", "_", -1)
}