/// <summary> /// Initialize object from another <see cref="ICredentialsProvider"/> implementation. /// </summary> /// <param name="credProvider">The source provider.</param> /// <param name="seed">UUID encryption seed (optional)</param> public MemoryEncryptedCredentialsProvider(ICredentialsProvider credProvider, Guid?seed = null) { if (seed == null) { this.seed = MakeZipper(); } else { this.seed = MakeZipper((Guid)seed); } if (credProvider == null) { return; } this.key = EncryptIt(credProvider.GetKey()); this.secret = EncryptIt(credProvider.GetSecret()); this.passphrase = EncryptIt(credProvider.GetPassphrase()); this.sandbox = credProvider.GetSandbox(); this.futures = credProvider.GetFutures(); }
/// <summary> /// Make a new request to the API endpoint. /// </summary> /// <param name="method">The <see cref="HttpMethod"/> of the new call.</param> /// <param name="uri">The relative path of the endpoint.</param> /// <param name="timeout">Timeout value, in seconds.</param> /// <param name="auth">True if the call is authenticated.</param> /// <param name="reqParams">Optional parameters for the call.</param> /// <param name="wholeResponseJson">True to return the whole response, or false to just return the 'data' portion.</param> /// <returns>A <see cref="JToken"/> object that can be deserialized to suit members in the derived class.</returns> protected async Task <JToken> MakeRequest( HttpMethod method, string uri, int timeout = 10, bool auth = true, IDictionary <string, object> reqParams = null, bool wholeResponseJson = false) { string token; string json_data = reqParams != null?JsonConvert.SerializeObject(reqParams) : ""; if (method == HttpMethod.Get || method == HttpMethod.Delete) { if (reqParams != null && reqParams.Count > 0) { // sort the keys as per the Python API var sdict = new SortedDictionary <string, object>(reqParams); var sb = new StringBuilder(); foreach (var kv in sdict) { if (sb.Length != 0) { sb.Append("&"); } string sval; if (kv.Value is Enum) { sval = EnumToStringConverter <Enum> .GetEnumName((Enum)kv.Value); } else { sval = kv.Value.ToString(); } sb.Append(string.Format("{0}={1}", kv.Key, sval)); } uri += "?" + sb.ToString(); } token = uri; } else { token = uri + json_data; } Uri requri = UriJoin(this.url, uri); HttpRequestMessage req = new HttpRequestMessage(method, requri); req.Headers.Clear(); // KuCoin API Authentication Magic ICredentialsProvider cred = ResolveCredentials(); if (auth && cred != null) { var now_time = EpochTime.DateToSeconds(DateTime.Now) * 1000; var str_to_sign = now_time.ToString() + method.Method + token; var sign = CreateToken(str_to_sign, cred.GetSecret()); if (isv1api) { req.Headers.Add("KC-API-SIGN", sign); req.Headers.Add("KC-API-TIMESTAMP", now_time.ToString()); req.Headers.Add("KC-API-KEY", cred.GetKey()); req.Headers.Add("KC-API-PASSPHRASE", cred.GetPassphrase()); } else { var passphrase = CreateToken(cred.GetPassphrase(), cred.GetSecret()); req.Headers.Add("KC-API-SIGN", sign); req.Headers.Add("KC-API-TIMESTAMP", now_time.ToString()); req.Headers.Add("KC-API-KEY", cred.GetKey()); req.Headers.Add("KC-API-PASSPHRASE", passphrase); req.Headers.Add("KC-API-KEY-VERSION", "2"); } } using (HttpClient httpClient = new HttpClient()) { httpClient.Timeout = new TimeSpan(0, 0, timeout); if (method == HttpMethod.Get) { json_data = ""; } req.Content = new StringContent(json_data, Encoding.UTF8, "application/json"); long nt = DateTime.UtcNow.Ticks; lock (requestLockObject) { if (nt - lastTime < 2_500_000) { Thread.Sleep(250); } lastTime = nt; } var resp = await httpClient.SendAsync(req); var result = await CheckResponseData(resp, wholeResponseJson); return(result); } }