package middleware import "net/http" // DefaultHeaders returns a middleware that adds the given headers to every // outgoing request. Existing headers on the request are not overwritten. func DefaultHeaders(headers http.Header) Middleware { return func(next http.RoundTripper) http.RoundTripper { return RoundTripperFunc(func(req *http.Request) (*http.Response, error) { // Clone lazily on the first header we actually add, so that // RoundTrippers never mutate the caller's request. cloned := false for key, values := range headers { if req.Header.Get(key) != "" { continue } if !cloned { req = req.Clone(req.Context()) cloned = true } for _, v := range values { req.Header.Add(key, v) } } return next.RoundTrip(req) }) } } // UserAgent returns a middleware that sets the User-Agent header on every // outgoing request, unless one is already present. func UserAgent(ua string) Middleware { return DefaultHeaders(http.Header{ "User-Agent": {ua}, }) }