From 8a4e8403d24d13877f8bcb3b75a68697abecbf18 Mon Sep 17 00:00:00 2001 From: JKorf Date: Mon, 3 Dec 2018 16:11:06 +0100 Subject: [PATCH] Seperated validate json call, error parsing now receive JToken --- .../TestImplementations/TestRestClient.cs | 5 +- CryptoExchange.Net/BaseClient.cs | 57 ++++++++++++------- CryptoExchange.Net/RestClient.cs | 28 ++++++++- 3 files changed, 62 insertions(+), 28 deletions(-) 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()); } } }