Merge pull request #2448 from kklin/follow-relative-links
Properly follow relative links when listing tags
This commit is contained in:
commit
8cedd7b3a4
2 changed files with 30 additions and 5 deletions
|
@ -205,13 +205,18 @@ type tags struct {
|
|||
func (t *tags) All(ctx context.Context) ([]string, error) {
|
||||
var tags []string
|
||||
|
||||
u, err := t.ub.BuildTagsURL(t.name)
|
||||
listURLStr, err := t.ub.BuildTagsURL(t.name)
|
||||
if err != nil {
|
||||
return tags, err
|
||||
}
|
||||
|
||||
listURL, err := url.Parse(listURLStr)
|
||||
if err != nil {
|
||||
return tags, err
|
||||
}
|
||||
|
||||
for {
|
||||
resp, err := t.client.Get(u)
|
||||
resp, err := t.client.Get(listURL.String())
|
||||
if err != nil {
|
||||
return tags, err
|
||||
}
|
||||
|
@ -231,7 +236,13 @@ func (t *tags) All(ctx context.Context) ([]string, error) {
|
|||
}
|
||||
tags = append(tags, tagsResponse.Tags...)
|
||||
if link := resp.Header.Get("Link"); link != "" {
|
||||
u = strings.Trim(strings.Split(link, ";")[0], "<>")
|
||||
linkURLStr := strings.Trim(strings.Split(link, ";")[0], "<>")
|
||||
linkURL, err := url.Parse(linkURLStr)
|
||||
if err != nil {
|
||||
return tags, err
|
||||
}
|
||||
|
||||
listURL = listURL.ResolveReference(linkURL)
|
||||
} else {
|
||||
return tags, nil
|
||||
}
|
||||
|
|
|
@ -1136,13 +1136,27 @@ func TestManifestTagsPaginated(t *testing.T) {
|
|||
queryParams["n"] = []string{"1"}
|
||||
queryParams["last"] = []string{tagsList[i-1]}
|
||||
}
|
||||
|
||||
// Test both relative and absolute links.
|
||||
relativeLink := "/v2/" + repo.Name() + "/tags/list?n=1&last=" + tagsList[i]
|
||||
var link string
|
||||
switch i {
|
||||
case 0:
|
||||
link = relativeLink
|
||||
case len(tagsList) - 1:
|
||||
link = ""
|
||||
default:
|
||||
link = s.URL + relativeLink
|
||||
}
|
||||
|
||||
headers := http.Header(map[string][]string{
|
||||
"Content-Length": {fmt.Sprint(len(body))},
|
||||
"Last-Modified": {time.Now().Add(-1 * time.Second).Format(time.ANSIC)},
|
||||
})
|
||||
if i < 2 {
|
||||
headers.Set("Link", "<"+s.URL+"/v2/"+repo.Name()+"/tags/list?n=1&last="+tagsList[i]+`>; rel="next"`)
|
||||
if link != "" {
|
||||
headers.Set("Link", fmt.Sprintf(`<%s>; rel="next"`, link))
|
||||
}
|
||||
|
||||
m = append(m, testutil.RequestResponseMapping{
|
||||
Request: testutil.Request{
|
||||
Method: "GET",
|
||||
|
|
Loading…
Reference in a new issue