[runtime] Replace pedump boehm dependency with sgen dependency
[mono.git] / mcs / class / System / System.Net / WebProxy.cs
index 7647fac0a6fe3a5d6660de67d10a76313d40355c..365535a056bb4b561f1eb55aef21e100c4da2305 100644 (file)
-//\r
-// System.Net.WebProxy\r
-//\r
-// Author:\r
-//   Lawrence Pit (loz@cable.a2000.nl)\r
-//\r
-\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 string [] bypassList;\r
-               private ICredentials credentials;\r
-               \r
-               private Regex [] bypassRegexList;\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 = bypassList;\r
-                       this.credentials = credentials;\r
-                       CreateBypassRegexList ();\r
-               }\r
-               \r
-               [MonoTODO]\r
-               protected WebProxy (SerializationInfo serializationInfo, StreamingContext streamingContext) \r
-               {\r
-                       throw new NotImplementedException ();\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 new ArrayList (bypassList);\r
-                       }\r
-               }\r
-               \r
-               public string[] BypassList {\r
-                       get { return bypassList; }\r
-                       set { \r
-                               if (value == null)\r
-                                       throw new ArgumentNullException ();\r
-                               bypassList = value; \r
-                               CreateBypassRegexList ();\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]\r
-               public static WebProxy GetDefaultProxy ()\r
-               {\r
-                       // for Mono we should probably read in these settings\r
-                       // from the global application configuration file\r
-                       \r
-                       // for now, return the empty WebProxy to indicate\r
-                       // no proxy is used\r
-                       // return GlobalProxySelection.GetEmptyWebProxy ();\r
-                       // ??\r
-                       \r
-                       throw new NotImplementedException ();\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
-                       string hostStr = host.Scheme + "://" + host.Authority;                          \r
-                       for (int i = 0; i < bypassRegexList.Length; i++) \r
-                               if (bypassRegexList [i].IsMatch (hostStr))\r
-                                       return true;\r
-                       \r
-                       return false;\r
-               }\r
-\r
-               [MonoTODO]              \r
-               void ISerializable.GetObjectData (SerializationInfo serializationInfo,\r
-                                                 StreamingContext streamingContext)\r
-               {\r
-                       throw new NotImplementedException ();\r
-               }\r
-               \r
-               // Private Methods\r
-               \r
-               private void CreateBypassRegexList ()\r
-               {                       \r
-                       bypassRegexList = new Regex [bypassList.Length];\r
-                       for (int i = 0; i < bypassList.Length; i++)\r
-                               bypassRegexList [i] = new Regex (bypassList [i], \r
-                                                       // TODO: RegexOptions.Compiled |  // not implemented yet by Regex\r
-                                                       RegexOptions.IgnoreCase |\r
-                                                       RegexOptions.Singleline);\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
-}
\ No newline at end of file
+//
+// System.Net.WebProxy.cs
+//
+// Authors:
+//   Lawrence Pit (loz@cable.a2000.nl)
+//   Andreas Nahr (ClassDevelopment@A-SoftTech.com)
+//
+
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+// 
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+// 
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+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 ()
+               {
+                       // 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);
+               }
+       }
+}