diff --git a/pkg/simple/client/devops/jenkins/pure_request.go b/pkg/simple/client/devops/jenkins/pure_request.go index 89a28a871..78837d570 100644 --- a/pkg/simple/client/devops/jenkins/pure_request.go +++ b/pkg/simple/client/devops/jenkins/pure_request.go @@ -34,12 +34,13 @@ func (j *Jenkins) SendPureRequest(path string, httpParameters *devops.HttpParame // provider request header to call jenkins api. // transfer bearer token to basic token for inner Oauth and Jeknins func (j *Jenkins) SendPureRequestWithHeaderResp(path string, httpParameters *devops.HttpParameters) ([]byte, http.Header, error) { - Url, err := url.Parse(j.Server + path) + apiURL, err := url.Parse(j.Server + path) if err != nil { klog.Error(err) return nil, nil, err } + apiURL.RawQuery = httpParameters.Url.RawQuery client := &http.Client{Timeout: 30 * time.Second} header := httpParameters.Header @@ -47,7 +48,7 @@ func (j *Jenkins) SendPureRequestWithHeaderResp(path string, httpParameters *dev newRequest := &http.Request{ Method: httpParameters.Method, - URL: Url, + URL: apiURL, Header: header, Body: httpParameters.Body, Form: httpParameters.Form, diff --git a/pkg/simple/client/devops/jenkins/utils.go b/pkg/simple/client/devops/jenkins/utils.go index 10ea4c7e8..1987f778b 100644 --- a/pkg/simple/client/devops/jenkins/utils.go +++ b/pkg/simple/client/devops/jenkins/utils.go @@ -74,10 +74,9 @@ func getRespBody(resp *http.Response) ([]byte, error) { // ParseJenkinsQuery Parse the special query of jenkins. // ParseQuery in the standard library makes the query not re-encode -func ParseJenkinsQuery(query string) (url.Values, error) { - m := make(url.Values) - err := error(nil) - for query != "" { +func ParseJenkinsQuery(query string) (result url.Values, err error) { + result = make(url.Values) + for query != "" && err == nil { key := query if i := strings.IndexAny(key, "&"); i >= 0 { key, query = key[:i], key[i+1:] @@ -91,23 +90,13 @@ func ParseJenkinsQuery(query string) (url.Values, error) { if i := strings.Index(key, "="); i >= 0 { key, value = key[:i], key[i+1:] } - key, err1 := url.QueryUnescape(key) - if err1 != nil { - if err == nil { - err = err1 + if key, err = url.QueryUnescape(key); err == nil { + if value, err = url.QueryUnescape(value); err == nil { + result[key] = append(result[key], value) } - continue } - value, err1 = url.QueryUnescape(value) - if err1 != nil { - if err == nil { - err = err1 - } - continue - } - m[key] = append(m[key], value) } - return m, err + return } type JenkinsBlueTime time.Time diff --git a/pkg/simple/client/devops/jenkins/utils_test.go b/pkg/simple/client/devops/jenkins/utils_test.go new file mode 100644 index 000000000..71769173a --- /dev/null +++ b/pkg/simple/client/devops/jenkins/utils_test.go @@ -0,0 +1,57 @@ +package jenkins + +import ( + "github.com/stretchr/testify/assert" + "net/url" + "testing" +) + +func TestParseJenkinsQuery(t *testing.T) { + table := []testData{ + { + param: "start=0&limit=10&branch=master", + expected: url.Values{ + "start": []string{"0"}, + "limit": []string{"10"}, + "branch": []string{"master"}, + }, err: false, + }, + { + param: "branch=master", expected: url.Values{ + "branch": []string{"master"}, + }, err: false, + }, + { + param: "&branch=master", expected: url.Values{ + "branch": []string{"master"}, + }, err: false, + }, + { + param: "branch=master&", expected: url.Values{ + "branch": []string{"master"}, + }, err: false, + }, + { + param: "branch=%gg", expected: url.Values{}, err: true, + }, + { + param: "%gg=fake", expected: url.Values{}, err: true, + }, + } + + for index, item := range table { + result, err := parseJenkinsQuery(item.param) + if item.err { + assert.NotNil(t, err, "index: [%d], unexpected error happen %v", index, err) + } else { + assert.Nil(t, err, "index: [%d], unexpected error happen %v", index, err) + } + assert.Equal(t, item.expected, result, "index: [%d], result do not match with the expect value", index) + } +} + +type testData struct { + param string + expected interface{} + err bool +}