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