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