diff --git a/Authentication/AuthenticationProvider.cs b/Authentication/AuthenticationProvider.cs index d10cc3a..a51c322 100644 --- a/Authentication/AuthenticationProvider.cs +++ b/Authentication/AuthenticationProvider.cs @@ -11,8 +11,8 @@ namespace CryptoExchange.Net.Authentication this.credentials = credentials; } - public abstract string AddAuthenticationToUriString(string uri); - public abstract IRequest AddAuthenticationToRequest(IRequest request); + public abstract string AddAuthenticationToUriString(string uri, bool signed); + public abstract IRequest AddAuthenticationToRequest(IRequest request, bool signed); protected string ByteToString(byte[] buff) { diff --git a/BaseConverter.cs b/BaseConverter.cs index af8cb36..d0f1692 100644 --- a/BaseConverter.cs +++ b/BaseConverter.cs @@ -25,7 +25,15 @@ namespace CryptoExchange.Net public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { - return Mapping.Single(v => v.Value.ToLower() == reader.Value.ToString().ToLower()).Key; + var val = Mapping.Single(v => v.Value == reader.Value.ToString()).Key; + if (val != null) + return val; + return Mapping.Single(v => v.Value.ToLower() == reader.Value.ToString().ToLower()); + } + + public T ReadString(string data) + { + return Mapping.Single(v => v.Value == data).Key; } public override bool CanConvert(Type objectType) diff --git a/Error.cs b/Error.cs index 4309d95..59363fb 100644 --- a/Error.cs +++ b/Error.cs @@ -46,4 +46,9 @@ { public UnknownError(string message) : base(5, "Unknown error occured " + message) { } } + + public class ArgumentError : Error + { + public ArgumentError(string message) : base(5, "Invalid parameter: " + message) { } + } } diff --git a/ExchangeClient.cs b/ExchangeClient.cs index b48c5c6..33941c8 100644 --- a/ExchangeClient.cs +++ b/ExchangeClient.cs @@ -89,18 +89,16 @@ namespace CryptoExchange.Net uriString += $"{string.Join("&", parameters.Select(s => $"{s.Key}={s.Value}"))}"; } - - if (signed) - uriString = authProvider.AddAuthenticationToUriString(uriString); + + uriString = authProvider.AddAuthenticationToUriString(uriString, signed); var request = RequestFactory.Create(uriString); request.Method = method; if (apiProxy != null) request.SetProxy(apiProxy.Host, apiProxy.Port); - - if (signed) - request = authProvider.AddAuthenticationToRequest(request); + + request = authProvider.AddAuthenticationToRequest(request, signed); foreach (var limiter in rateLimiters) { @@ -132,8 +130,25 @@ namespace CryptoExchange.Net catch (WebException we) { var response = (HttpWebResponse)we.Response; - string infoMessage = response == null ? "No response from server" : $"Status: {response.StatusCode}-{response.StatusDescription}, Message: {we.Message}"; - return new CallResult(null, new WebError(infoMessage)); + string responseData = null; + try + { + var reader = new StreamReader(response.GetResponseStream()); + responseData = reader.ReadToEnd(); + } + catch (Exception e) + { + } + + string infoMessage = "No response from server"; + if (response == null) + return new CallResult(null, new WebError(infoMessage)); + + if (responseData != null) + infoMessage = "Server returned error: " + responseData; + else + infoMessage = $"Status: {response.StatusCode}-{response.StatusDescription}, Message: {we.Message}"; + return new CallResult(null, new ServerError(infoMessage)); } catch (Exception e) { @@ -151,7 +166,11 @@ namespace CryptoExchange.Net if (obj is JObject o) CheckObject(typeof(T), o); else - CheckObject(typeof(T), (JObject) ((JArray) obj)[0]); + { + var ary = (JArray) obj; + if (ary.HasValues && ary[0] is JObject jObject) + CheckObject(typeof(T).GetElementType(), jObject); + } } return new CallResult(obj.ToObject(), null); @@ -177,28 +196,32 @@ namespace CryptoExchange.Net if (ignore != null) continue; - properties.Add(attr == null ? prop.Name.ToLower() : ((JsonPropertyAttribute) attr).PropertyName.ToLower()); + properties.Add(attr == null ? prop.Name : ((JsonPropertyAttribute) attr).PropertyName); } foreach (var token in obj) { - var d = properties.SingleOrDefault(p => p == token.Key.ToLower()); + var d = properties.SingleOrDefault(p => p == token.Key); if (d == null) - log.Write(LogVerbosity.Warning, $"Didn't find property `{token.Key}` in object of type `{type.Name}`"); - else { - properties.Remove(d); - - var propType = GetProperty(d, props)?.PropertyType; - if (propType == null) - continue; - if (!IsSimple(propType) && propType != typeof(DateTime)) + d = properties.SingleOrDefault(p => p.ToLower() == token.Key.ToLower()); + if (d == null) { - if(propType.IsArray && token.Value.HasValues && ((JArray)token.Value).Any() && ((JArray)token.Value)[0] is JObject) - CheckObject(propType.GetElementType(), (JObject)token.Value[0]); - else if(token.Value is JObject) - CheckObject(propType, (JObject)token.Value); + log.Write(LogVerbosity.Warning, $"Didn't find property `{token.Key}` in object of type `{type.Name}`"); + continue; } } + properties.Remove(d); + + var propType = GetProperty(d, props)?.PropertyType; + if (propType == null) + continue; + if (!IsSimple(propType) && propType != typeof(DateTime)) + { + if(propType.IsArray && token.Value.HasValues && ((JArray)token.Value).Any() && ((JArray)token.Value)[0] is JObject) + CheckObject(propType.GetElementType(), (JObject)token.Value[0]); + else if(token.Value is JObject) + CheckObject(propType, (JObject)token.Value); + } } foreach(var prop in properties) @@ -217,7 +240,7 @@ namespace CryptoExchange.Net } else { - if (((JsonPropertyAttribute) attr).PropertyName.ToLower() == name) + if (((JsonPropertyAttribute) attr).PropertyName == name) return prop; } }