From 488eb1cd48fc855b0c8e784fff798debf45d57d9 Mon Sep 17 00:00:00 2001
From: JKorf <jankorf91@gmail.com>
Date: Thu, 1 Mar 2018 11:46:55 +0100
Subject: [PATCH] small adjustments

---
 Authentication/AuthenticationProvider.cs |  4 +-
 BaseConverter.cs                         | 10 +++-
 Error.cs                                 |  5 ++
 ExchangeClient.cs                        | 71 ++++++++++++++++--------
 4 files changed, 63 insertions(+), 27 deletions(-)

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<string>(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<string>(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<string>(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<T>(obj.ToObject<T>(), 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;
                 }
             }