github.com/gogf/gf@v1.16.9/net/ghttp/internal/client/client_middleware.go (about) 1 package client 2 3 import ( 4 "net/http" 5 ) 6 7 // HandlerFunc middleware handler func 8 type HandlerFunc = func(c *Client, r *http.Request) (*Response, error) 9 10 // clientMiddleware is the plugin for http client request workflow management. 11 type clientMiddleware struct { 12 client *Client // http client. 13 handlers []HandlerFunc // mdl handlers. 14 handlerIndex int // current handler index. 15 resp *Response // save resp. 16 err error // save err. 17 } 18 19 const clientMiddlewareKey = "__clientMiddlewareKey" 20 21 // Use adds one or more middleware handlers to client. 22 func (c *Client) Use(handlers ...HandlerFunc) *Client { 23 c.middlewareHandler = append(c.middlewareHandler, handlers...) 24 return c 25 } 26 27 // Next calls next middleware. 28 // This is should only be call in HandlerFunc. 29 func (c *Client) Next(req *http.Request) (*Response, error) { 30 if v := req.Context().Value(clientMiddlewareKey); v != nil { 31 if m, ok := v.(*clientMiddleware); ok { 32 return m.Next(req) 33 } 34 } 35 return c.callRequest(req) 36 } 37 38 // Next calls next middleware handler. 39 func (m *clientMiddleware) Next(req *http.Request) (resp *Response, err error) { 40 if m.err != nil { 41 return m.resp, m.err 42 } 43 if m.handlerIndex < len(m.handlers) { 44 m.handlerIndex++ 45 m.resp, m.err = m.handlers[m.handlerIndex](m.client, req) 46 } 47 return m.resp, m.err 48 }