Index: Src/GoogleApis/Apis/Http/ExponentialBackOffInitializer.cs =================================================================== new file mode 100644 --- /dev/null +++ b/Src/GoogleApis/Apis/Http/ExponentialBackOffInitializer.cs @@ -0,0 +1,75 @@ +/* +Copyright 2013 Google Inc + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace Google.Apis.Http +{ + /// + /// Indicates if exponential back-off is used automatically on exceptions in a service requests and\or when 503 + /// responses is returned form the server. + /// + [Flags] + public enum ExponentialBackOffPolicy + { + None = 0, + Exception = 1, + UnsuccessfulResponse503 = 2 + } + + /// + /// An initializer which adds exponential back-off as exception handler and\or unsuccessful response handler by + /// the given . + /// + public class ExponentialBackOffInitializer : IConfigurableHttpClientInitializer + { + /// Gets or sets the used back-off policy. + private ExponentialBackOffPolicy Policy { get; set; } + + /// Gets or sets the back-off handler creation function. + private Func CreateBackOff { get; set; } + + /// + /// Constructs a new back-off initializer with the given policy and back-off handler create function. + /// + public ExponentialBackOffInitializer(ExponentialBackOffPolicy policy, Func createBackOff) + { + Policy = policy; + CreateBackOff = createBackOff; + } + + public void Initialize(ConfigurableHttpClient httpClient) + { + var backOff = CreateBackOff(); + + // Add exception handler and\or unsuccessful response handler. + if ((Policy & ExponentialBackOffPolicy.Exception) == ExponentialBackOffPolicy.Exception) + { + httpClient.MessageHandler.ExceptionHandlers.Add(backOff); + } + + if ((Policy & ExponentialBackOffPolicy.UnsuccessfulResponse503) == + ExponentialBackOffPolicy.UnsuccessfulResponse503) + { + httpClient.MessageHandler.UnsuccessfulResponseHandlers.Add(backOff); + } + } + } + +}