-
Notifications
You must be signed in to change notification settings - Fork 0
/
serve.go
98 lines (86 loc) · 1.68 KB
/
serve.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
package raapchik
import (
"context"
"net/http"
)
func (h *Raapchik) findHandler(
segs []PathSegment, routes []RaapchikRoute,
) *RaapchikRoute {
for _, v := range routes {
isMatch := false
if len(v.RouteSegments) == len(segs) {
isMatch = true
inner:
for j, segment := range v.RouteSegments {
outSegment := segs[j]
if !segment.IsVar {
if segment.Seg != outSegment.Seg {
isMatch = false
break inner
}
}
}
}
if isMatch {
return &v
}
}
return nil
}
func (h *Raapchik) ServeHTTP(w http.ResponseWriter, r *http.Request) {
uri := r.URL
segs := h.getPathSegmentsFromPath(uri.Path)
handled := h.internalServe(w, r, segs)
if !handled {
w.WriteHeader(http.StatusBadGateway)
w.Write([]byte("Invalid path\n"))
}
}
func (h *Raapchik) internalServe(
w http.ResponseWriter,
r *http.Request,
segs []PathSegment,
) bool {
routes := h.getRoutes
if r.Method == "PUT" {
routes = h.putRoutes
}
if r.Method == "PATCH" {
routes = h.patchRoutes
}
if r.Method == "POST" {
routes = h.postRoutes
}
if r.Method == "DELETE" {
routes = h.deleteRoutes
}
route := h.findHandler(segs, routes)
if route == nil {
for _, v := range h.children {
handled := v.internalServe(w, r, segs)
if handled {
return true
}
}
return false
}
params := make(map[string]string)
for i, v := range route.RouteSegments {
if v.IsVar {
params[v.Var] = segs[i].Seg
}
}
req := r
if len(params) != 0 {
ctx := context.WithValue(r.Context(), "params", params)
req = r.WithContext(ctx)
}
for _, middleware := range h.middlewares {
handled := middleware(w, req)
if handled {
return true
}
}
route.Handler(w, req)
return true
}