github.com/demonoid81/moby@v0.0.0-20200517203328-62dd8e17c460/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 // import "github.com/demonoid81/moby/pkg/useragent"
     4  
     5  import (
     6  	"strings"
     7  )
     8  
     9  // VersionInfo is used to model UserAgent versions.
    10  type VersionInfo struct {
    11  	Name    string
    12  	Version string
    13  }
    14  
    15  func (vi *VersionInfo) isValid() bool {
    16  	const stopChars = " \t\r\n/"
    17  	name := vi.Name
    18  	vers := vi.Version
    19  	if len(name) == 0 || strings.ContainsAny(name, stopChars) {
    20  		return false
    21  	}
    22  	if len(vers) == 0 || strings.ContainsAny(vers, stopChars) {
    23  		return false
    24  	}
    25  	return true
    26  }
    27  
    28  // AppendVersions converts versions to a string and appends the string to the string base.
    29  //
    30  // Each VersionInfo will be converted to a string in the format of
    31  // "product/version", where the "product" is get from the name field, while
    32  // version is get from the version field. Several pieces of version information
    33  // will be concatenated and separated by space.
    34  //
    35  // Example:
    36  // AppendVersions("base", VersionInfo{"foo", "1.0"}, VersionInfo{"bar", "2.0"})
    37  // results in "base foo/1.0 bar/2.0".
    38  func AppendVersions(base string, versions ...VersionInfo) string {
    39  	if len(versions) == 0 {
    40  		return base
    41  	}
    42  
    43  	verstrs := make([]string, 0, 1+len(versions))
    44  	if len(base) > 0 {
    45  		verstrs = append(verstrs, base)
    46  	}
    47  
    48  	for _, v := range versions {
    49  		if !v.isValid() {
    50  			continue
    51  		}
    52  		verstrs = append(verstrs, v.Name+"/"+v.Version)
    53  	}
    54  	return strings.Join(verstrs, " ")
    55  }