-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathrouter.go
62 lines (56 loc) · 1.41 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
package express
import (
"net/http"
)
func NewRouter() router {
return router{}
}
func (r *router) AddModule(mde *Module) {
*r = append(*r, mde)
}
func (r router) TopFilter(name string) {
if _, ok := globalFilters[name]; ok {
topFilters = append(topFilters, name)
} else {
panic("No such filter: " + name)
}
}
func (r router) ServeHTTP(w http.ResponseWriter, req *http.Request) {
defer func() {
if err := recover(); err != nil {
if debugMode == false {
res := NewResponse(w)
res.Locals["panic"] = err
newChannel("500_page", handle500, topFilters).Handle(res, NewRequest(req))
} else {
panic(err)
}
}
}()
match := false
for _, mde := range r {
for _, re := range mde.routes {
if re.matcher.MatchString(req.URL.Path) {
match = true
if re.method == req.Method {
request := NewRequest(req)
tmp := re.matcher.FindAllStringSubmatch(req.URL.Path, -1)
for x, v := range re.keys {
request.PathParam[v] = tmp[0][x+1]
}
newChannel(re.tag, re.handler, mde.filters).Handle(NewResponse(w), request)
return
}
}
}
}
if match {
newChannel("405_page", handle405, topFilters).Handle(NewResponse(w), NewRequest(req))
} else {
newChannel("404_page", handle404, topFilters).Handle(NewResponse(w), NewRequest(req))
}
}
func (r router) ListenAndServe(addr string) error {
server := &http.Server{Addr: addr, Handler: r}
return server.ListenAndServe()
}