github.com/rentongzhang/docker@v1.8.2-rc1/pkg/useragent/useragent.go (about) 1 // Package useragent provides helper functions to pack 2 // version information into a single User-Agent header. 3 package useragent 4 5 import ( 6 "errors" 7 "strings" 8 ) 9 10 var ( 11 ErrNilRequest = errors.New("request cannot be nil") 12 ) 13 14 // VersionInfo is used to model UserAgent versions. 15 type VersionInfo struct { 16 Name string 17 Version string 18 } 19 20 func (vi *VersionInfo) isValid() bool { 21 const stopChars = " \t\r\n/" 22 name := vi.Name 23 vers := vi.Version 24 if len(name) == 0 || strings.ContainsAny(name, stopChars) { 25 return false 26 } 27 if len(vers) == 0 || strings.ContainsAny(vers, stopChars) { 28 return false 29 } 30 return true 31 } 32 33 // Convert versions to a string and append the string to the string base. 34 // 35 // Each VersionInfo will be converted to a string in the format of 36 // "product/version", where the "product" is get from the name field, while 37 // version is get from the version field. Several pieces of verson information 38 // will be concatinated and separated by space. 39 // 40 // Example: 41 // AppendVersions("base", VersionInfo{"foo", "1.0"}, VersionInfo{"bar", "2.0"}) 42 // results in "base foo/1.0 bar/2.0". 43 func AppendVersions(base string, versions ...VersionInfo) string { 44 if len(versions) == 0 { 45 return base 46 } 47 48 verstrs := make([]string, 0, 1+len(versions)) 49 if len(base) > 0 { 50 verstrs = append(verstrs, base) 51 } 52 53 for _, v := range versions { 54 if !v.isValid() { 55 continue 56 } 57 verstrs = append(verstrs, v.Name+"/"+v.Version) 58 } 59 return strings.Join(verstrs, " ") 60 }