1
0
mirror of https://github.com/SAP/jenkins-library.git synced 2024-12-14 11:03:09 +02:00
sap-jenkins-library/pkg/sonar/client.go

74 lines
2.2 KiB
Go
Raw Normal View History

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,
}
}