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  }