From 26e1d148120a221dce9ba9871da4d05379e2f5f8 Mon Sep 17 00:00:00 2001 From: tidusjar Date: Wed, 6 Jul 2016 14:35:20 +0100 Subject: [PATCH] Better handling for #388 --- PlexRequests.Api/CouchPotatoApi.cs | 2 +- PlexRequests.Api/RetryHandler.cs | 132 ++++++++++++---------- PlexRequests.UI/Modules/RequestsModule.cs | 7 +- 3 files changed, 80 insertions(+), 61 deletions(-) diff --git a/PlexRequests.Api/CouchPotatoApi.cs b/PlexRequests.Api/CouchPotatoApi.cs index b7118185a..dd5f85d83 100644 --- a/PlexRequests.Api/CouchPotatoApi.cs +++ b/PlexRequests.Api/CouchPotatoApi.cs @@ -126,7 +126,7 @@ namespace PlexRequests.Api request.AddUrlSegment("apikey", apiKey); - var obj = RetryHandler.Execute(() => Api.Execute (request, url),null, + var obj = RetryHandler.Execute(() => Api.Execute (request, url),null, (exception, timespan) => Log.Error (exception, "Exception when calling GetProfiles for CP, Retrying {0}", timespan)); return obj; diff --git a/PlexRequests.Api/RetryHandler.cs b/PlexRequests.Api/RetryHandler.cs index c461b26e0..dc34f6f59 100644 --- a/PlexRequests.Api/RetryHandler.cs +++ b/PlexRequests.Api/RetryHandler.cs @@ -1,71 +1,89 @@ -using System; -using Polly.Retry; +#region Copyright +// /************************************************************************ +// Copyright (c) 2016 Jamie Rees +// File: RetryHandler.cs +// Created By: Jamie Rees +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// ************************************************************************/ +#endregion +using System; + using Polly; -using System.Threading.Tasks; +using Polly.Retry; namespace PlexRequests.Api { - public static class RetryHandler - { + public static class RetryHandler + { + private static readonly TimeSpan[] DefaultTime = { TimeSpan.FromSeconds(2), TimeSpan.FromSeconds(5), TimeSpan.FromSeconds(10) }; - private static readonly TimeSpan[] DefaultTime = new TimeSpan[] { - TimeSpan.FromSeconds (2), - TimeSpan.FromSeconds(5), - TimeSpan.FromSeconds(10)}; + public static T Execute(Func action, TimeSpan[] timeSpan) + { + var policy = RetryAndWaitPolicy(timeSpan); - public static RetryPolicy RetryAndWaitPolicy(TimeSpan[] timeSpan, Action action) - { - if(timeSpan == null) - { - timeSpan = DefaultTime; - } - var policy = Policy.Handle () - .WaitAndRetry(timeSpan, (e, ts) => action()); - - return policy; - } + return policy.Execute(action); + } - public static RetryPolicy RetryAndWaitPolicy(TimeSpan[] timeSpan) - { - if(timeSpan == null) - { - timeSpan = DefaultTime; - } - var policy = Policy.Handle () - .WaitAndRetry(timeSpan); + public static T Execute(Func func, TimeSpan[] timeSpan, Action action) + { + if (timeSpan == null) + { + timeSpan = DefaultTime; + } + var policy = RetryAndWaitPolicy(timeSpan, action); - return policy; - } + return policy.Execute(func); + } - public static RetryPolicy RetryAndWaitPolicy(TimeSpan[] timeSpan, Action action) - { - if(timeSpan == null) - { - timeSpan = DefaultTime; - } - var policy = Policy.Handle () - .WaitAndRetry(timeSpan, action); + public static RetryPolicy RetryAndWaitPolicy(TimeSpan[] timeSpan, Action action) + { + if (timeSpan == null) + { + timeSpan = DefaultTime; + } + var policy = Policy.Handle().WaitAndRetry(timeSpan, (e, ts) => action()); - return policy; - } - - public static T Execute(Func action, TimeSpan[] timeSpan) - { - var policy = RetryAndWaitPolicy (timeSpan); + return policy; + } - return policy.Execute (action); - } + public static RetryPolicy RetryAndWaitPolicy(TimeSpan[] timeSpan) + { + if (timeSpan == null) + { + timeSpan = DefaultTime; + } + var policy = Policy.Handle().WaitAndRetry(timeSpan); - public static T Execute(Func func, TimeSpan[] timeSpan, Action action) - { - if(timeSpan == null) - { - timeSpan = DefaultTime; - } - var policy = RetryAndWaitPolicy (timeSpan, action); + return policy; + } - return policy.Execute (func); - } - } -} + public static RetryPolicy RetryAndWaitPolicy(TimeSpan[] timeSpan, Action action) + { + if (timeSpan == null) + { + timeSpan = DefaultTime; + } + var policy = Policy.Handle().WaitAndRetry(timeSpan, action); + return policy; + } + } +} \ No newline at end of file diff --git a/PlexRequests.UI/Modules/RequestsModule.cs b/PlexRequests.UI/Modules/RequestsModule.cs index c538fa409..392243ffe 100644 --- a/PlexRequests.UI/Modules/RequestsModule.cs +++ b/PlexRequests.UI/Modules/RequestsModule.cs @@ -142,9 +142,10 @@ namespace PlexRequests.UI.Modules { return await Task.Run(() => CpApi.GetProfiles(cpSettings.FullUri, cpSettings.ApiKey)).ConfigureAwait(false); }); - - qualities = result.list.Select(x => new QualityModel() { Id = x._id, Name = x.label }).ToList(); - + if (result != null) + { + qualities = result.list.Select(x => new QualityModel { Id = x._id, Name = x.label }).ToList(); + } } catch (Exception e) {