标签:http middleware constructors allowedHost Golang handler func Handler
本文介绍golang标准库HTTP middleware的写法。
目录1. http.Handler
与http.HandlerFunc
http.Handler
type Handler interface {
ServeHTTP(ResponseWriter, *Request)
}
http.HandlerFunc
type HandlerFunc func(ResponseWriter, *Request)
// ServeHTTP calls f(w, r).
func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request) {
f(w, r)
}
1.1 结构体 实现 http.Handler
type SingleHost struct {
handler http.Handler
allowedHost string
}
func (s *SingleHost) ServeHTTP(w http.ResponseWriter, r *http.Request) {
host := r.Host
if host == s.allowedHost {
s.handler.ServeHTTP(w, r)
} else {
w.WriteHeader(403)
}
}
// handler := SingleHost{handler, allowedHost}
1.2 高阶函数
func SingleHost(handler http.Handler, allowedHost string) http.Handler {
ourFunc := func(w http.ResponseWriter, r *http.Request) {
host := r.Host
if host == allowedHost {
handler.ServeHTTP(w, r)
} else {
w.WriteHeader(403)
}
}
return http.HandlerFunc(ourFunc)
}
// handler := SingleHost(handler, allowedHost)
2. github.com/justinas/alice:
将
Middleware1(Middleware2(Middleware3(App)))
变为
alice.New(Middleware1, Middleware2, Middleware3).Then(App)
type Constructor func(http.Handler) http.Handler
type Chain struct {
constructors []Constructor
}
func New(constructors ...Constructor) Chain {
return Chain{append(([]Constructor)(nil), constructors...)}
}
func (c Chain) Then(h http.Handler) http.Handler {
for i := range c.constructors {
h = c.constructors[len(c.constructors)-1-i](h)
}
return h
}
参考: https://justinas.org/writing-http-middleware-in-go#usecases
标签:http,middleware,constructors,allowedHost,Golang,handler,func,Handler 来源: https://www.cnblogs.com/elimsc/p/15880310.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。