Merge pull request #2448 from kklin/follow-relative-links
Properly follow relative links when listing tagsmaster
						commit
						8cedd7b3a4
					
				|  | @ -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 | ||||||
| 			} | 			} | ||||||
|  |  | ||||||
|  | @ -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", | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue