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