You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
57 lines
1.1 KiB
57 lines
1.1 KiB
package chain |
|
|
|
import "net/http" |
|
|
|
type ( |
|
Chain interface { |
|
Append(middleware ...Middleware) Chain |
|
Prepend(middleware ...Middleware) Chain |
|
Then(http.Handler) http.Handler |
|
ThenFunc(fn http.HandlerFunc) http.Handler |
|
} |
|
Middleware func(http.Handler) http.Handler |
|
chain struct { |
|
middlewares []Middleware |
|
} |
|
) |
|
|
|
func New(middlewares ...Middleware) Chain { |
|
return chain{ |
|
middlewares: append([]Middleware(nil), middlewares...), |
|
} |
|
} |
|
|
|
func (c chain) Append(middleware ...Middleware) Chain { |
|
return chain{ |
|
middlewares: join(c.middlewares, middleware), |
|
} |
|
} |
|
|
|
func (c chain) Prepend(middleware ...Middleware) Chain { |
|
return chain{ |
|
middlewares: join(middleware, c.middlewares), |
|
} |
|
} |
|
|
|
func (c chain) Then(h http.Handler) http.Handler { |
|
if h == nil { |
|
h = http.DefaultServeMux |
|
} |
|
for i := range c.middlewares { |
|
h = c.middlewares[len(c.middlewares)-i-1](h) |
|
} |
|
return h |
|
} |
|
|
|
func (c chain) ThenFunc(fn http.HandlerFunc) http.Handler { |
|
if fn == nil { |
|
return c.Then(nil) |
|
} |
|
return c.Then(fn) |
|
} |
|
func join(a, b []Middleware) []Middleware { |
|
mids := make([]Middleware, 0, len(a)+len(b)) |
|
mids = append(mids, a...) |
|
mids = append(mids, b...) |
|
return mids |
|
}
|
|
|