Merge pull request #2448 from kklin/follow-relative-links

Properly follow relative links when listing tags
This commit is contained in:
Stephen Day 2017-11-22 16:38:47 -08:00 committed by GitHub
commit 8cedd7b3a4
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 30 additions and 5 deletions

View file

@ -205,13 +205,18 @@ type tags struct {
func (t *tags) All(ctx context.Context) ([]string, error) { func (t *tags) All(ctx context.Context) ([]string, error) {
var tags []string 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 { if err != nil {
return tags, err return tags, err
} }
for { for {
resp, err := t.client.Get(u) resp, err := t.client.Get(listURL.String())
if err != nil { if err != nil {
return tags, err return tags, err
} }
@ -231,7 +236,13 @@ func (t *tags) All(ctx context.Context) ([]string, error) {
} }
tags = append(tags, tagsResponse.Tags...) tags = append(tags, tagsResponse.Tags...)
if link := resp.Header.Get("Link"); link != "" { 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 { } else {
return tags, nil return tags, nil
} }

View file

@ -1136,13 +1136,27 @@ func TestManifestTagsPaginated(t *testing.T) {
queryParams["n"] = []string{"1"} queryParams["n"] = []string{"1"}
queryParams["last"] = []string{tagsList[i-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{ headers := http.Header(map[string][]string{
"Content-Length": {fmt.Sprint(len(body))}, "Content-Length": {fmt.Sprint(len(body))},
"Last-Modified": {time.Now().Add(-1 * time.Second).Format(time.ANSIC)}, "Last-Modified": {time.Now().Add(-1 * time.Second).Format(time.ANSIC)},
}) })
if i < 2 { if link != "" {
headers.Set("Link", "<"+s.URL+"/v2/"+repo.Name()+"/tags/list?n=1&last="+tagsList[i]+`>; rel="next"`) headers.Set("Link", fmt.Sprintf(`<%s>; rel="next"`, link))
} }
m = append(m, testutil.RequestResponseMapping{ m = append(m, testutil.RequestResponseMapping{
Request: testutil.Request{ Request: testutil.Request{
Method: "GET", Method: "GET",