Skip to content

Commit

Permalink
fix(API): ISSUE-185 Support paging when receiving tags
Browse files Browse the repository at this point in the history
  • Loading branch information
ivanilves committed Aug 20, 2019
1 parent 436a2ea commit e7ca0aa
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 17 deletions.
44 changes: 31 additions & 13 deletions api/v1/registry/client/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -183,19 +183,37 @@ func (cli *RegistryClient) TagNames(repoPath string) ([]string, error) {
return nil, err
}

resp, err := request.Perform(
cli.URL()+repoPath+"/tags/list",
repoToken.Method()+" "+repoToken.String(),
"v2",
cli.Config.TraceRequests,
cli.Config.RetryRequests,
cli.Config.RetryDelay,
)
if err != nil {
return nil, err
var allTagNames []string

link := "/tags/list"
for {
resp, nextlink, err := request.Perform(
cli.URL()+repoPath+link,
repoToken.Method()+" "+repoToken.String(),
"v2",
cli.Config.TraceRequests,
cli.Config.RetryRequests,
cli.Config.RetryDelay,
)
if err != nil {
return nil, err
}

tagNames, err := decodeTagNames(resp.Body)
if err != nil {
return nil, err
}

allTagNames = append(allTagNames, tagNames...)

if nextlink == "" {
break
}

link = "/tags/list?" + nextlink
}

return decodeTagNames(resp.Body)
return allTagNames, nil
}

func (cli *RegistryClient) tagDigest(repoPath, tagName string) (string, error) {
Expand All @@ -204,7 +222,7 @@ func (cli *RegistryClient) tagDigest(repoPath, tagName string) (string, error) {
return "", err
}

resp, err := request.Perform(
resp, _, err := request.Perform(
cli.URL()+repoPath+"/manifests/"+tagName,
repoToken.Method()+" "+repoToken.String(),
"v2",
Expand Down Expand Up @@ -249,7 +267,7 @@ func (cli *RegistryClient) v1TagOptions(repoPath, tagName string) (*tag.Options,
return nil, err
}

resp, err := request.Perform(
resp, _, err := request.Perform(
cli.URL()+repoPath+"/manifests/"+tagName,
repoToken.Method()+" "+repoToken.String(),
"v1",
Expand Down
21 changes: 17 additions & 4 deletions api/v1/registry/client/request/request.go
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ func perform(url, auth, mode string, trace bool) (resp *http.Response, err error
}

// Perform performs the required HTTP(S) request, retrying if applicable
func Perform(url, auth, mode string, trace bool, retries int, delay time.Duration) (resp *http.Response, err error) {
func Perform(url, auth, mode string, trace bool, retries int, delay time.Duration) (resp *http.Response, nextlink string, err error) {
tries := 1

if retries > 0 {
Expand All @@ -85,12 +85,12 @@ func Perform(url, auth, mode string, trace bool, retries int, delay time.Duratio
resp, err := perform(url, auth, mode, trace)

if err == nil {
return resp, nil
return resp, getNextLink(resp.Header["Link"]), nil
}

if resp != nil {
if resp.StatusCode >= 400 && resp.StatusCode < 500 {
return nil, err
return nil, "", err
}
}

Expand All @@ -109,5 +109,18 @@ func Perform(url, auth, mode string, trace bool, retries int, delay time.Duratio
}
}

return resp, err
return resp, getNextLink(resp.Header["Link"]), err
}

func getNextLink(headers []string) string {
if len(headers) == 0 {
return ""
}

nextlink := headers[0]

nextlink = strings.Split(nextlink, "?")[1]
nextlink = strings.Split(nextlink, ";")[0]

return nextlink
}

0 comments on commit e7ca0aa

Please sign in to comment.