github.com/sijibomii/docker@v0.0.0-20231230191044-5cf6ca554647/api/server/middleware/user_agent.go (about) 1 package middleware 2 3 import ( 4 "net/http" 5 "strings" 6 7 "github.com/Sirupsen/logrus" 8 "github.com/docker/docker/api/server/httputils" 9 "github.com/docker/docker/pkg/version" 10 "golang.org/x/net/context" 11 ) 12 13 // UserAgentMiddleware is a middleware that 14 // validates the client user-agent. 15 type UserAgentMiddleware struct { 16 serverVersion version.Version 17 } 18 19 // NewUserAgentMiddleware creates a new UserAgentMiddleware 20 // with the server version. 21 func NewUserAgentMiddleware(s version.Version) UserAgentMiddleware { 22 return UserAgentMiddleware{ 23 serverVersion: s, 24 } 25 } 26 27 // WrapHandler returns a new handler function wrapping the previous one in the request chain. 28 func (u UserAgentMiddleware) WrapHandler(handler func(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error) func(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { 29 return func(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { 30 ctx = context.WithValue(ctx, httputils.UAStringKey, r.Header.Get("User-Agent")) 31 32 if strings.Contains(r.Header.Get("User-Agent"), "Docker-Client/") { 33 userAgent := strings.Split(r.Header.Get("User-Agent"), "/") 34 35 // v1.20 onwards includes the GOOS of the client after the version 36 // such as Docker/1.7.0 (linux) 37 if len(userAgent) == 2 && strings.Contains(userAgent[1], " ") { 38 userAgent[1] = strings.Split(userAgent[1], " ")[0] 39 } 40 41 if len(userAgent) == 2 && !u.serverVersion.Equal(version.Version(userAgent[1])) { 42 logrus.Debugf("Client and server don't have the same version (client: %s, server: %s)", userAgent[1], u.serverVersion) 43 } 44 } 45 return handler(ctx, w, r, vars) 46 } 47 }