diff options
author | monojenkins <jo.shields+jenkins@xamarin.com> | 2020-02-18 15:54:54 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-02-18 15:54:54 +0300 |
commit | 5070e45d54b1542e8d6b52b94c05069a8620325b (patch) | |
tree | 8600efdf869937afd611601d186f832d97ea92e7 /mcs/class | |
parent | 8f348378ec2c494e063f4ee129fac55dc75b9af3 (diff) |
[2020-02] Make MonoWebRequestHandler linker friendly (#18834)
* Make MonoWebRequestHandler linker friendly
* Make MonoWebRequestHandler's ctor public (to be able to use in Activator.CreateInstance without binding flags)
* Remove Console.WriteLine from system.net.http
Co-authored-by: Egor Bogatov <egorbo@gmail.com>
Diffstat (limited to 'mcs/class')
3 files changed, 20 insertions, 15 deletions
diff --git a/mcs/class/System.Net.Http/HttpClientHandler.SocketsHandler.Android.cs b/mcs/class/System.Net.Http/HttpClientHandler.SocketsHandler.Android.cs index c483c28f03b..9b4fadc19f1 100644 --- a/mcs/class/System.Net.Http/HttpClientHandler.SocketsHandler.Android.cs +++ b/mcs/class/System.Net.Http/HttpClientHandler.SocketsHandler.Android.cs @@ -1,3 +1,5 @@ +using System.Reflection; + namespace System.Net.Http { partial class HttpClientHandler : HttpMessageHandler @@ -6,7 +8,12 @@ namespace System.Net.Http { string envvar = Environment.GetEnvironmentVariable ("XA_HTTP_CLIENT_HANDLER_TYPE")?.Trim (); if (envvar?.StartsWith("System.Net.Http.MonoWebRequestHandler", StringComparison.InvariantCulture) == true) - return new MonoWebRequestHandler (); + { + Type monoWrhType = Type.GetType (envvar, false); + if (monoWrhType != null) + return (IMonoHttpClientHandler) Activator.CreateInstance (monoWrhType); + } + // Ignore other types of handlers here (e.g. AndroidHttpHandler) to keep the old behavior // and always create SocketsHttpHandler for code like this if MonoWebRequestHandler was not specified: // diff --git a/mcs/class/System.Net.Http/MonoWebRequestHandler.cs b/mcs/class/System.Net.Http/MonoWebRequestHandler.cs index 023343f01f4..27c904adfdf 100644 --- a/mcs/class/System.Net.Http/MonoWebRequestHandler.cs +++ b/mcs/class/System.Net.Http/MonoWebRequestHandler.cs @@ -70,7 +70,7 @@ namespace System.Net.Http TimeSpan? timeout; bool disposed; - internal MonoWebRequestHandler () + public MonoWebRequestHandler () { allowAutoRedirect = true; maxAutomaticRedirections = 50; diff --git a/mcs/class/System.Net.Http/System.Net.Http/HttpClient.android.cs b/mcs/class/System.Net.Http/System.Net.Http/HttpClient.android.cs index 9b899bcffd8..8ea04ac4880 100644 --- a/mcs/class/System.Net.Http/System.Net.Http/HttpClient.android.cs +++ b/mcs/class/System.Net.Http/System.Net.Http/HttpClient.android.cs @@ -11,10 +11,16 @@ namespace System.Net.Http { string envvar = Environment.GetEnvironmentVariable ("XA_HTTP_CLIENT_HANDLER_TYPE")?.Trim (); if (string.IsNullOrEmpty (envvar)) - return GetFallback ($"XA_HTTP_CLIENT_HANDLER_TYPE is empty"); + return new HttpClientHandler (); - if (envvar?.StartsWith("System.Net.Http.MonoWebRequestHandler", StringComparison.InvariantCulture) == true) - return new HttpClientHandler (new MonoWebRequestHandler ()); + if (envvar?.StartsWith ("System.Net.Http.MonoWebRequestHandler", StringComparison.InvariantCulture) == true) + { + Type monoWrhType = Type.GetType (envvar, false); + if (monoWrhType != null) + return new HttpClientHandler ((IMonoHttpClientHandler) Activator.CreateInstance (monoWrhType)); + + return new HttpClientHandler (); + } Type handlerType = Type.GetType (envvar, false); if (handlerType == null && !envvar.Contains (", ")) @@ -25,19 +31,11 @@ namespace System.Net.Http { } if (handlerType == null) - return GetFallback ($"'{envvar}' type was not found"); - - object handlerObj = Activator.CreateInstance (handlerType); + return new HttpClientHandler (); - if (handlerObj is HttpMessageHandler msgHandler) + if (Activator.CreateInstance (handlerType) is HttpMessageHandler msgHandler) return msgHandler; - return GetFallback ($"{handlerObj?.GetType ()} is not a valid HttpMessageHandler or MonoWebRequestHandler"); - } - - static HttpMessageHandler GetFallback (string message) - { - Console.WriteLine (message + ". Defaulting to System.Net.Http.HttpClientHandler"); return new HttpClientHandler (); } } |