mirror of
https://github.com/SAP/jenkins-library.git
synced 2024-12-14 11:03:09 +02:00
74 lines
2.2 KiB
Go
74 lines
2.2 KiB
Go
|
package sonar
|
||
|
|
||
|
import (
|
||
|
"encoding/json"
|
||
|
"net/http"
|
||
|
"strings"
|
||
|
|
||
|
"github.com/SAP/jenkins-library/pkg/log"
|
||
|
sonargo "github.com/magicsong/sonargo/sonar"
|
||
|
)
|
||
|
|
||
|
// Requester ...
|
||
|
type Requester struct {
|
||
|
Client Sender
|
||
|
Host string
|
||
|
Username string
|
||
|
Password string
|
||
|
// TODO: implement certificate handling
|
||
|
// Certificates [][]byte
|
||
|
}
|
||
|
|
||
|
// Sender provides an interface to the piper http client for uid/pwd and token authenticated requests
|
||
|
type Sender interface {
|
||
|
Send(*http.Request) (*http.Response, error)
|
||
|
}
|
||
|
|
||
|
func (requester *Requester) create(method, path string, options interface{}) (request *http.Request, err error) {
|
||
|
sonarGoClient, err := sonargo.NewClient(requester.Host, requester.Username, requester.Password)
|
||
|
if err != nil {
|
||
|
return
|
||
|
}
|
||
|
// reuse request creation from sonargo
|
||
|
request, err = sonarGoClient.NewRequest(method, path, options)
|
||
|
if err != nil {
|
||
|
return
|
||
|
}
|
||
|
// request created by sonarGO uses .Opaque without the host parameter leading to a request against https://api/issues/search
|
||
|
// https://github.com/magicsong/sonargo/blob/103eda7abc20bd192a064b6eb94ba26329e339f1/sonar/sonarqube.go#L55
|
||
|
request.URL.Opaque = ""
|
||
|
request.URL.Path = sonarGoClient.BaseURL().Path + path
|
||
|
return
|
||
|
}
|
||
|
|
||
|
func (requester *Requester) send(request *http.Request) (*http.Response, error) {
|
||
|
return requester.Client.Send(request)
|
||
|
}
|
||
|
|
||
|
func (requester *Requester) decode(response *http.Response, result interface{}) error {
|
||
|
decoder := json.NewDecoder(response.Body)
|
||
|
defer response.Body.Close()
|
||
|
// sonargo.IssuesSearchObject does not imlement "internal" field organization and thus decoding fails
|
||
|
// anyway the field is currently not needed so we simply allow (and drop) unknown fields to avoid extending the type
|
||
|
// decoder.DisallowUnknownFields()
|
||
|
return decoder.Decode(result)
|
||
|
}
|
||
|
|
||
|
// NewAPIClient ...
|
||
|
func NewAPIClient(host, token string, client Sender) *Requester {
|
||
|
// Make sure the given URL end with a slash
|
||
|
if !strings.HasSuffix(host, "/") {
|
||
|
host += "/"
|
||
|
}
|
||
|
// Make sure the given URL end with a api/
|
||
|
if !strings.HasSuffix(host, "api/") {
|
||
|
host += "api/"
|
||
|
}
|
||
|
log.Entry().Debugf("using api client for '%s'", host)
|
||
|
return &Requester{
|
||
|
Client: client,
|
||
|
Host: host,
|
||
|
Username: token,
|
||
|
}
|
||
|
}
|