mirror of
https://github.com/d0zingcat/gocryptotrader.git
synced 2026-06-07 15:11:03 +00:00
requester: defer execution of request.Item generation in closure (#723)
* requester: defer execution of request.Item generation in closure. * bithumb: fix issue * coinut/itbit: fix linter issues * binance: fix bug on recvWindow setting * requester: standardize sendpayload + add readme update * nonce: remove inc() function * request: defer unlockiflocked * binance: revert changes for open orders * btcmarkets: defer auth generation functionality, rm context deadline as this will be created just before sending HTTP request. * binance: move const to top * exmo: remove debug output as its generated in the requester function * ftx: defer auth functionality * requester: move error to top * bittrex: defer auth functionality * bitmex: defer auth functionality and remove deadline as generation occurs after rate limiting. * btse: defer auth functionality * coinbasepro: defer auth functionality and removed context deadline as this is generated after rate limiting * coinbene: defer auth functionality and remove context deadline as this is generated after rate limiting * huobi: defer auth functionality and remove context deadline as this is generated after rate limiting * huobi-futures: defer auth functionality and remove context deadline as this is generated after rate limiting * kraken: defer auth functionality and remove context deadline as this is generated after rate limiting * kraken: remove deadline protection for timestamp generation * okgroup: defer auth functionality and remove context deadline as this is generated after rate limiting * poloniex: defer auth functionality * zb: defer auth functionality and remove context deadline as this is generated after rate limiting * exchanges: clean up log output which are done and inspected in the requester package * binance: fix path bug on every retry, rm timeout context as this is not needed * coinbene: fix path bug on retry * binance: consolidate functionality * coinbene: fix linter issues * poloniex: linter fix * kraken: change add -> set * bitstamp: fix path bug for retry * BTSE: fix retry path bug * coinbene: fix path bug whoopsie by me * gateio: fix bug where on retry it does not reset reader * localbitcoins: fix path bug on retry * zb: change domain to land * exchanges: make sure io.Reader is generated every request * exchanges: move reader generation into function scope * wrapper_issues: setup exchange manager * engine: expand withdraw manager test * engine: dont look for environment * bitstamp: fix pathing bug (@thrasher-) * engine/withdraw_manager: purge tests as this is covered in repository withdraw
This commit is contained in:
@@ -1088,24 +1088,26 @@ func (c *Coinbene) SendHTTPRequest(ep exchange.URL, path string, f request.Endpo
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
var resp json.RawMessage
|
||||
errCap := struct {
|
||||
Code int `json:"code"`
|
||||
Message string `json:"message"`
|
||||
}{}
|
||||
|
||||
if err := c.SendPayload(context.Background(), &request.Item{
|
||||
var resp json.RawMessage
|
||||
item := &request.Item{
|
||||
Method: http.MethodGet,
|
||||
Path: endpoint + path,
|
||||
Result: &resp,
|
||||
Verbose: c.Verbose,
|
||||
HTTPDebugging: c.HTTPDebugging,
|
||||
HTTPRecording: c.HTTPRecording,
|
||||
Endpoint: f,
|
||||
}
|
||||
if err := c.SendPayload(context.Background(), f, func() (*request.Item, error) {
|
||||
return item, nil
|
||||
}); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
errCap := struct {
|
||||
Code int `json:"code"`
|
||||
Message string `json:"message"`
|
||||
}{}
|
||||
if err := json.Unmarshal(resp, &errCap); err == nil {
|
||||
if errCap.Code != 200 && errCap.Message != "" {
|
||||
return errors.New(errCap.Message)
|
||||
@@ -1128,76 +1130,77 @@ func (c *Coinbene) SendAuthHTTPRequest(ep exchange.URL, method, path, epPath str
|
||||
if isSwap {
|
||||
authPath = coinbeneSwapAuthPath
|
||||
}
|
||||
now := time.Now()
|
||||
timestamp := now.UTC().Format("2006-01-02T15:04:05.999Z")
|
||||
var finalBody io.Reader
|
||||
var preSign string
|
||||
switch {
|
||||
case params != nil && method == http.MethodGet:
|
||||
p, ok := params.(url.Values)
|
||||
if !ok {
|
||||
return fmt.Errorf("params is not of type url.Values")
|
||||
}
|
||||
preSign = timestamp + method + authPath + epPath + "?" + p.Encode()
|
||||
path = common.EncodeURLValues(path, p)
|
||||
case params != nil:
|
||||
var i interface{}
|
||||
switch p := params.(type) {
|
||||
case url.Values:
|
||||
m := make(map[string]string)
|
||||
for k, v := range p {
|
||||
m[k] = strings.Join(v, "")
|
||||
}
|
||||
i = m
|
||||
default:
|
||||
i = p
|
||||
}
|
||||
tempBody, err := json.Marshal(i)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
finalBody = bytes.NewBufferString(string(tempBody))
|
||||
preSign = timestamp + method + authPath + epPath + string(tempBody)
|
||||
default:
|
||||
preSign = timestamp + method + authPath + epPath
|
||||
}
|
||||
tempSign := crypto.GetHMAC(crypto.HashSHA256,
|
||||
[]byte(preSign),
|
||||
[]byte(c.API.Credentials.Secret))
|
||||
headers := make(map[string]string)
|
||||
headers["Content-Type"] = "application/json"
|
||||
headers["ACCESS-KEY"] = c.API.Credentials.Key
|
||||
headers["ACCESS-SIGN"] = crypto.HexEncodeToString(tempSign)
|
||||
headers["ACCESS-TIMESTAMP"] = timestamp
|
||||
|
||||
var resp json.RawMessage
|
||||
newRequest := func() (*request.Item, error) {
|
||||
timestamp := time.Now().UTC().Format("2006-01-02T15:04:05.999Z")
|
||||
var finalBody io.Reader
|
||||
var preSign string
|
||||
var fullPath = path
|
||||
switch {
|
||||
case params != nil && method == http.MethodGet:
|
||||
p, ok := params.(url.Values)
|
||||
if !ok {
|
||||
return nil, errors.New("params is not of type url.Values")
|
||||
}
|
||||
preSign = timestamp + method + authPath + epPath + "?" + p.Encode()
|
||||
fullPath = common.EncodeURLValues(path, p)
|
||||
case params != nil:
|
||||
var i interface{}
|
||||
switch p := params.(type) {
|
||||
case url.Values:
|
||||
m := make(map[string]string)
|
||||
for k, v := range p {
|
||||
m[k] = strings.Join(v, "")
|
||||
}
|
||||
i = m
|
||||
default:
|
||||
i = p
|
||||
}
|
||||
tempBody, err2 := json.Marshal(i)
|
||||
if err2 != nil {
|
||||
return nil, err2
|
||||
}
|
||||
finalBody = bytes.NewBufferString(string(tempBody))
|
||||
preSign = timestamp + method + authPath + epPath + string(tempBody)
|
||||
default:
|
||||
preSign = timestamp + method + authPath + epPath
|
||||
}
|
||||
tempSign := crypto.GetHMAC(crypto.HashSHA256,
|
||||
[]byte(preSign),
|
||||
[]byte(c.API.Credentials.Secret))
|
||||
headers := make(map[string]string)
|
||||
headers["Content-Type"] = "application/json"
|
||||
headers["ACCESS-KEY"] = c.API.Credentials.Key
|
||||
headers["ACCESS-SIGN"] = crypto.HexEncodeToString(tempSign)
|
||||
headers["ACCESS-TIMESTAMP"] = timestamp
|
||||
|
||||
return &request.Item{
|
||||
Method: method,
|
||||
Path: endpoint + fullPath,
|
||||
Headers: headers,
|
||||
Body: finalBody,
|
||||
Result: &resp,
|
||||
AuthRequest: true,
|
||||
Verbose: c.Verbose,
|
||||
HTTPDebugging: c.HTTPDebugging,
|
||||
HTTPRecording: c.HTTPRecording,
|
||||
}, nil
|
||||
}
|
||||
|
||||
if err := c.SendPayload(context.Background(), f, newRequest); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
errCap := struct {
|
||||
Code int `json:"code"`
|
||||
Message string `json:"message"`
|
||||
}{}
|
||||
|
||||
// Expiry of timestamp doesn't appear to be documented, so making a reasonable assumption
|
||||
ctx, cancel := context.WithDeadline(context.Background(), now.Add(15*time.Second))
|
||||
defer cancel()
|
||||
if err := c.SendPayload(ctx, &request.Item{
|
||||
Method: method,
|
||||
Path: endpoint + path,
|
||||
Headers: headers,
|
||||
Body: finalBody,
|
||||
Result: &resp,
|
||||
AuthRequest: true,
|
||||
Verbose: c.Verbose,
|
||||
HTTPDebugging: c.HTTPDebugging,
|
||||
HTTPRecording: c.HTTPRecording,
|
||||
Endpoint: f,
|
||||
}); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := json.Unmarshal(resp, &errCap); err == nil {
|
||||
if errCap.Code != 200 && errCap.Message != "" {
|
||||
return errors.New(errCap.Message)
|
||||
}
|
||||
if err := json.Unmarshal(resp, &errCap); err == nil &&
|
||||
errCap.Code != 200 &&
|
||||
errCap.Message != "" {
|
||||
return errors.New(errCap.Message)
|
||||
}
|
||||
return json.Unmarshal(resp, result)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user