github.com/crowdsecurity/crowdsec@v1.6.1/pkg/metabase/api.go (about) 1 package metabase 2 3 import ( 4 "encoding/json" 5 "fmt" 6 "net/http" 7 "time" 8 9 "github.com/crowdsecurity/go-cs-lib/version" 10 11 "github.com/dghubble/sling" 12 log "github.com/sirupsen/logrus" 13 ) 14 15 type MBClient struct { 16 CTX *sling.Sling 17 Client *http.Client 18 } 19 20 const ( 21 sessionEndpoint = "login" 22 scanEndpoint = "scan" 23 resetPasswordEndpoint = "reset_password" 24 userEndpoint = "user" 25 databaseEndpoint = "database" 26 ) 27 28 var ( 29 routes = map[string]string{ 30 sessionEndpoint: "api/session", 31 scanEndpoint: "api/database/2/rescan_values", 32 resetPasswordEndpoint: "api/user/1/password", 33 userEndpoint: "api/user/1", 34 databaseEndpoint: "api/database/2", 35 } 36 ) 37 38 func NewMBClient(url string) (*MBClient, error) { 39 httpClient := &http.Client{Timeout: 20 * time.Second} 40 return &MBClient{ 41 CTX: sling.New().Client(httpClient).Base(url).Set("User-Agent", fmt.Sprintf("crowdsec/%s", version.String())), 42 Client: httpClient, 43 }, nil 44 } 45 46 func (h *MBClient) Do(method string, route string, body interface{}) (interface{}, interface{}, error) { 47 var Success interface{} 48 var Error interface{} 49 var resp *http.Response 50 var err error 51 var data []byte 52 if body != nil { 53 data, _ = json.Marshal(body) 54 } 55 56 switch method { 57 case "POST": 58 log.Debugf("POST /%s", route) 59 log.Debugf("%s", string(data)) 60 resp, err = h.CTX.New().Post(route).BodyJSON(body).Receive(&Success, &Error) 61 case "GET": 62 log.Debugf("GET /%s", route) 63 resp, err = h.CTX.New().Get(route).Receive(&Success, &Error) 64 case "PUT": 65 log.Debugf("PUT /%s", route) 66 log.Debugf("%s", string(data)) 67 resp, err = h.CTX.New().Put(route).BodyJSON(body).Receive(&Success, &Error) 68 case "DELETE": 69 default: 70 return nil, nil, fmt.Errorf("unsupported method '%s'", method) 71 } 72 if Error != nil { 73 return Success, Error, fmt.Errorf("http error: %v", Error) 74 } 75 76 if resp != nil && resp.StatusCode != 200 && resp.StatusCode != 202 { 77 return Success, Error, fmt.Errorf("bad status code '%d': (success: %+v) | (error: %+v)", resp.StatusCode, Success, Error) 78 } 79 return Success, Error, err 80 } 81 82 // Set headers as key:value 83 func (h *MBClient) Set(key string, value string) { 84 h.CTX = h.CTX.Set(key, value) 85 }