mirror of
https://github.com/d0zingcat/gocryptotrader.git
synced 2026-06-08 23:16:54 +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:
@@ -10,7 +10,6 @@ import (
|
||||
"strconv"
|
||||
"strings"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"github.com/thrasher-corp/gocryptotrader/common"
|
||||
"github.com/thrasher-corp/gocryptotrader/common/crypto"
|
||||
@@ -958,13 +957,18 @@ func (k *Kraken) SendHTTPRequest(ep exchange.URL, path string, result interface{
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return k.SendPayload(context.Background(), &request.Item{
|
||||
|
||||
item := &request.Item{
|
||||
Method: http.MethodGet,
|
||||
Path: endpoint + path,
|
||||
Result: result,
|
||||
Verbose: k.Verbose,
|
||||
HTTPDebugging: k.HTTPDebugging,
|
||||
HTTPRecording: k.HTTPRecording,
|
||||
}
|
||||
|
||||
return k.SendPayload(context.Background(), request.Unset, func() (*request.Item, error) {
|
||||
return item, nil
|
||||
})
|
||||
}
|
||||
|
||||
@@ -979,43 +983,38 @@ func (k *Kraken) SendAuthenticatedHTTPRequest(ep exchange.URL, method string, pa
|
||||
}
|
||||
path := fmt.Sprintf("/%s/private/%s", krakenAPIVersion, method)
|
||||
|
||||
params.Set("nonce", k.Requester.GetNonce(true).String())
|
||||
encoded := params.Encode()
|
||||
shasum := crypto.GetSHA256([]byte(params.Get("nonce") + encoded))
|
||||
signature := crypto.Base64Encode(crypto.GetHMAC(crypto.HashSHA512,
|
||||
append([]byte(path), shasum...), []byte(k.API.Credentials.Secret)))
|
||||
|
||||
if k.Verbose {
|
||||
log.Debugf(log.ExchangeSys, "Sending POST request to %s, path: %s, params: %s",
|
||||
endpoint,
|
||||
path,
|
||||
encoded)
|
||||
}
|
||||
|
||||
headers := make(map[string]string)
|
||||
headers["API-Key"] = k.API.Credentials.Key
|
||||
headers["API-Sign"] = signature
|
||||
|
||||
interim := json.RawMessage{}
|
||||
ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(time.Minute))
|
||||
defer cancel()
|
||||
err = k.SendPayload(ctx, &request.Item{
|
||||
Method: http.MethodPost,
|
||||
Path: endpoint + path,
|
||||
Headers: headers,
|
||||
Body: strings.NewReader(encoded),
|
||||
Result: &interim,
|
||||
AuthRequest: true,
|
||||
NonceEnabled: true,
|
||||
Verbose: k.Verbose,
|
||||
HTTPDebugging: k.HTTPDebugging,
|
||||
HTTPRecording: k.HTTPRecording,
|
||||
err = k.SendPayload(context.Background(), request.Unset, func() (*request.Item, error) {
|
||||
nonce := k.Requester.GetNonce(true).String()
|
||||
params.Set("nonce", nonce)
|
||||
encoded := params.Encode()
|
||||
shasum := crypto.GetSHA256([]byte(nonce + encoded))
|
||||
signature := crypto.Base64Encode(crypto.GetHMAC(crypto.HashSHA512,
|
||||
append([]byte(path), shasum...),
|
||||
[]byte(k.API.Credentials.Secret)))
|
||||
|
||||
headers := make(map[string]string)
|
||||
headers["API-Key"] = k.API.Credentials.Key
|
||||
headers["API-Sign"] = signature
|
||||
|
||||
return &request.Item{
|
||||
Method: http.MethodPost,
|
||||
Path: endpoint + path,
|
||||
Headers: headers,
|
||||
Body: strings.NewReader(encoded),
|
||||
Result: &interim,
|
||||
AuthRequest: true,
|
||||
NonceEnabled: true,
|
||||
Verbose: k.Verbose,
|
||||
HTTPDebugging: k.HTTPDebugging,
|
||||
HTTPRecording: k.HTTPRecording,
|
||||
}, nil
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
var errCap SpotAuthError
|
||||
if err := json.Unmarshal(interim, &errCap); err == nil {
|
||||
if err = json.Unmarshal(interim, &errCap); err == nil {
|
||||
if len(errCap.Error) != 0 {
|
||||
return errors.New(errCap.Error[0])
|
||||
}
|
||||
|
||||
@@ -264,40 +264,45 @@ func (k *Kraken) SendFuturesAuthRequest(method, path string, postData url.Values
|
||||
if postData == nil {
|
||||
postData = url.Values{}
|
||||
}
|
||||
nonce := strconv.FormatInt(time.Now().UnixNano()/1000000, 10)
|
||||
reqData := ""
|
||||
if len(data) > 0 {
|
||||
temp, err := json.Marshal(data)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
postData.Add("json", string(temp))
|
||||
reqData = "json=" + string(temp)
|
||||
}
|
||||
sig := k.signFuturesRequest(path, nonce, reqData)
|
||||
headers := map[string]string{
|
||||
"APIKey": k.API.Credentials.Key,
|
||||
"Authent": sig,
|
||||
"Nonce": nonce,
|
||||
}
|
||||
|
||||
interim := json.RawMessage{}
|
||||
ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(time.Minute))
|
||||
defer cancel()
|
||||
err := k.SendPayload(ctx, &request.Item{
|
||||
Method: method,
|
||||
Path: futuresURL + common.EncodeURLValues(path, postData),
|
||||
Headers: headers,
|
||||
Result: &interim,
|
||||
AuthRequest: true,
|
||||
Verbose: k.Verbose,
|
||||
HTTPDebugging: k.HTTPDebugging,
|
||||
HTTPRecording: k.HTTPRecording,
|
||||
})
|
||||
newRequest := func() (*request.Item, error) {
|
||||
nonce := strconv.FormatInt(time.Now().UnixNano()/1000000, 10)
|
||||
reqData := ""
|
||||
if len(data) > 0 {
|
||||
temp, err := json.Marshal(data)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
postData.Set("json", string(temp))
|
||||
reqData = "json=" + string(temp)
|
||||
}
|
||||
sig := k.signFuturesRequest(path, nonce, reqData)
|
||||
headers := map[string]string{
|
||||
"APIKey": k.API.Credentials.Key,
|
||||
"Authent": sig,
|
||||
"Nonce": nonce,
|
||||
}
|
||||
|
||||
return &request.Item{
|
||||
Method: method,
|
||||
Path: futuresURL + common.EncodeURLValues(path, postData),
|
||||
Headers: headers,
|
||||
Result: &interim,
|
||||
AuthRequest: true,
|
||||
Verbose: k.Verbose,
|
||||
HTTPDebugging: k.HTTPDebugging,
|
||||
HTTPRecording: k.HTTPRecording,
|
||||
}, nil
|
||||
}
|
||||
|
||||
err := k.SendPayload(context.Background(), request.Unset, newRequest)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
var errCap AuthErrorData
|
||||
if err := json.Unmarshal(interim, &errCap); err == nil {
|
||||
if err = json.Unmarshal(interim, &errCap); err == nil {
|
||||
if errCap.Result != "success" && errCap.Error != "" {
|
||||
return errors.New(errCap.Error)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user