connector/gitlab: Fix regexp in Link parser
This commit is contained in:
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
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
break
|
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