-
Notifications
You must be signed in to change notification settings - Fork 0
/
middleware.go
74 lines (64 loc) · 1.82 KB
/
middleware.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
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
package jsonapi
// Middleware is a wrapper for handler
type Middleware func(Handler) Handler
// Registerer represents a chain of middleware
//
// With(
// myMiddleware
// ).With(
// apitool.LogIn(apitool.JSONFormat(
// log.New(os.Stdout, "myapp", log.LstdFlags),
// )),
// ).RegisterAll(mux, "/api", myHandler)
//
// Request processing flow will be:
//
// 1. mux.ServeHTTP
// 2. myMiddleWare
// 3. Logging middleware
// 4. myHandler
// 5. Logging middleware
// 6. myMiddleWare
type Registerer interface {
Register(mux HTTPMux, apis []API)
RegisterAll(mux HTTPMux, prefix string, handlers interface{},
conv func(string) string)
With(m Middleware) Registerer
}
// With creates a new Registerer
func With(m Middleware) Registerer {
return ®isterer{
m: m,
}
}
type registerer struct {
m Middleware
parent Registerer
}
// Register is identical to jsonapi.Register(), but wraps api in middleware chain first
func (r *registerer) Register(mux HTTPMux, apis []API) {
reg := Register
if r.parent != nil {
reg = r.parent.Register
}
for x, a := range apis {
apis[x].Handler = r.m(a.Handler)
}
reg(mux, apis)
}
// RegisterAll is identical to jsonapi.RegisterAll(), but wraps api in middleware chain first
func (r *registerer) RegisterAll(
mux HTTPMux, prefix string, handlers interface{}, conv func(string) string,
) {
r.Register(mux, findMatchedMethods(prefix, handlers, conv))
}
// With creaates a new Registerer and chains after current Registerer
func (r *registerer) With(m Middleware) Registerer {
return ®isterer{
m: m,
parent: r,
}
}