[runtime] Replace pedump boehm dependency with sgen dependency
[mono.git] / mcs / class / System / System.Net / WebProxy.cs
index b0299575f60577be5e7f896e8113e929d99bd015..365535a056bb4b561f1eb55aef21e100c4da2305 100644 (file)
@@ -1,10 +1,10 @@
-//\r
-// System.Net.WebProxy.cs\r
-//\r
-// Authors:\r
+//
+// System.Net.WebProxy.cs
+//
+// Authors:
 //   Lawrence Pit (loz@cable.a2000.nl)
-//   Andreas Nahr (ClassDevelopment@A-SoftTech.com)\r
-//\r
+//   Andreas Nahr (ClassDevelopment@A-SoftTech.com)
+//
 
 //
 // Permission is hereby granted, free of charge, to any person obtaining
 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
-\r
-using System;\r
-using System.Collections;\r
-using System.Runtime.Serialization;\r
-using System.Text.RegularExpressions;\r
-\r
-namespace System.Net \r
-{\r
-       [Serializable]\r
-       public class WebProxy : IWebProxy, ISerializable\r
-       {               \r
-               private Uri address;\r
-               private bool bypassOnLocal;\r
-               private ArrayList bypassList;\r
-               private ICredentials credentials;\r
-       \r
-               // Constructors\r
-       \r
-               public WebProxy () \r
-                       : this ((Uri) null, false, null, null) {}\r
-               \r
-               public WebProxy (string address) \r
-                       : this (ToUri (address), false, null, null) {}\r
-               \r
-               public WebProxy (Uri address) \r
-                       : this (address, false, null, null) {}\r
-               \r
-               public WebProxy (string address, bool bypassOnLocal) \r
-                       : this (ToUri (address), bypassOnLocal, null, null) {}\r
-               \r
-               public WebProxy (string host, int port)\r
-                       : this (new Uri ("http://" + host + ":" + port)) {}\r
-               \r
-               public WebProxy (Uri address, bool bypassOnLocal)\r
-                       : this (address, bypassOnLocal, null, null) {}\r
-\r
-               public WebProxy (string address, bool bypassOnLocal, string [] bypassList)\r
-                       : this (ToUri (address), bypassOnLocal, bypassList, null) {}\r
-\r
-               public WebProxy (Uri address, bool bypassOnLocal, string [] bypassList)\r
-                       : this (address, bypassOnLocal, bypassList, null) {}\r
-               \r
-               public WebProxy (string address, bool bypassOnLocal,\r
-                                string[] bypassList, ICredentials credentials)\r
-                       : this (ToUri (address), bypassOnLocal, bypassList, null) {}\r
-\r
-               public WebProxy (Uri address, bool bypassOnLocal, \r
-                                string[] bypassList, ICredentials credentials)\r
-               {\r
-                       this.address = address;\r
-                       this.bypassOnLocal = bypassOnLocal;\r
-                       if (bypassList == null)\r
-                               bypassList = new string [] {};\r
-                       this.bypassList = new ArrayList (bypassList);\r
-                       this.credentials = credentials;\r
-                       CheckBypassList ();\r
-               }\r
-               \r
-               protected WebProxy (SerializationInfo serializationInfo, StreamingContext streamingContext) \r
+
+using System;
+using System.Collections;
+using System.Globalization;
+using System.Runtime.Serialization;
+using System.Text.RegularExpressions;
+
+namespace System.Net 
+{
+       [Serializable]
+       public class WebProxy : IWebProxy, ISerializable
+       {
+               Uri address;
+               bool bypassOnLocal;
+               ArrayList bypassList;
+               ICredentials credentials;
+               bool useDefaultCredentials;
+
+               // Constructors
+
+               public WebProxy ()
+                       : this ((Uri) null, false, null, null) {}
+
+               public WebProxy (string address)
+                       : this (ToUri (address), false, null, null) {}
+
+               public WebProxy (Uri address) 
+                       : this (address, false, null, null) {}
+
+               public WebProxy (string address, bool bypassOnLocal) 
+                       : this (ToUri (address), bypassOnLocal, null, null) {}
+
+               public WebProxy (string host, int port)
+                       : this (new Uri ("http://" + host + ":" + port)) {}
+
+               public WebProxy (Uri address, bool bypassOnLocal)
+                       : this (address, bypassOnLocal, null, null) {}
+
+               public WebProxy (string address, bool bypassOnLocal, string [] bypassList)
+                       : this (ToUri (address), bypassOnLocal, bypassList, null) {}
+
+               public WebProxy (Uri address, bool bypassOnLocal, string [] bypassList)
+                       : this (address, bypassOnLocal, bypassList, null) {}
+
+               public WebProxy (string address, bool bypassOnLocal, string [] bypassList,
+                               ICredentials credentials)
+                       : this (ToUri (address), bypassOnLocal, bypassList, credentials) {}
+
+               public WebProxy (Uri address, bool bypassOnLocal, 
+                                string[] bypassList, ICredentials credentials)
+               {
+                       this.address = address;
+                       this.bypassOnLocal = bypassOnLocal;
+                       if (bypassList != null)
+                               this.bypassList = new ArrayList (bypassList);
+                       this.credentials = credentials;
+                       CheckBypassList ();
+               }
+
+               protected WebProxy (SerializationInfo serializationInfo, StreamingContext streamingContext) 
+               {
+                       this.address = (Uri) serializationInfo.GetValue ("_ProxyAddress", typeof (Uri));
+                       this.bypassOnLocal = serializationInfo.GetBoolean ("_BypassOnLocal");
+                       this.bypassList = (ArrayList) serializationInfo.GetValue ("_BypassList", typeof (ArrayList));
+                       this.useDefaultCredentials =  serializationInfo.GetBoolean ("_UseDefaultCredentials");
+                       this.credentials = null;
+                       CheckBypassList ();
+               }
+
+               // Properties
+               public Uri Address {
+                       get { return address; }
+                       set { address = value; }
+               }
+
+               public ArrayList BypassArrayList {
+                       get {
+                               if (bypassList == null)
+                                       bypassList = new ArrayList ();
+                               return bypassList;
+                       }
+               }
+
+               public string [] BypassList {
+                       get { return (string []) BypassArrayList.ToArray (typeof (string)); }
+                       set { 
+                               if (value == null)
+                                       throw new ArgumentNullException ();
+                               bypassList = new ArrayList (value); 
+                               CheckBypassList ();
+                       }
+               }
+
+               public bool BypassProxyOnLocal {
+                       get { return bypassOnLocal; }
+                       set { bypassOnLocal = value; }
+               }
+
+               public ICredentials Credentials {
+                       get { return credentials; }
+                       set { credentials = value; }
+               }
+
+               [MonoTODO ("Does not affect Credentials, since CredentialCache.DefaultCredentials is not implemented.")]
+               public bool UseDefaultCredentials {
+                       get { return useDefaultCredentials; }
+                       set { useDefaultCredentials = value; }
+               }
+
+               // Methods
+               [Obsolete ("This method has been deprecated", false)]
+               [MonoTODO("Can we get this info under windows from the system?")]
+               public static WebProxy GetDefaultProxy ()
                {
-                       this.address = (Uri) serializationInfo.GetValue ("address", typeof(Uri));
-                       this.bypassOnLocal = serializationInfo.GetBoolean ("bypassOnLocal");
-                       this.bypassList = (ArrayList) serializationInfo.GetValue ("bypassList", typeof(ArrayList));\r
-                       this.credentials = null;\r
-                       CheckBypassList ();\r
-               }\r
-               \r
-               // Properties\r
-               \r
-               public Uri Address {\r
-                       get { return address; }\r
-                       set { address = value; }\r
-               }\r
-               \r
-               public ArrayList BypassArrayList {\r
-                       get { \r
-                               return bypassList;\r
-                       }\r
-               }\r
-               \r
-               public string [] BypassList {\r
-                       get { return (string []) bypassList.ToArray (typeof (string)); }\r
-                       set { \r
-                               if (value == null)\r
-                                       throw new ArgumentNullException ();\r
-                               bypassList = new ArrayList (value); \r
-                               CheckBypassList ();\r
-                       }\r
-               }\r
-               \r
-               public bool BypassProxyOnLocal {\r
-                       get { return bypassOnLocal; }\r
-                       set { bypassOnLocal = value; }\r
-               }\r
-               \r
-               public ICredentials Credentials {\r
-                       get { return credentials; }\r
-                       set { credentials = value; }\r
-               }\r
-               \r
-               // Methods\r
-               \r
-               [MonoTODO("Can we get this info under windows from the system?")]\r
-               public static WebProxy GetDefaultProxy ()\r
-               {\r
-                       // Select gets a WebProxy from config files, if available.\r
-                       IWebProxy p = GlobalProxySelection.Select;\r
-                       if (p is WebProxy)\r
-                               return (WebProxy) p;\r
-\r
-                       return new WebProxy ();\r
-               }\r
-               \r
-               public Uri GetProxy (Uri destination)\r
-               {\r
-                       if (IsBypassed (destination))\r
-                               return destination;\r
-                               \r
-                       return address;\r
-               }\r
-               \r
-               public bool IsBypassed (Uri host)\r
-               {\r
-                       if (address == null)\r
-                               return true;\r
-                       \r
-                       if (host.IsLoopback)\r
-                               return true;\r
-                               \r
-                       if (bypassOnLocal && host.Host.IndexOf ('.') == -1)\r
-                               return true;\r
-                               \r
-                       try {                           \r
-                               string hostStr = host.Scheme + "://" + host.Authority;                          \r
-                               int i = 0;\r
-                               for (; i < bypassList.Count; i++) {\r
-                                       Regex regex = new Regex ((string) bypassList [i], \r
-                                               // TODO: RegexOptions.Compiled |  // not implemented yet by Regex\r
-                                               RegexOptions.IgnoreCase |\r
-                                               RegexOptions.Singleline);\r
-\r
-                                       if (regex.IsMatch (hostStr))\r
-                                               break;\r
-                               }\r
-\r
-                               if (i == bypassList.Count)\r
-                                       return false;\r
-\r
-                               // continue checking correctness of regular expressions..\r
-                               // will throw expression when an invalid one is found\r
-                               for (; i < bypassList.Count; i++)\r
-                                       new Regex ((string) bypassList [i]);\r
-\r
-                               return true;\r
-                       } catch (ArgumentException) {\r
-                               return false;\r
-                       }\r
-               }\r
-       \r
-               void ISerializable.GetObjectData (SerializationInfo serializationInfo,\r
-                                                 StreamingContext streamingContext)\r
-               {\r
-                       serializationInfo.AddValue ("bypassOnLocal", bypassOnLocal);
-                       serializationInfo.AddValue ("address", address);
-                       serializationInfo.AddValue ("bypassList", bypassList);\r
-               }\r
-               \r
-               // Private Methods\r
-               \r
-               // this compiles the regular expressions, and will throw\r
-               // an exception when an invalid one is found.\r
-               private void CheckBypassList ()\r
-               {                       \r
-                       for (int i = 0; i < bypassList.Count; i++)\r
-                               new Regex ((string) bypassList [i]);\r
-               }\r
-               \r
-               private static Uri ToUri (string address)\r
-               {\r
-                       if (address == null)\r
-                               return null;\r
-                               \r
-                       if (address.IndexOf (':') == -1) \r
-                               address = "http://" + address;\r
-                       \r
-                       return new Uri (address);\r
-               }\r
-       }\r
-}\r
+                       // Select gets a WebProxy from config files, if available.
+                       IWebProxy p = GlobalProxySelection.Select;
+                       if (p is WebProxy)
+                               return (WebProxy) p;
+
+                       return new WebProxy ();
+               }
+
+               public Uri GetProxy (Uri destination)
+               {
+                       if (IsBypassed (destination))
+                               return destination;
+
+                       return address;
+               }
+
+               public bool IsBypassed (Uri host)
+               {
+                       if (host == null)
+                               throw new ArgumentNullException ("host");
+
+                       if (host.IsLoopback && bypassOnLocal)
+                               return true;
+
+                       if (address == null)
+                               return true;
+
+                       string server = host.Host;
+                       if (bypassOnLocal && server.IndexOf ('.') == -1)
+                               return true;
+
+                       // LAMESPEC
+                       if (!bypassOnLocal) {
+                               if (String.Compare (server, "localhost", true, CultureInfo.InvariantCulture) == 0)
+                                       return true;
+                               if (String.Compare (server, "loopback", true, CultureInfo.InvariantCulture) == 0)
+                                       return true;
+
+                               IPAddress addr = null;
+                               if (IPAddress.TryParse (server, out addr) && IPAddress.IsLoopback (addr))
+                                       return true;
+                       }
+
+                       if (bypassList == null || bypassList.Count == 0)
+                               return false;
+
+                       try {
+                               string hostStr = host.Scheme + "://" + host.Authority;
+                               int i = 0;
+                               for (; i < bypassList.Count; i++) {
+                                       Regex regex = new Regex ((string) bypassList [i], 
+                                               // TODO: RegexOptions.Compiled |  // not implemented yet by Regex
+                                               RegexOptions.IgnoreCase |
+                                               RegexOptions.Singleline);
+
+                                       if (regex.IsMatch (hostStr))
+                                               break;
+                               }
+
+                               if (i == bypassList.Count)
+                                       return false;
+
+                               // continue checking correctness of regular expressions..
+                               // will throw expression when an invalid one is found
+                               for (; i < bypassList.Count; i++)
+                                       new Regex ((string) bypassList [i]);
+
+                               return true;
+                       } catch (ArgumentException) {
+                               return false;
+                       }
+               }
+
+               protected virtual void GetObjectData (SerializationInfo serializationInfo, StreamingContext streamingContext)
+               {
+                       serializationInfo.AddValue ("_BypassOnLocal", bypassOnLocal);
+                       serializationInfo.AddValue ("_ProxyAddress", address);
+                       serializationInfo.AddValue ("_BypassList", bypassList);
+                       serializationInfo.AddValue ("_UseDefaultCredentials", UseDefaultCredentials);
+               }
+
+               void ISerializable.GetObjectData (SerializationInfo serializationInfo,
+                                                 StreamingContext streamingContext)
+               {
+                       GetObjectData (serializationInfo, streamingContext);
+               }
+
+               // Private Methods
+               // this compiles the regular expressions, and will throw
+               // an exception when an invalid one is found.
+               void CheckBypassList ()
+               {
+                       if (bypassList == null)
+                               return;
+                       for (int i = 0; i < bypassList.Count; i++)
+                               new Regex ((string) bypassList [i]);
+               }
+
+               static Uri ToUri (string address)
+               {
+                       if (address == null)
+                               return null;
+                               
+                       if (address.IndexOf ("://", StringComparison.Ordinal) == -1) 
+                               address = "http://" + address;
+
+                       return new Uri (address);
+               }
+       }
+}