gclient_middleware.go 1.4 KB

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