152
// decodeLink decodes the Nexus-Link header values.
153
// It must have the same format of HTTP Link header: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Link
154
>
func decodeLink(encodedLink string) (nexus.Link, error) {
api.go
155
>
var link nexus.Link
156
>
encodedLink = strings.TrimSpace(encodedLink)
157
>
if len(encodedLink) == 0 {
158
return link, errors.New("failed to parse link header: value is empty")
159
}
160
161
>
if encodedLink[0] != '<' {
api.go
162
return link, fmt.Errorf("failed to parse link header: invalid format: %s", encodedLink)
163
}
164
>
urlEnd := strings.Index(encodedLink, ">")
api.go
165
>
if urlEnd == -1 {
166
return link, fmt.Errorf("failed to parse link header: invalid format: %s", encodedLink)
167
}
168
>
urlStr := strings.TrimSpace(encodedLink[1:urlEnd])
api.go
169
>
if len(urlStr) == 0 {
170
return link, errors.New("failed to parse link header: url is empty")
171
}
172
>
u, err := url.Parse(urlStr)
api.go
173
>
if err != nil {
174
return link, fmt.Errorf("failed to parse link header: invalid url: %s", urlStr)
175
}
176
>
if err := validateLinkURL(u); err != nil {
api.go
177
return link, fmt.Errorf("failed to parse link header: %w", err)
178
}
180
>
181
>
params := strings.Split(encodedLink[urlEnd+1:], ";")
182
>
// must contain at least one semi-colon, and first param must be empty since
183
>
// it corresponds to the url part parsed above.
184
>
if len(params) < 2 {
185
>
return link, fmt.Errorf("failed to parse link header: invalid format: %s", encodedLink)
api.go
186
>
}
187
if strings.TrimSpace(params[0]) != "" {
188
return link, fmt.Errorf("failed to parse link header: invalid format: %s", encodedLink)