Support custom Xamarin Android HttpClient handler
authorMarek Habersack <grendel@twistedcode.net>
Wed, 13 Apr 2016 07:12:08 +0000 (09:12 +0200)
committerMarek Habersack <grendel@twistedcode.net>
Tue, 19 Apr 2016 13:06:07 +0000 (15:06 +0200)
Make it possible to select a default System.Net.HttpClient handler
on Android. Selection of the handler is handled on the Xamarin Android
side.

mcs/class/System.Net.Http/Makefile
mcs/class/System.Net.Http/System.Net.Http/HttpClient.android.cs [new file with mode: 0644]
mcs/class/System.Net.Http/monodroid_System.Net.Http.dll.sources [new file with mode: 0644]

index bf1cbbd2799e04788e4554d8964bcdc757d54d64..9abcf2e80f62071ca0cf14a470dfaed396b3596a 100644 (file)
@@ -6,6 +6,9 @@ LIBRARY = System.Net.Http.dll
 
 LIB_REFS = System.Core System
 LIB_MCS_FLAGS = $(EXTRA_LIB_MCS_FLAGS)
+ifeq (monodroid,$(PROFILE))
+LIB_MCS_FLAGS += -d:XAMARIN_MODERN
+endif
 
 TEST_LIB_REFS = System System.Core
 TEST_MCS_FLAGS =
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
new file mode 100644 (file)
index 0000000..f48b49c
--- /dev/null
@@ -0,0 +1,38 @@
+using System;
+using System.Reflection;
+
+namespace System.Net.Http {
+       public partial class HttpClient {
+
+               public HttpClient ()
+                       : this (GetDefaultHandler (), true)
+               {
+               }
+
+               static HttpMessageHandler GetDefaultHandler ()
+               {
+                       Type type = Type.GetType("Android.Runtime.AndroidEnvironment, Mono.Android");
+                       if (type == null)
+                               return GetFallback ("Invalid Mono.Android assembly? Cannot find Android.Runtime.AndroidEnvironment");
+
+                       MethodInfo method = type.GetMethod ("GetHttpMessageHandler", BindingFlags.Static | BindingFlags.NonPublic);
+                       if (method == null)
+                               return GetFallback ("Your Xamarin.Android version does not support obtaining of the custom HttpClientHandler");
+
+                       object ret = method.Invoke (null, null);
+                       if (ret == null)
+                               return GetFallback ("Xamarin.Android returned no custom HttpClientHandler");
+
+                       var handler = ret as HttpMessageHandler;
+                       if (handler == null)
+                               return GetFallback ($"{ret?.GetType()} is not a valid HttpMessageHandler");
+                       return handler;
+               }
+
+               static HttpMessageHandler GetFallback (string message)
+               {
+                       Console.WriteLine (message + ". Defaulting to System.Net.Http.HttpClientHandler");
+                       return new HttpClientHandler ();
+               }
+       }
+}
diff --git a/mcs/class/System.Net.Http/monodroid_System.Net.Http.dll.sources b/mcs/class/System.Net.Http/monodroid_System.Net.Http.dll.sources
new file mode 100644 (file)
index 0000000..acaa6a3
--- /dev/null
@@ -0,0 +1,2 @@
+#include System.Net.Http.dll.sources
+System.Net.Http/HttpClient.android.cs