forked from sebest/cji
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcji.go
82 lines (72 loc) · 2.07 KB
/
cji.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
package cji
import (
"fmt"
"net/http"
"github.com/zenazn/goji/web"
)
type Cji struct {
middlewares []interface{}
}
func Use(middlewares ...interface{}) *Cji {
return (&Cji{}).Use(middlewares...)
}
func (z *Cji) Use(middlewares ...interface{}) *Cji {
c := &Cji{z.middlewares}
for _, mw := range middlewares {
switch t := mw.(type) {
default:
panic(fmt.Sprintf("unsupported middleware type: %T", t))
case func(http.Handler) http.Handler:
case func(*web.C, http.Handler) http.Handler:
}
c.middlewares = append(c.middlewares, mw)
}
return c
}
// Compose together the middleware chain and wrap the handler with it
func (z *Cji) On(handler interface{}) web.HandlerFunc {
var hfn web.HandlerFunc
switch t := handler.(type) {
case web.Handler:
hfn = t.ServeHTTPC
case func(web.C, http.ResponseWriter, *http.Request): // web.HandlerFunc
hfn = t
case func(http.ResponseWriter, *http.Request): // http.HandlerFunc
hfn = func(c web.C, w http.ResponseWriter, r *http.Request) {
t(w, r)
}
default:
panic(fmt.Sprintf("unsupported handler type: %T", t))
}
if len(z.middlewares) == 0 {
return hfn
}
m := wrap(z.middlewares[len(z.middlewares)-1])(hfn)
for i := len(z.middlewares) - 2; i >= 0; i-- {
f := wrap(z.middlewares[i])
m = f(m)
}
return m
}
// Wrap takes a middleware that works on http.Handler and returns a function that
// takes a web.HandlerFunc and returns a web.HandlerFunc. We use this to wrap HandlerFuncs
func wrap(middleware interface{}) func(web.HandlerFunc) web.HandlerFunc {
fn := func(hf web.HandlerFunc) web.HandlerFunc {
return func(c web.C, w http.ResponseWriter, r *http.Request) {
newFn := func(ww http.ResponseWriter, rr *http.Request) {
hf(c, ww, rr)
}
var fn http.HandlerFunc
switch mw := middleware.(type) {
default:
panic(fmt.Sprintf("unsupported middleware type: %T", mw))
case func(http.Handler) http.Handler:
fn = mw(http.HandlerFunc(newFn)).(http.HandlerFunc)
case func(*web.C, http.Handler) http.Handler:
fn = mw(&c, http.HandlerFunc(newFn)).(http.HandlerFunc)
}
fn(w, r)
}
}
return fn
}