104
// SetVersionsForTests sets headers as they would be received from the client.
105
// Must be used in tests only.
106
>
func SetVersionsForTests(ctx context.Context, clientVersion, clientName, supportedServerVersions, supportedFeatures string) context.Context {
version_checker.go
107
>
return metadata.NewIncomingContext(ctx, metadata.New(map[string]string{
108
>
ClientNameHeaderName: clientName,
109
>
ClientVersionHeaderName: clientVersion,
110
>
SupportedServerVersionsHeaderName: supportedServerVersions,
111
>
SupportedFeaturesHeaderName: supportedFeatures,
112
>
}))
113
>
}
114
115
// ClientSupported returns an error if client is unsupported, nil otherwise.
116
>
func (vc *versionChecker) ClientSupported(ctx context.Context) error {
version_checker.go
117
>
118
>
headers := GetValues(ctx, ClientNameHeaderName, ClientVersionHeaderName, SupportedServerVersionsHeaderName)
119
>
clientName := headers[0]
120
>
clientVersion := headers[1]
121
>
supportedServerVersions := headers[2]
122
>
123
>
// Validate client version only if it is provided and server knows about this client.
124
>
if clientName != "" && clientVersion != "" {
125
>
if supportedClientRange, ok := vc.supportedClientsRange[clientName]; ok {
version_checker.go
126
>
clientVersionParsed, parseErr := semver.Parse(clientVersion)
127
>
if parseErr != nil {
128
>
return serviceerror.NewInvalidArgumentf("Unable to parse client version: %v", parseErr)
version_checker.go
129
>
}
131
>
return serviceerror.NewClientVersionNotSupported(clientVersion, clientName, vc.supportedClients[clientName])
version_checker.go
132
>
}
133
}
134
}
135
136
// Validate supported server version if it is provided.
138
>
supportedServerVersionsParsed, parseErr := semver.ParseRange(supportedServerVersions)
version_checker.go
139
>
if parseErr != nil {
140
return serviceerror.NewInvalidArgumentf("Unable to parse supported server versions: %v", parseErr)
141
}
143
>
return serviceerror.NewServerVersionNotSupported(vc.serverVersion.String(), supportedServerVersions)
version_checker.go
144
>
}
145
}
146
148
}
149
150
// ClientSupportsFeature returns true if the client reports support for the
151
// given feature (which should be one of the Feature... constants above).
152
>
func (vc *versionChecker) ClientSupportsFeature(ctx context.Context, feature string) bool {
version_checker.go
153
>
headers := GetValues(ctx, SupportedFeaturesHeaderName)
154
>
if len(headers) == 0 {
155
return false
156
}
157
>
for clientFeature := range strings.SplitSeq(headers[0], SupportedFeaturesHeaderDelim) {
version_checker.go
158
>
if clientFeature == feature {
160
>
}
161
}
163
}
164
165
>
func mustParseRanges(ranges map[string]string) map[string]semver.Range {
version_checker.go
166
>
out := make(map[string]semver.Range, len(ranges))
167
>
for c, r := range ranges {
168
>
out[c] = semver.MustParseRange(r)
169
>
}
170
>
return out
171
}