From b851cde9575a8bdf3e6d839fa77f4277e17a9712 Mon Sep 17 00:00:00 2001 From: Martin Lee Date: Sun, 12 Apr 2020 18:01:14 +0100 Subject: [PATCH] Throw exceptions instead of trying to recover --- BritishHorseRacingApi/ApiClient.cs | 29 ++++++++++--------- BritishHorseRacingApi/ApiResponseException.cs | 25 ++++++++++++++++ 2 files changed, 40 insertions(+), 14 deletions(-) create mode 100644 BritishHorseRacingApi/ApiResponseException.cs diff --git a/BritishHorseRacingApi/ApiClient.cs b/BritishHorseRacingApi/ApiClient.cs index 3047f07..e2e0b66 100644 --- a/BritishHorseRacingApi/ApiClient.cs +++ b/BritishHorseRacingApi/ApiClient.cs @@ -47,11 +47,11 @@ namespace BritishHorseRacingApi var response = await _client.SendAsync(message); if (!response.IsSuccessStatusCode) { - throw new Exception("Token not retrieved"); + throw new ApiResponseException("Token not retrieved:" + response.Content); } var content = response.Content; - while (content.StartsWith("<") || content.StartsWith("Error: \"Failed to connect")) + if (content.StartsWith("<") || content.StartsWith("Error: \"Failed to connect")) { await Task.Delay(TimeSpan.FromSeconds(_waitTimeAfterFail)); if (content.StartsWith("<")) @@ -64,10 +64,9 @@ namespace BritishHorseRacingApi } response = await _client.SendAsync(message); content = response.Content; - if (content.StartsWith("Error: \"Failed to connect")) + if (content.StartsWith("<") || content.StartsWith("Error: \"Failed to connect")) { - await Task.Delay(TimeSpan.FromSeconds(30)); - Trace.WriteLine("Waiting after conntect fail"); + throw new ApiResponseException("Failed to get token. Response: " + content); } } @@ -262,16 +261,18 @@ namespace BritishHorseRacingApi } var content = response.Content; - while (content.StartsWith("<") || content.StartsWith("Error: \"Failed to connect")) + if(content.StartsWith("<") || content.StartsWith("Error: \"Failed to connect")) { Trace.WriteLine("Content not valid requerying. Content: "+ content); - if (!content.StartsWith("<")) - { - await Task.Delay(TimeSpan.FromSeconds(30)); - response = await SendRequest(endpoint); - content = response.Content; - continue; - } + await Task.Delay(TimeSpan.FromSeconds(_waitTimeAfterFail)); + + if (content.StartsWith("<")) + await GetNewToken(); + + response = await SendRequest(endpoint); + content = response.Content; + if (content.StartsWith("<") || content.StartsWith("Error: \"Failed to connect")) + throw new ApiResponseException($"Error in response: {content}"); await Task.Delay(TimeSpan.FromSeconds(_waitTimeAfterFail)); await GetNewToken(); @@ -285,7 +286,7 @@ namespace BritishHorseRacingApi if (!response.IsSuccessStatusCode) { - throw new Exception($"Unexpected error: {content}" ); + throw new ApiResponseException($"Unexpected error: {content}" ); } if(preDeserilizationValidation != null && !preDeserilizationValidation(JToken.Parse(content))) diff --git a/BritishHorseRacingApi/ApiResponseException.cs b/BritishHorseRacingApi/ApiResponseException.cs new file mode 100644 index 0000000..1345bf5 --- /dev/null +++ b/BritishHorseRacingApi/ApiResponseException.cs @@ -0,0 +1,25 @@ +using System; +using System.Runtime.Serialization; + +namespace BritishHorseRacingApi +{ + [Serializable] + internal class ApiResponseException : Exception + { + public ApiResponseException() + { + } + + public ApiResponseException(string message) : base(message) + { + } + + public ApiResponseException(string message, Exception innerException) : base(message, innerException) + { + } + + protected ApiResponseException(SerializationInfo info, StreamingContext context) : base(info, context) + { + } + } +} \ No newline at end of file