github.com/status-im/status-go@v1.1.0/services/wallet/thirdparty/http_client.go (about) 1 package thirdparty 2 3 import ( 4 "bytes" 5 "context" 6 "encoding/json" 7 "io/ioutil" 8 "net/http" 9 netUrl "net/url" 10 "time" 11 ) 12 13 const requestTimeout = 5 * time.Second 14 const maxNumOfRequestRetries = 5 15 16 type BasicCreds struct { 17 User string 18 Password string 19 } 20 21 type HTTPClient struct { 22 client *http.Client 23 } 24 25 func NewHTTPClient() *HTTPClient { 26 return &HTTPClient{ 27 client: &http.Client{ 28 Timeout: requestTimeout, 29 }, 30 } 31 } 32 33 func (c *HTTPClient) DoGetRequest(ctx context.Context, url string, params netUrl.Values, creds *BasicCreds) ([]byte, error) { 34 if len(params) > 0 { 35 url = url + "?" + params.Encode() 36 } 37 38 req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil) 39 if err != nil { 40 return nil, err 41 } 42 43 if creds != nil { 44 req.SetBasicAuth(creds.User, creds.Password) 45 } 46 47 var resp *http.Response 48 for i := 0; i < maxNumOfRequestRetries; i++ { 49 resp, err = c.client.Do(req) 50 if err == nil || i == maxNumOfRequestRetries-1 { 51 break 52 } 53 time.Sleep(200 * time.Millisecond) 54 } 55 if err != nil { 56 return nil, err 57 } 58 defer resp.Body.Close() 59 60 body, err := ioutil.ReadAll(resp.Body) 61 if err != nil { 62 return nil, err 63 } 64 65 return body, nil 66 } 67 68 func (c *HTTPClient) DoPostRequest(ctx context.Context, url string, params map[string]interface{}, creds *BasicCreds) ([]byte, error) { 69 jsonData, err := json.Marshal(params) 70 if err != nil { 71 return nil, err 72 } 73 74 req, err := http.NewRequestWithContext(ctx, http.MethodPost, url, bytes.NewBuffer(jsonData)) 75 if err != nil { 76 return nil, err 77 } 78 79 if creds != nil { 80 req.SetBasicAuth(creds.User, creds.Password) 81 } 82 83 req.Header.Set("Content-Type", "application/json") 84 req.Header.Set("User-Agent", "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:96.0) Gecko/20100101 Firefox/96.0") 85 86 resp, err := c.client.Do(req) 87 if err != nil { 88 return nil, err 89 } 90 defer resp.Body.Close() 91 92 body, err := ioutil.ReadAll(resp.Body) 93 if err != nil { 94 return nil, err 95 } 96 97 return body, nil 98 }