-
Notifications
You must be signed in to change notification settings - Fork 2
/
router_event.go
136 lines (112 loc) · 4.33 KB
/
router_event.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
131
132
133
134
135
136
// Copyright 2020 GoFast Author(http://chende.ren). All rights reserved.
// Use of this source code is governed by a MIT license
package fst
// Note:该设计给将来预留了足够的扩展空间
// 请求生命周期,设计了不同点的事件类型,这样可以自由 加入 hook
const (
EAfterMatch = "onAfterMatch" // 初步匹配路由之后,调用这个做更进一步的自定义Check检查
EBefore = "onBefore"
EAfter = "onAfter"
EBeforeSend = "onBeforeSend"
EAfterSend = "onAfterSend"
)
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// 所有注册的 Context handlers 都要通过此函数来注册
// 包括 RouteGroup 和 RouteItem
func (re *routeEvents) regCtxHandler(fstMem *fstMemSpace, eType string, hds []CtxHandler) (*routeEvents, uint16) {
if len(hds) == 0 || hds[0] == nil {
return re, 0
}
// 如果 hds 里面的有为 nil 的函数,丢弃掉
tHds := make([]CtxHandler, 0, len(hds))
for _, h := range hds {
if h != nil {
tHds = append(tHds, h)
}
}
switch eType {
case EAfterMatch:
re.eAfterMatchHds = append(re.eAfterMatchHds, addCtxHandlers(fstMem, tHds)...)
case EBefore:
re.eBeforeHds = append(re.eBeforeHds, addCtxHandlers(fstMem, tHds)...)
case EAfter:
re.eAfterHds = append(re.eAfterHds, addCtxHandlers(fstMem, tHds)...)
case EBeforeSend:
re.eBeforeSendHds = append(re.eBeforeSendHds, addCtxHandlers(fstMem, tHds)...)
case EAfterSend:
re.eAfterSendHds = append(re.eAfterSendHds, addCtxHandlers(fstMem, tHds)...)
default:
panic("Event type error, can't find this type.")
}
return re, uint16(len(tHds))
}
// SpecialRouteGroup
func (gft *GoFast) SpecialBefore(hds ...CtxHandler) {
gft.specialGroup.Before(hds...)
}
func (gft *GoFast) SpecialAfter(hds ...CtxHandler) {
gft.specialGroup.After(hds...)
}
// RouteGroup
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
func (gp *RouteGroup) regGroupCtxHandler(eType string, hds []CtxHandler) *RouteGroup {
_, ct := gp.regCtxHandler(gp.myApp.fstMem, eType, hds)
gp.selfHdsLen += ct // 记录分组中一共加入的 各种处理 函数个数
return gp
}
func (gp *RouteGroup) Before(hds ...CtxHandler) *RouteGroup {
return gp.regGroupCtxHandler(EBefore, hds)
}
func (gp *RouteGroup) B(hds ...CtxHandler) *RouteGroup {
return gp.regGroupCtxHandler(EBefore, hds)
}
func (gp *RouteGroup) After(hds ...CtxHandler) *RouteGroup {
return gp.regGroupCtxHandler(EAfter, hds)
}
func (gp *RouteGroup) A(hds ...CtxHandler) *RouteGroup {
return gp.regGroupCtxHandler(EAfter, hds)
}
func (gp *RouteGroup) BeforeSend(hds ...CtxHandler) *RouteGroup {
return gp.regGroupCtxHandler(EBeforeSend, hds)
}
func (gp *RouteGroup) AfterSend(hds ...CtxHandler) *RouteGroup {
return gp.regGroupCtxHandler(EAfterSend, hds)
}
func (gp *RouteGroup) AfterMatch(hds ...CtxHandler) *RouteGroup {
return gp.regGroupCtxHandler(EAfterMatch, hds)
}
// RouteItem
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
func (ri *RouteItem) regItemCtxHandler(eType string, hds []CtxHandler) *RouteItem {
ri.regCtxHandler(ri.group.myApp.fstMem, eType, hds)
return ri
}
// 注册节点的所有事件
func (ri *RouteItem) Before(hds ...CtxHandler) *RouteItem {
return ri.regItemCtxHandler(EBefore, hds)
}
func (ri *RouteItem) B(hds ...CtxHandler) *RouteItem {
return ri.regItemCtxHandler(EBefore, hds)
}
func (ri *RouteItem) After(hds ...CtxHandler) *RouteItem {
return ri.regItemCtxHandler(EAfter, hds)
}
func (ri *RouteItem) A(hds ...CtxHandler) *RouteItem {
return ri.regItemCtxHandler(EAfter, hds)
}
func (ri *RouteItem) BeforeSend(hds ...CtxHandler) *RouteItem {
return ri.regItemCtxHandler(EBeforeSend, hds)
}
func (ri *RouteItem) AfterSend(hds ...CtxHandler) *RouteItem {
return ri.regItemCtxHandler(EAfterSend, hds)
}
// 路由匹配到之后,没等执行中间件就走这个逻辑,可以返回标记,中断后面的中间件
func (ri *RouteItem) AfterMatch(hds ...CtxHandler) *RouteItem {
return ri.regItemCtxHandler(EAfterMatch, hds)
}
// RouteItemAttrs
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
func (ri *RouteItem) Attrs(ra RouteAttrs) *RouteItem {
ra.SetRouteIndex(ri.routeIdx)
return ri
}