1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 |
- package auth
- import (
- "net/http"
- "strings"
- )
- // APIVersion represents a version of an API including its
- // type and version number.
- type APIVersion struct {
- // Type refers to the name of a specific API specification
- // such as "registry"
- Type string
- // Version is the version of the API specification implemented,
- // This may omit the revision number and only include
- // the major and minor version, such as "2.0"
- Version string
- }
- // String returns the string formatted API Version
- func (v APIVersion) String() string {
- return v.Type + "/" + v.Version
- }
- // APIVersions gets the API versions out of an HTTP response using the provided
- // version header as the key for the HTTP header.
- func APIVersions(resp *http.Response, versionHeader string) []APIVersion {
- versions := []APIVersion{}
- if versionHeader != "" {
- for _, supportedVersions := range resp.Header[http.CanonicalHeaderKey(versionHeader)] {
- for _, version := range strings.Fields(supportedVersions) {
- versions = append(versions, ParseAPIVersion(version))
- }
- }
- }
- return versions
- }
- // ParseAPIVersion parses an API version string into an APIVersion
- // Format (Expected, not enforced):
- // API version string = <API type> '/' <API version>
- // API type = [a-z][a-z0-9]*
- // API version = [0-9]+(\.[0-9]+)?
- // TODO(dmcgowan): Enforce format, add error condition, remove unknown type
- func ParseAPIVersion(versionStr string) APIVersion {
- idx := strings.IndexRune(versionStr, '/')
- if idx == -1 {
- return APIVersion{
- Type: "unknown",
- Version: versionStr,
- }
- }
- return APIVersion{
- Type: strings.ToLower(versionStr[:idx]),
- Version: versionStr[idx+1:],
- }
- }
|