forked from chanxuehong/wechat
/
msg_server_mux.go
152 lines (130 loc) · 4.24 KB
/
msg_server_mux.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
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
// @description wechat 是腾讯微信公众平台 api 的 golang 语言封装
// @link https://github.com/gogap/wechat for the canonical source repository
// @license https://github.com/gogap/wechat/blob/master/LICENSE
// @authors chanxuehong(chanxuehong@gmail.com)
package mp
import (
"net/http"
"sync"
)
var _ MessageHandler = (*MessageServeMux)(nil)
// MessageServeMux 实现了一个简单的消息路由器, 同时也是一个 MessageHandler.
type MessageServeMux struct {
rwmutex sync.RWMutex
messageHandlers map[string]MessageHandler
eventHandlers map[string]MessageHandler
defaultMessageHandler MessageHandler
defaultEventHandler MessageHandler
}
func NewMessageServeMux() *MessageServeMux {
return &MessageServeMux{
messageHandlers: make(map[string]MessageHandler),
eventHandlers: make(map[string]MessageHandler),
}
}
// 注册 MessageHandler, 处理特定类型的消息.
func (mux *MessageServeMux) MessageHandle(msgType string, handler MessageHandler) {
if msgType == "" {
panic("empty msgType")
}
if handler == nil {
panic("nil MessageHandler")
}
mux.rwmutex.Lock()
if mux.messageHandlers == nil {
mux.messageHandlers = make(map[string]MessageHandler)
}
mux.messageHandlers[msgType] = handler
mux.rwmutex.Unlock()
}
// 注册 MessageHandlerFunc, 处理特定类型的消息.
func (mux *MessageServeMux) MessageHandleFunc(msgType string, handler func(http.ResponseWriter, *Request)) {
mux.MessageHandle(msgType, MessageHandlerFunc(handler))
}
// 注册 MessageHandler, 处理未知类型的消息.
func (mux *MessageServeMux) DefaultMessageHandle(handler MessageHandler) {
if handler == nil {
panic("nil MessageHandler")
}
mux.rwmutex.Lock()
mux.defaultMessageHandler = handler
mux.rwmutex.Unlock()
}
// 注册 MessageHandlerFunc, 处理未知类型的消息.
func (mux *MessageServeMux) DefaultMessageHandleFunc(handler func(http.ResponseWriter, *Request)) {
mux.DefaultMessageHandle(MessageHandlerFunc(handler))
}
// 注册 MessageHandler, 处理特定类型的事件.
func (mux *MessageServeMux) EventHandle(eventType string, handler MessageHandler) {
if eventType == "" {
panic("empty eventType")
}
if handler == nil {
panic("nil MessageHandler")
}
mux.rwmutex.Lock()
if mux.eventHandlers == nil {
mux.eventHandlers = make(map[string]MessageHandler)
}
mux.eventHandlers[eventType] = handler
mux.rwmutex.Unlock()
}
// 注册 MessageHandlerFunc, 处理特定类型的事件.
func (mux *MessageServeMux) EventHandleFunc(eventType string, handler func(http.ResponseWriter, *Request)) {
mux.EventHandle(eventType, MessageHandlerFunc(handler))
}
// 注册 MessageHandler, 处理未知类型的事件.
func (mux *MessageServeMux) DefaultEventHandle(handler MessageHandler) {
if handler == nil {
panic("nil MessageHandler")
}
mux.rwmutex.Lock()
mux.defaultEventHandler = handler
mux.rwmutex.Unlock()
}
// 注册 MessageHandlerFunc, 处理未知类型的事件.
func (mux *MessageServeMux) DefaultEventHandleFunc(handler func(http.ResponseWriter, *Request)) {
mux.DefaultEventHandle(MessageHandlerFunc(handler))
}
// 获取 msgType 对应的 MessageHandler, 如果没有找到 nil.
func (mux *MessageServeMux) messageHandler(msgType string) (handler MessageHandler) {
if msgType == "" {
return nil
}
mux.rwmutex.RLock()
handler = mux.messageHandlers[msgType]
if handler == nil {
handler = mux.defaultMessageHandler
}
mux.rwmutex.RUnlock()
return
}
// 获取 eventType 对应的 MessageHandler, 如果没有找到 nil.
func (mux *MessageServeMux) eventHandler(eventType string) (handler MessageHandler) {
if eventType == "" {
return nil
}
mux.rwmutex.RLock()
handler = mux.eventHandlers[eventType]
if handler == nil {
handler = mux.defaultEventHandler
}
mux.rwmutex.RUnlock()
return
}
// MessageServeMux 实现了 MessageHandler 接口.
func (mux *MessageServeMux) ServeMessage(w http.ResponseWriter, r *Request) {
if MsgType := r.MixedMsg.MsgType; MsgType == "event" {
handler := mux.eventHandler(r.MixedMsg.Event)
if handler == nil {
return // 返回空串, 符合微信协议
}
handler.ServeMessage(w, r)
} else {
handler := mux.messageHandler(MsgType)
if handler == nil {
return // 返回空串, 符合微信协议
}
handler.ServeMessage(w, r)
}
}