// System.Net.WebRequest
//
// Authors:
-// Lawrence Pit (loz@cable.a2000.nl)
+// Lawrence Pit (loz@cable.a2000.nl)
+// Marek Safar (marek.safar@gmail.com)
//
-
+// Copyright 2011 Xamarin Inc.
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
using System.Reflection;
using System.Runtime.Serialization;
using System.Globalization;
-#if NET_2_0
using System.Net.Configuration;
using System.Net.Security;
using System.Net.Cache;
using System.Security.Principal;
+#if NET_4_5
+using System.Threading.Tasks;
#endif
#if NET_2_1
namespace System.Net
{
-#if MOONLIGHT
- internal abstract class WebRequest : ISerializable {
-#else
[Serializable]
public abstract class WebRequest : MarshalByRefObject, ISerializable {
-#endif
static HybridDictionary prefixes = new HybridDictionary ();
-#if NET_2_0
static bool isDefaultWebProxySet;
static IWebProxy defaultWebProxy;
static RequestCachePolicy defaultCachePolicy;
- static MethodInfo cfGetDefaultProxy;
-#endif
-
- // Constructors
-
+
static WebRequest ()
{
- if (Platform.IsMacOS) {
-#if MONOTOUCH
- Type type = Type.GetType ("MonoTouch.CoreFoundation.CFNetwork, monotouch");
-#else
- Type type = Type.GetType ("MonoMac.CoreFoundation.CFNetwork, monomac");
-#endif
- if (type != null)
- cfGetDefaultProxy = type.GetMethod ("GetDefaultProxy");
- }
-
-#if NET_2_1
- AddPrefix ("http", typeof (HttpRequestCreator));
- AddPrefix ("https", typeof (HttpRequestCreator));
- #if MOBILE
- AddPrefix ("file", typeof (FileWebRequestCreator));
- AddPrefix ("ftp", typeof (FtpRequestCreator));
- #endif
+#if MOBILE
+ IWebRequestCreate http = new HttpRequestCreator ();
+ RegisterPrefix ("http", http);
+ RegisterPrefix ("https", http);
+ RegisterPrefix ("file", new FileWebRequestCreator ());
+ RegisterPrefix ("ftp", new FtpRequestCreator ());
#else
- #if NET_2_0
- defaultCachePolicy = new HttpRequestCachePolicy (HttpRequestCacheLevel.NoCacheNoStore);
- #endif
- #if NET_2_0 && CONFIGURATION_DEP
+ #if CONFIGURATION_DEP
object cfg = ConfigurationManager.GetSection ("system.net/webRequestModules");
WebRequestModulesSection s = cfg as WebRequestModulesSection;
if (s != null) {
protected WebRequest (SerializationInfo serializationInfo, StreamingContext streamingContext)
{
-#if ONLY_1_1
- throw GetMustImplement ();
-#endif
}
static Exception GetMustImplement ()
// Properties
-#if NET_2_0
private AuthenticationLevel authentication_level = AuthenticationLevel.MutualAuthRequested;
public AuthenticationLevel AuthenticationLevel
authentication_level = value;
}
}
-
- [MonoTODO ("Implement the caching system. Currently always returns a policy with the NoCacheNoStore level")]
- public virtual RequestCachePolicy CachePolicy
- {
- get { return DefaultCachePolicy; }
- set {
- }
- }
-#endif
public virtual string ConnectionGroupName {
get { throw GetMustImplement (); }
set { throw GetMustImplement (); }
}
-#if NET_2_0
- public static RequestCachePolicy DefaultCachePolicy
+ [MonoTODO ("Implement the caching system. Currently always returns a policy with the NoCacheNoStore level")]
+ public virtual RequestCachePolicy CachePolicy
{
- get { return defaultCachePolicy; }
+ get { return DefaultCachePolicy; }
+ set {
+ }
+ }
+
+ public static RequestCachePolicy DefaultCachePolicy {
+ get {
+ return defaultCachePolicy ?? (defaultCachePolicy = new HttpRequestCachePolicy (HttpRequestCacheLevel.NoCacheNoStore));
+ }
set {
throw GetMustImplement ();
}
}
-#endif
public virtual WebHeaderCollection Headers {
get { throw GetMustImplement (); }
set { throw GetMustImplement (); }
}
-#if NET_2_0 && !MOONLIGHT
- public TokenImpersonationLevel ImpersonationLevel {
- get { throw GetMustImplement (); }
- set { throw GetMustImplement (); }
- }
-#endif
+
public virtual string Method {
get { throw GetMustImplement (); }
set { throw GetMustImplement (); }
set { throw GetMustImplement (); }
}
-#if NET_2_0
public virtual bool UseDefaultCredentials
{
get {
throw GetMustImplement ();
}
}
-
+
+ public TokenImpersonationLevel ImpersonationLevel { get; set; }
+
// volatile static IWebProxy proxy;
static readonly object lockobj = new object ();
[MonoTODO("Needs to respect Module, Proxy.AutoDetect, and Proxy.ScriptLocation config settings")]
static IWebProxy GetDefaultWebProxy ()
{
- WebProxy p = null;
-
#if CONFIGURATION_DEP
DefaultProxySection sec = ConfigurationManager.GetSection ("system.net/defaultProxy") as DefaultProxySection;
+ WebProxy p;
+
if (sec == null)
return GetSystemWebProxy ();
ProxyElement pe = sec.Proxy;
- if ((pe.UseSystemDefault != ProxyElement.UseSystemDefaultValues.False) && (pe.ProxyAddress == null))
- p = (WebProxy) GetSystemWebProxy ();
- else
+ if ((pe.UseSystemDefault != ProxyElement.UseSystemDefaultValues.False) && (pe.ProxyAddress == null)) {
+ IWebProxy proxy = GetSystemWebProxy ();
+
+ if (!(proxy is WebProxy))
+ return proxy;
+
+ p = (WebProxy) proxy;
+ } else
p = new WebProxy ();
if (pe.ProxyAddress != null)
if (pe.BypassOnLocal != ProxyElement.BypassOnLocalValues.Unspecified)
p.BypassProxyOnLocal = (pe.BypassOnLocal == ProxyElement.BypassOnLocalValues.True);
-#endif
+
+ foreach(BypassElement elem in sec.BypassList)
+ p.BypassArrayList.Add(elem.Address);
+
return p;
- }
+#else
+ return GetSystemWebProxy ();
#endif
+ }
// Methods
throw new ArgumentNullException ("requestUri");
return GetCreator (requestUri.Scheme).Create (requestUri);
}
-
+#if NET_4_0
+ [MonoTODO ("for portable library support")]
+ public static HttpWebRequest CreateHttp (string requestUriString)
+ {
+ throw new NotImplementedException ();
+ }
+
+ [MonoTODO ("for portable library support")]
+ public static HttpWebRequest CreateHttp (Uri requestUri)
+ {
+ throw new NotImplementedException ();
+ }
+#endif
public virtual Stream EndGetRequestStream (IAsyncResult asyncResult)
{
throw GetMustImplement ();
throw GetMustImplement ();
}
-#if NET_2_0
[MonoTODO("Look in other places for proxy config info")]
public static IWebProxy GetSystemWebProxy ()
{
- string address = Environment.GetEnvironmentVariable ("http_proxy");
- if (address == null)
- address = Environment.GetEnvironmentVariable ("HTTP_PROXY");
+#if MONOTOUCH
+ return CFNetwork.GetDefaultProxy ();
+#else
+#if MONODROID
+ // Return the system web proxy. This only works for ICS+.
+ var androidProxy = AndroidPlatform.GetDefaultProxy ();
+ if (androidProxy != null)
+ return androidProxy;
+#endif
+#if !NET_2_1
+ if (IsWindows ()) {
+ int iProxyEnable = (int)Microsoft.Win32.Registry.GetValue ("HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings", "ProxyEnable", 0);
+
+ if (iProxyEnable > 0) {
+ string strHttpProxy = "";
+ bool bBypassOnLocal = false;
+ ArrayList al = new ArrayList ();
+
+ string strProxyServer = (string)Microsoft.Win32.Registry.GetValue ("HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings", "ProxyServer", null);
+ string strProxyOverrride = (string)Microsoft.Win32.Registry.GetValue ("HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings", "ProxyOverride", null);
+
+ if (strProxyServer.Contains ("=")) {
+ foreach (string strEntry in strProxyServer.Split (new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries))
+ if (strEntry.StartsWith ("http=")) {
+ strHttpProxy = strEntry.Substring (5);
+ break;
+ }
+ } else strHttpProxy = strProxyServer;
+
+ if (strProxyOverrride != null) {
+ string[] bypassList = strProxyOverrride.Split (new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries);
+
+ foreach (string str in bypassList) {
+ if (str != "<local>")
+ al.Add (str);
+ else
+ bBypassOnLocal = true;
+ }
+ }
+
+ return new WebProxy (strHttpProxy, bBypassOnLocal, al.ToArray (typeof(string)) as string[]);
+ }
+ } else {
+#endif
+ if (Platform.IsMacOS)
+ return CFNetwork.GetDefaultProxy ();
+
+ string address = Environment.GetEnvironmentVariable ("http_proxy");
- if (address != null) {
- try {
- if (!address.StartsWith ("http://"))
- address = "http://" + address;
- Uri uri = new Uri (address);
- IPAddress ip;
- if (IPAddress.TryParse (uri.Host, out ip)) {
- if (IPAddress.Any.Equals (ip)) {
- UriBuilder builder = new UriBuilder (uri);
- builder.Host = "127.0.0.1";
- uri = builder.Uri;
- } else if (IPAddress.IPv6Any.Equals (ip)) {
- UriBuilder builder = new UriBuilder (uri);
- builder.Host = "[::1]";
- uri = builder.Uri;
+ if (address == null)
+ address = Environment.GetEnvironmentVariable ("HTTP_PROXY");
+
+ if (address != null) {
+ try {
+ if (!address.StartsWith ("http://"))
+ address = "http://" + address;
+
+ Uri uri = new Uri (address);
+ IPAddress ip;
+
+ if (IPAddress.TryParse (uri.Host, out ip)) {
+ if (IPAddress.Any.Equals (ip)) {
+ UriBuilder builder = new UriBuilder (uri);
+ builder.Host = "127.0.0.1";
+ uri = builder.Uri;
+ } else if (IPAddress.IPv6Any.Equals (ip)) {
+ UriBuilder builder = new UriBuilder (uri);
+ builder.Host = "[::1]";
+ uri = builder.Uri;
+ }
+ }
+
+ bool bBypassOnLocal = false;
+ ArrayList al = new ArrayList ();
+ string bypass = Environment.GetEnvironmentVariable ("no_proxy");
+
+ if (bypass == null)
+ bypass = Environment.GetEnvironmentVariable ("NO_PROXY");
+
+ if (bypass != null) {
+ string[] bypassList = bypass.Split (new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
+
+ foreach (string str in bypassList) {
+ if (str != "*.local")
+ al.Add (str);
+ else
+ bBypassOnLocal = true;
+ }
}
+
+ return new WebProxy (uri, bBypassOnLocal, al.ToArray (typeof(string)) as string[]);
+ } catch (UriFormatException) {
}
- return new WebProxy (uri);
- } catch (UriFormatException) { }
+ }
+#if !NET_2_1
}
-
- if (cfGetDefaultProxy != null)
- return (IWebProxy) cfGetDefaultProxy.Invoke (null, null);
+#endif
return new WebProxy ();
+#endif // MONOTOUCH
}
-#endif
- void ISerializable.GetObjectData
- (SerializationInfo serializationInfo,
- StreamingContext streamingContext)
+ void ISerializable.GetObjectData (SerializationInfo serializationInfo, StreamingContext streamingContext)
{
throw new NotSupportedException ();
}
-
-#if NET_2_0
protected virtual void GetObjectData (SerializationInfo serializationInfo, StreamingContext streamingContext)
{
throw GetMustImplement ();
}
-#endif
public static bool RegisterPrefix (string prefix, IWebRequestCreate creator)
{
return creator;
}
+
+ internal static bool IsWindows ()
+ {
+ return (int) Environment.OSVersion.Platform < 4;
+ }
internal static void ClearPrefixes ()
{
object o = Activator.CreateInstance (type, true);
prefixes [prefix] = o;
}
+
+#if NET_4_5
+ public virtual Task<Stream> GetRequestStreamAsync ()
+ {
+ return Task<Stream>.Factory.FromAsync (BeginGetRequestStream, EndGetRequestStream, null);
+ }
+
+ public virtual Task<WebResponse> GetResponseAsync ()
+ {
+ return Task<WebResponse>.Factory.FromAsync (BeginGetResponse, EndGetResponse, null);
+ }
+#endif
+
}
}
-