diff --git a/Octokit.Tests.Integration/HttpClientAdapterTests.cs b/Octokit.Tests.Integration/HttpClientAdapterTests.cs index bf4a0fb4..d1b1eb8d 100644 --- a/Octokit.Tests.Integration/HttpClientAdapterTests.cs +++ b/Octokit.Tests.Integration/HttpClientAdapterTests.cs @@ -14,7 +14,7 @@ public class HttpClientAdapterTests [IntegrationTest] public async Task CanDownloadImage() { - var httpClient = new HttpClientAdapter(); + var httpClient = new HttpClientAdapter(HttpMessageHandlerFactory.GetHandler); var request = new Request { BaseAddress = new Uri("https://github.global.ssl.fastly.net/", UriKind.Absolute), @@ -36,7 +36,7 @@ public class HttpClientAdapterTests [IntegrationTest] public async Task CanCancelARequest() { - var httpClient = new HttpClientAdapter(); + var httpClient = new HttpClientAdapter(HttpMessageHandlerFactory.GetHandler); var request = new Request { BaseAddress = new Uri("https://github.global.ssl.fastly.net/", UriKind.Absolute), diff --git a/Octokit.Tests/Http/HttpClientAdapterTests.cs b/Octokit.Tests/Http/HttpClientAdapterTests.cs index a9542cfc..7e77dc91 100644 --- a/Octokit.Tests/Http/HttpClientAdapterTests.cs +++ b/Octokit.Tests/Http/HttpClientAdapterTests.cs @@ -178,6 +178,11 @@ namespace Octokit.Tests.Http sealed class HttpClientAdapterTester : HttpClientAdapter { + public HttpClientAdapterTester() + : base (HttpMessageHandlerFactory.GetHandler) + { + } + public HttpRequestMessage BuildRequestMessageTester(IRequest request) { return BuildRequestMessage(request); @@ -187,11 +192,6 @@ namespace Octokit.Tests.Http { return await BuildResponse(responseMessage); } - - protected override HttpClientHandler GetHandler() - { - return new HttpClientHandler(); - } } } diff --git a/Octokit/GlobalSuppressions.cs b/Octokit/GlobalSuppressions.cs new file mode 100644 index 00000000..ad01c390 Binary files /dev/null and b/Octokit/GlobalSuppressions.cs differ diff --git a/Octokit/Http/Connection.cs b/Octokit/Http/Connection.cs index 39aec59b..3176aff7 100644 --- a/Octokit/Http/Connection.cs +++ b/Octokit/Http/Connection.cs @@ -92,7 +92,7 @@ namespace Octokit /// Provides credentials to the client when making requests [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Reliability", "CA2000:Dispose objects before losing scope")] public Connection(ProductHeaderValue productInformation, Uri baseAddress, ICredentialStore credentialStore) - : this(productInformation, baseAddress, credentialStore, new HttpClientAdapter(), new SimpleJsonSerializer()) + : this(productInformation, baseAddress, credentialStore, new HttpClientAdapter(HttpMessageHandlerFactory.GetHandler), new SimpleJsonSerializer()) { } diff --git a/Octokit/Http/HttpClientAdapter.cs b/Octokit/Http/HttpClientAdapter.cs index ed07dc9d..e394d96c 100644 --- a/Octokit/Http/HttpClientAdapter.cs +++ b/Octokit/Http/HttpClientAdapter.cs @@ -18,40 +18,18 @@ namespace Octokit.Internal /// public class HttpClientAdapter : IHttpClient { -#if !PORTABLE - readonly IWebProxy _webProxy; -#endif readonly HttpClient _http; [SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")] [SuppressMessage("Microsoft.Reliability", "CA2000:Dispose objects before losing scope")] - public HttpClientAdapter() + public HttpClientAdapter(Func getHandler) { - var handler = GetHandler(); + Ensure.ArgumentNotNull(getHandler, "getHandler"); + + var handler = getHandler(); _http = new HttpClient(new RedirectHandler { InnerHandler = handler }); } -#if !PORTABLE - [SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")] - [SuppressMessage("Microsoft.Reliability", "CA2000:Dispose objects before losing scope")] - public HttpClientAdapter(IWebProxy webProxy) - { - _webProxy = webProxy; - var handler = GetHandler(); - _http = new HttpClient(new RedirectHandler { InnerHandler = handler }); - } - - [SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")] - [SuppressMessage("Microsoft.Reliability", "CA2000:Dispose objects before losing scope")] - public HttpClientAdapter(IWebProxy webProxy, HttpMessageHandler handler) - { - Ensure.ArgumentNotNull(handler, "handler"); - - _webProxy = webProxy; - _http = new HttpClient(new RedirectHandler { InnerHandler = handler}); - } -#endif - /// /// Sends the specified request and returns a response. /// @@ -89,28 +67,6 @@ namespace Octokit.Internal return cancellationTokenForRequest; } - [SuppressMessage("Microsoft.Design", "CA1024:UsePropertiesWhereAppropriate")] - [SuppressMessage("Microsoft.Reliability", "CA2000:Dispose objects before losing scope")] - protected virtual HttpClientHandler GetHandler() - { - var httpOptions = new HttpClientHandler - { - AllowAutoRedirect = false - }; -#if !PORTABLE - if (httpOptions.SupportsAutomaticDecompression) - { - httpOptions.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate; - } - if (httpOptions.SupportsProxy && _webProxy != null) - { - httpOptions.UseProxy = true; - httpOptions.Proxy = _webProxy; - } -#endif - return httpOptions; - } - protected async virtual Task BuildResponse(HttpResponseMessage responseMessage) { Ensure.ArgumentNotNull(responseMessage, "responseMessage"); diff --git a/Octokit/Http/HttpMessageHandlerFactory.cs b/Octokit/Http/HttpMessageHandlerFactory.cs new file mode 100644 index 00000000..3223a38f --- /dev/null +++ b/Octokit/Http/HttpMessageHandlerFactory.cs @@ -0,0 +1,36 @@ +using System.Diagnostics.CodeAnalysis; +using System.Net; +using System.Net.Http; + +namespace Octokit.Internal +{ + public static class HttpMessageHandlerFactory + { + [SuppressMessage("Microsoft.Reliability", "CA2000:Dispose objects before losing scope")] + public static HttpClientHandler GetHandler() + { + return GetHandler(null); + } + + [SuppressMessage("Microsoft.Reliability", "CA2000:Dispose objects before losing scope")] + public static HttpClientHandler GetHandler(IWebProxy proxy) + { + var handler = new HttpClientHandler + { + AllowAutoRedirect = false + }; +#if !PORTABLE + if (handler.SupportsAutomaticDecompression) + { + handler.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate; + } + if (handler.SupportsProxy && proxy != null) + { + handler.UseProxy = true; + handler.Proxy = proxy; + } +#endif + return handler; + } + } +} diff --git a/Octokit/Octokit-Mono.csproj b/Octokit/Octokit-Mono.csproj index 4d049e80..5e45258c 100644 --- a/Octokit/Octokit-Mono.csproj +++ b/Octokit/Octokit-Mono.csproj @@ -393,6 +393,7 @@ + \ No newline at end of file diff --git a/Octokit/Octokit-MonoAndroid.csproj b/Octokit/Octokit-MonoAndroid.csproj index 4a1ca1f5..fc48cd45 100644 --- a/Octokit/Octokit-MonoAndroid.csproj +++ b/Octokit/Octokit-MonoAndroid.csproj @@ -409,6 +409,7 @@ + \ No newline at end of file diff --git a/Octokit/Octokit-Monotouch.csproj b/Octokit/Octokit-Monotouch.csproj index d306f674..4fd43be3 100644 --- a/Octokit/Octokit-Monotouch.csproj +++ b/Octokit/Octokit-Monotouch.csproj @@ -402,6 +402,7 @@ + diff --git a/Octokit/Octokit-Portable.csproj b/Octokit/Octokit-Portable.csproj index 30be17bc..623668b1 100644 --- a/Octokit/Octokit-Portable.csproj +++ b/Octokit/Octokit-Portable.csproj @@ -128,6 +128,7 @@ + @@ -391,6 +392,7 @@ + diff --git a/Octokit/Octokit-netcore45.csproj b/Octokit/Octokit-netcore45.csproj index 38e80b1a..6936868e 100644 --- a/Octokit/Octokit-netcore45.csproj +++ b/Octokit/Octokit-netcore45.csproj @@ -395,6 +395,7 @@ + @@ -410,4 +411,4 @@ --> - + \ No newline at end of file diff --git a/Octokit/Octokit.csproj b/Octokit/Octokit.csproj index a3cac0ad..6815ffa1 100644 --- a/Octokit/Octokit.csproj +++ b/Octokit/Octokit.csproj @@ -81,6 +81,7 @@ +