diff --git a/CryptoExchange.Net.UnitTests/TestImplementations/TestRestClient.cs b/CryptoExchange.Net.UnitTests/TestImplementations/TestRestClient.cs
index 21c398e..351f0ba 100644
--- a/CryptoExchange.Net.UnitTests/TestImplementations/TestRestClient.cs
+++ b/CryptoExchange.Net.UnitTests/TestImplementations/TestRestClient.cs
@@ -97,10 +97,9 @@ namespace CryptoExchange.Net.UnitTests.TestImplementations
public ParseErrorTestRestClient() { }
public ParseErrorTestRestClient(ClientOptions exchangeOptions) : base(exchangeOptions) { }
- protected override Error ParseErrorResponse(string error)
+ protected override Error ParseErrorResponse(JToken error)
{
- var data = JToken.Parse(error);
- return new ServerError((int)data["errorCode"], (string)data["errorMessage"]);
+ return new ServerError((int)error["errorCode"], (string)error["errorMessage"]);
}
}
}
diff --git a/CryptoExchange.Net/BaseClient.cs b/CryptoExchange.Net/BaseClient.cs
index 46cf768..766e2c0 100644
--- a/CryptoExchange.Net/BaseClient.cs
+++ b/CryptoExchange.Net/BaseClient.cs
@@ -62,6 +62,37 @@ namespace CryptoExchange.Net
authProvider = authenticationProvider;
}
+ ///
+ /// Tries to parse the json data and returns a token
+ ///
+ /// The data to parse
+ ///
+ protected CallResult ValidateJson(string data)
+ {
+ try
+ {
+ return new CallResult(JToken.Parse(data), null);
+ }
+ catch (JsonReaderException jre)
+ {
+ var info = $"Deserialize JsonReaderException: {jre.Message}, Path: {jre.Path}, LineNumber: {jre.LineNumber}, LinePosition: {jre.LinePosition}. Data: {data}";
+ log.Write(LogVerbosity.Error, info);
+ return new CallResult(null, new DeserializeError(info));
+ }
+ catch (JsonSerializationException jse)
+ {
+ var info = $"Deserialize JsonSerializationException: {jse.Message}. Data: {data}";
+ log.Write(LogVerbosity.Error, info);
+ return new CallResult(null, new DeserializeError(info));
+ }
+ catch (Exception ex)
+ {
+ var info = $"Deserialize Unknown Exception: {ex.Message}. Data: {data}";
+ log.Write(LogVerbosity.Error, info);
+ return new CallResult(null, new DeserializeError(info));
+ }
+ }
+
///
/// Deserialize a string into an object
///
@@ -72,28 +103,10 @@ namespace CryptoExchange.Net
///
protected CallResult Deserialize(string data, bool checkObject = true, JsonSerializer serializer = null)
{
- try
- {
- return Deserialize(JToken.Parse(data), checkObject, serializer);
- }
- catch (JsonReaderException jre)
- {
- var info = $"Deserialize JsonReaderException: {jre.Message}, Path: {jre.Path}, LineNumber: {jre.LineNumber}, LinePosition: {jre.LinePosition}. Data: {data}";
- log.Write(LogVerbosity.Error, info);
- return new CallResult(default(T), new DeserializeError(info));
- }
- catch (JsonSerializationException jse)
- {
- var info = $"Deserialize JsonSerializationException: {jse.Message}. Data: {data}";
- log.Write(LogVerbosity.Error, info);
- return new CallResult(default(T), new DeserializeError(info));
- }
- catch (Exception ex)
- {
- var info = $"Deserialize Unknown Exception: {ex.Message}. Data: {data}";
- log.Write(LogVerbosity.Error, info);
- return new CallResult(default(T), new DeserializeError(info));
- }
+ var tokenResult = ValidateJson(data);
+ if(!tokenResult.Success)
+ return new CallResult(default(T), tokenResult.Error);
+ return Deserialize(tokenResult.Data, checkObject, serializer);
}
///
diff --git a/CryptoExchange.Net/RestClient.cs b/CryptoExchange.Net/RestClient.cs
index dd3f7d4..81cf8b6 100644
--- a/CryptoExchange.Net/RestClient.cs
+++ b/CryptoExchange.Net/RestClient.cs
@@ -13,8 +13,10 @@ using CryptoExchange.Net.Authentication;
using CryptoExchange.Net.Interfaces;
using CryptoExchange.Net.Logging;
using CryptoExchange.Net.Objects;
+using CryptoExchange.Net.RateLimiter;
using CryptoExchange.Net.Requests;
using Newtonsoft.Json;
+using Newtonsoft.Json.Linq;
namespace CryptoExchange.Net
{
@@ -158,7 +160,27 @@ namespace CryptoExchange.Net
log.Write(LogVerbosity.Debug, $"Sending {method}{(signed ? " signed" : "")} request to {request.Uri} {(paramString ?? "")}");
var result = await ExecuteRequest(request).ConfigureAwait(false);
- return result.Error != null ? new CallResult(null, result.Error) : Deserialize(result.Data, checkResult);
+ if(!result.Success)
+ return new CallResult(null, result.Error);
+
+ var jsonResult = ValidateJson(result.Data);
+ if(!jsonResult.Success)
+ return new CallResult(null, jsonResult.Error);
+
+ if (IsErrorResponse(jsonResult.Data))
+ return new CallResult(null, ParseErrorResponse(jsonResult.Data));
+
+ return Deserialize(jsonResult.Data, checkResult);
+ }
+
+ ///
+ /// Can be overridden to indicate if a response is an error response
+ ///
+ /// The received data
+ /// True if error response
+ protected virtual bool IsErrorResponse(JToken data)
+ {
+ return false;
}
///
@@ -304,9 +326,9 @@ namespace CryptoExchange.Net
///
/// The string the request returned
///
- protected virtual Error ParseErrorResponse(string error)
+ protected virtual Error ParseErrorResponse(JToken error)
{
- return new ServerError(error);
+ return new ServerError(error.ToString());
}
}
}