connector/gitlab: Fix regexp in Link parser
This commit is contained in:
		
				
					committed by
					
						 Lars Sjöström
						Lars Sjöström
					
				
			
			
				
	
			
			
			
						parent
						
							0aabf2d1ea
						
					
				
				
					commit
					4605fdd551
				
			| @@ -22,6 +22,11 @@ const ( | |||||||
| 	scopeAPI  = "api" | 	scopeAPI  = "api" | ||||||
| ) | ) | ||||||
|  |  | ||||||
|  | var ( | ||||||
|  | 	reNext = regexp.MustCompile("<([^>]+)>; rel=\"next\"") | ||||||
|  | 	reLast = regexp.MustCompile("<([^>]+)>; rel=\"last\"") | ||||||
|  | ) | ||||||
|  |  | ||||||
| // Config holds configuration options for gilab logins. | // Config holds configuration options for gilab logins. | ||||||
| type Config struct { | type Config struct { | ||||||
| 	BaseURL      string `json:"baseURL"` | 	BaseURL      string `json:"baseURL"` | ||||||
| @@ -236,9 +241,6 @@ func (c *gitlabConnector) groups(ctx context.Context, client *http.Client) ([]st | |||||||
|  |  | ||||||
| 	apiURL := c.baseURL + "/api/v4/groups" | 	apiURL := c.baseURL + "/api/v4/groups" | ||||||
|  |  | ||||||
| 	reNext := regexp.MustCompile("<(.*)>; rel=\"next\"") |  | ||||||
| 	reLast := regexp.MustCompile("<(.*)>; rel=\"last\"") |  | ||||||
|  |  | ||||||
| 	groups := []string{} | 	groups := []string{} | ||||||
| 	var gitlabGroups []gitlabGroup | 	var gitlabGroups []gitlabGroup | ||||||
| 	for { | 	for { | ||||||
| @@ -272,22 +274,28 @@ func (c *gitlabConnector) groups(ctx context.Context, client *http.Client) ([]st | |||||||
|  |  | ||||||
| 		link := resp.Header.Get("Link") | 		link := resp.Header.Get("Link") | ||||||
|  |  | ||||||
| 		if len(reLast.FindStringSubmatch(link)) > 1 { | 		apiURL = nextURL(apiURL, link) | ||||||
| 			lastPageURL := reLast.FindStringSubmatch(link)[1] | 		if apiURL == "" { | ||||||
|  |  | ||||||
| 			if apiURL == lastPageURL { |  | ||||||
| 			break | 			break | ||||||
| 		} | 		} | ||||||
| 		} else { |  | ||||||
| 			break |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		if len(reNext.FindStringSubmatch(link)) > 1 { |  | ||||||
| 			apiURL = reNext.FindStringSubmatch(link)[1] |  | ||||||
| 		} else { |  | ||||||
| 			break |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 	} | 	} | ||||||
| 	return groups, nil | 	return groups, nil | ||||||
| } | } | ||||||
|  |  | ||||||
|  | func nextURL(url string, link string) string { | ||||||
|  | 	if len(reLast.FindStringSubmatch(link)) > 1 { | ||||||
|  | 		lastPageURL := reLast.FindStringSubmatch(link)[1] | ||||||
|  |  | ||||||
|  | 		if url == lastPageURL { | ||||||
|  | 			return "" | ||||||
|  | 		} | ||||||
|  | 	} else { | ||||||
|  | 		return "" | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if len(reNext.FindStringSubmatch(link)) > 1 { | ||||||
|  | 		return reNext.FindStringSubmatch(link)[1] | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return "" | ||||||
|  | } | ||||||
|   | |||||||
							
								
								
									
										30
									
								
								connector/gitlab/gitlab_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								connector/gitlab/gitlab_test.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,30 @@ | |||||||
|  | package gitlab | ||||||
|  |  | ||||||
|  | import "testing" | ||||||
|  |  | ||||||
|  | var nextURLTests = []struct { | ||||||
|  | 	link     string | ||||||
|  | 	expected string | ||||||
|  | }{ | ||||||
|  | 	{"<https://gitlab.com/api/v4/groups?page=2&per_page=20>; rel=\"next\", " + | ||||||
|  | 		"<https://gitlab.com/api/v4/groups?page=1&per_page=20>; rel=\"prev\"; pet=\"cat\", " + | ||||||
|  | 		"<https://gitlab.com/api/v4/groups?page=3&per_page=20>; rel=\"last\"", | ||||||
|  | 		"https://gitlab.com/api/v4/groups?page=2&per_page=20"}, | ||||||
|  | 	{"<https://gitlab.com/api/v4/groups?page=3&per_page=20>; rel=\"next\", " + | ||||||
|  | 		"<https://gitlab.com/api/v4/groups?page=2&per_page=20>; rel=\"prev\"; pet=\"dog\", " + | ||||||
|  | 		"<https://gitlab.com/api/v4/groups?page=3&per_page=20>; rel=\"last\"", | ||||||
|  | 		"https://gitlab.com/api/v4/groups?page=3&per_page=20"}, | ||||||
|  | 	{"<https://gitlab.com/api/v4/groups?page=3&per_page=20>; rel=\"prev\"; pet=\"bunny\", " + | ||||||
|  | 		"<https://gitlab.com/api/v4/groups?page=3&per_page=20>; rel=\"last\"", | ||||||
|  | 		""}, | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func TestNextURL(t *testing.T) { | ||||||
|  | 	apiURL := "https://gitlab.com/api/v4/groups" | ||||||
|  | 	for _, tt := range nextURLTests { | ||||||
|  | 		apiURL = nextURL(apiURL, tt.link) | ||||||
|  | 		if apiURL != tt.expected { | ||||||
|  | 			t.Errorf("Should have returned %s, got %s", tt.expected, apiURL) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
		Reference in New Issue
	
	Block a user