-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathengine.go
73 lines (60 loc) · 1.59 KB
/
engine.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
// ==================================================
// Copyright (c) 2016 tacigar. All rights reserved.
// ==================================================
package mixo
import (
"net/http"
)
// --------------------------------------------------
type methodTrees map[string]*root
type Handler func(*Context)
type Engine struct {
RouterGroup
methodTrees methodTrees
}
// --------------------------------------------------
// generate a new engine
func NewEngine() *Engine {
engine := &Engine{
RouterGroup: RouterGroup{
Handlers: []Handler{},
},
methodTrees: methodTrees{},
}
engine.RouterGroup.engine = engine
return engine
}
// start mixo application
func (engine *Engine) Run(address string) error {
err := http.ListenAndServe(address, engine)
return err
}
func (engine *Engine) ServeHTTP(w http.ResponseWriter, r *http.Request) {
context := &Context{
Request: r,
ResponseWriter: w,
engine: engine,
}
root, _ := engine.methodTrees[r.Method]
relativePath := calculateRelativePath(root.path, r.URL.Path)
handlers, params := root.getValues(relativePath)
context.URLParams = params
for _, handler := range handlers {
handler(context)
}
}
// --------------------------------------------------
func (engine *Engine) addRoute(methodName, relativePath string, handlers []Handler) error {
r, ok := engine.methodTrees[methodName]
if !ok {
// if there is not method tree's root, create it.
r = &root{
path: "/",
handlers: []Handler{},
children: []*node{},
}
engine.methodTrees[methodName] = r
}
r.addRoute(relativePath, handlers)
return nil
}