From e5e4b4c8b0cea12341f4dce6cec6de2939ac872e Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Sun, 31 May 2015 19:23:39 +0930 Subject: [PATCH] extracting all the cross-platform setup of HttpMessageHandler into a less awful class --- .../HttpClientAdapterTests.cs | 4 +- Octokit.Tests/Http/HttpClientAdapterTests.cs | 10 ++-- Octokit/GlobalSuppressions.cs | Bin 0 -> 1456 bytes Octokit/Http/Connection.cs | 2 +- Octokit/Http/HttpClientAdapter.cs | 52 ++---------------- Octokit/Http/HttpMessageHandlerFactory.cs | 36 ++++++++++++ Octokit/Octokit-Mono.csproj | 1 + Octokit/Octokit-MonoAndroid.csproj | 1 + Octokit/Octokit-Monotouch.csproj | 1 + Octokit/Octokit-Portable.csproj | 2 + Octokit/Octokit-netcore45.csproj | 3 +- Octokit/Octokit.csproj | 1 + 12 files changed, 56 insertions(+), 57 deletions(-) create mode 100644 Octokit/GlobalSuppressions.cs create mode 100644 Octokit/Http/HttpMessageHandlerFactory.cs 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 0000000000000000000000000000000000000000..ad01c3905d12936e96362e2b313a89899073306a GIT binary patch literal 1456 zcmaKsOK;Oq5QS%r#DB2Nrj=+4J5-591uE^LP?1y!p)TCiO-&Q0@}rPH4}52)mSaan zk#iq&X6DT6{{3@khnCpP?yRty-7V|Va&~cUxy|i{^R;dG|6prQk{?@X8Q2Yoz&6Md zTX9<;Yo6A`rqAh?ZnwgCqb%+6=~(MG@RCs z>6k9i6t+atv&cBrL?C{J=X}0nCqqYhufePxt5ZZOePw@z1=-2Kxd>55E> zwaz)(^Q~<3d}ba;hClfTcEg%QE;|2xrn`QTebsG2b{adtkE%1bd+sB1!AJG)>aH&7 zr9GSf^;q;!i}eOe^7;Vx=(mnty3=vVsOM7G>@vK~wP%sqne!WWZA(vBZX;#$@m7Q=3JC#@Gm3?wAL)6}=E}tDE UpWoPBTf9?>X`iU}?aE(|e_jy#OaK4? literal 0 HcmV?d00001 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 @@ +