-//\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);
+ }
+ }
+}