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  }