/
router.go
125 lines (113 loc) · 3.16 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
package haruka
import (
"github.com/gorilla/mux"
"net/http"
)
type RouterMapping struct {
Pattern string
HandlerFunc RequestHandler
}
type Router struct {
Handlers []RouterMapping
HandlerRouter *mux.Router
Middleware []Middleware
}
func NewRouter() *Router {
muxRouter := mux.NewRouter()
return &Router{
HandlerRouter: muxRouter,
Handlers: []RouterMapping{},
}
}
func (r *Router) MakeHandlerContext(writer http.ResponseWriter, request *http.Request, pattern string) *Context {
ctx := createContext(writer, request)
ctx.Pattern = pattern
r.execMiddleware(ctx)
if ctx.isAbort {
return nil
}
return ctx
}
func (r *Router) AddHandler(pattern string, handler RequestHandler) {
r.HandlerRouter.HandleFunc(pattern, func(writer http.ResponseWriter, request *http.Request) {
ctx := r.MakeHandlerContext(writer, request, pattern)
if ctx == nil {
return
}
handler(ctx)
})
}
func (r *Router) GET(pattern string, handler RequestHandler) {
r.HandlerRouter.HandleFunc(pattern, func(writer http.ResponseWriter, request *http.Request) {
ctx := r.MakeHandlerContext(writer, request, pattern)
if ctx == nil {
return
}
handler(ctx)
}).Methods("GET")
}
func (r *Router) POST(pattern string, handler RequestHandler) {
r.HandlerRouter.HandleFunc(pattern, func(writer http.ResponseWriter, request *http.Request) {
ctx := r.MakeHandlerContext(writer, request, pattern)
if ctx == nil {
return
}
handler(ctx)
}).Methods("POST")
}
func (r *Router) PUT(pattern string, handler RequestHandler) {
r.HandlerRouter.HandleFunc(pattern, func(writer http.ResponseWriter, request *http.Request) {
ctx := r.MakeHandlerContext(writer, request, pattern)
if ctx == nil {
return
}
handler(ctx)
}).Methods("PUT")
}
func (r *Router) PATCH(pattern string, handler RequestHandler) {
r.HandlerRouter.HandleFunc(pattern, func(writer http.ResponseWriter, request *http.Request) {
ctx := r.MakeHandlerContext(writer, request, pattern)
if ctx == nil {
return
}
handler(ctx)
}).Methods("PATCH")
}
func (r *Router) DELETE(pattern string, handler RequestHandler) {
r.HandlerRouter.HandleFunc(pattern, func(writer http.ResponseWriter, request *http.Request) {
ctx := r.MakeHandlerContext(writer, request, pattern)
if ctx == nil {
return
}
handler(ctx)
}).Methods("DELETE")
}
func (r *Router) Static(pattern string, staticPath string) {
r.HandlerRouter.PathPrefix(pattern).Handler(http.StripPrefix(pattern, http.FileServer(http.Dir(staticPath))))
}
func (r *Router) METHODS(pattern string, methods []string, handler RequestHandler) {
r.HandlerRouter.HandleFunc(pattern, func(writer http.ResponseWriter, request *http.Request) {
ctx := r.MakeHandlerContext(writer, request, pattern)
if ctx == nil {
return
}
handler(ctx)
}).Methods(methods...)
}
func createContext(writer http.ResponseWriter, request *http.Request) *Context {
return &Context{
Writer: writer,
Request: request,
Parameters: mux.Vars(request),
Param: map[string]interface{}{},
isAbort: false,
}
}
func (r *Router) execMiddleware(ctx *Context) {
for _, middleware := range r.Middleware {
middleware.OnRequest(ctx)
if ctx.isAbort {
return
}
}
}