The Labs \ Source Viewer \ SSCLI \ System.Net.Configuration \ DefaultProxySection

  1. //------------------------------------------------------------------------------
  2. // <copyright file="DefaultProxySection.cs" company="Microsoft Corporation">
  3. //
  4. // Copyright (c) 2006 Microsoft Corporation. All rights reserved.
  5. //
  6. // The use and distribution terms for this software are contained in the file
  7. // named license.txt, which can be found in the root of this distribution.
  8. // By using this software in any fashion, you are agreeing to be bound by the
  9. // terms of this license.
  10. //
  11. // You must not remove this notice, or any other, from this software.
  12. //
  13. // </copyright>
  14. //------------------------------------------------------------------------------
  15. namespace System.Net.Configuration
  16. {
  17.     using System.Collections.Generic;
  18.     using System.Configuration;
  19.     using System.Globalization;
  20.     using System.Net;
  21.     using System.Reflection;
  22.     using System.Threading;
  23.     using System.Security.Permissions;
  24.     using System.Security.Principal;
  25.     using System.ComponentModel;
  26.    
  27.    
  28.     public sealed class DefaultProxySection : ConfigurationSection
  29.     {
  30.         public DefaultProxySection()
  31.         {
  32.             this.properties.Add(this.bypasslist);
  33.             this.properties.Add(this.module);
  34.             this.properties.Add(this.proxy);
  35.             this.properties.Add(this.enabled);
  36.             this.properties.Add(this.useDefaultCredentials);
  37.         }
  38.        
  39.         protected override void PostDeserialize()
  40.         {
  41.             // Perf optimization. If the configuration is coming from machine.config
  42.             // It is safe and we don't need to check for permissions.
  43.             if (EvaluationContext.IsMachineLevel)
  44.                 return;
  45.            
  46.             try {
  47.                 ExceptionHelper.WebPermissionUnrestricted.Demand();
  48.             }
  49.             catch (Exception exception) {
  50.                 throw new ConfigurationErrorsException(SR.GetString(SR.net_config_section_permission, ConfigurationStrings.DefaultProxySectionName), exception);
  51.             }
  52.         }
  53.        
  54.         [ConfigurationProperty(ConfigurationStrings.BypassList)]
  55.         public BypassElementCollection BypassList {
  56.             get { return (BypassElementCollection)this[this.bypasslist]; }
  57.         }
  58.        
  59.         [ConfigurationProperty(ConfigurationStrings.Module)]
  60.         public ModuleElement Module {
  61.             get { return (ModuleElement)this[this.module]; }
  62.         }
  63.        
  64.         protected override ConfigurationPropertyCollection Properties {
  65.             get { return this.properties; }
  66.         }
  67.        
  68.         [ConfigurationProperty(ConfigurationStrings.Proxy)]
  69.         public ProxyElement Proxy {
  70.             get { return (ProxyElement)this[this.proxy]; }
  71.         }
  72.        
  73.         [ConfigurationProperty(ConfigurationStrings.Enabled, DefaultValue = true)]
  74.         public bool Enabled {
  75.             get { return (bool)this[this.enabled]; }
  76.             set { this[this.enabled] = value; }
  77.         }
  78.        
  79.         [ConfigurationProperty(ConfigurationStrings.UseDefaultCredentials, DefaultValue = false)]
  80.         public bool UseDefaultCredentials {
  81.             get { return (bool)this[this.useDefaultCredentials]; }
  82.             set { this[this.useDefaultCredentials] = value; }
  83.         }
  84.        
  85.         ConfigurationPropertyCollection properties = new ConfigurationPropertyCollection();
  86.        
  87.         readonly ConfigurationProperty bypasslist = new ConfigurationProperty(ConfigurationStrings.BypassList, typeof(BypassElementCollection), null, ConfigurationPropertyOptions.None);
  88.        
  89.         readonly ConfigurationProperty module = new ConfigurationProperty(ConfigurationStrings.Module, typeof(ModuleElement), null, ConfigurationPropertyOptions.None);
  90.        
  91.         readonly ConfigurationProperty proxy = new ConfigurationProperty(ConfigurationStrings.Proxy, typeof(ProxyElement), null, ConfigurationPropertyOptions.None);
  92.        
  93.         readonly ConfigurationProperty enabled = new ConfigurationProperty(ConfigurationStrings.Enabled, typeof(bool), true, ConfigurationPropertyOptions.None);
  94.        
  95.         readonly ConfigurationProperty useDefaultCredentials = new ConfigurationProperty(ConfigurationStrings.UseDefaultCredentials, typeof(bool), false, ConfigurationPropertyOptions.None);
  96.        
  97.        
  98.         // This allows us to prevent parent settings (machine.config) from propegating to higher config (app.config), unless
  99.         // the higher config doesn't contain the section at all. That is, overriding defaultProxy is all-or-nothing.
  100.         // Template from sseely.
  101.         protected override void Reset(ConfigurationElement parentElement)
  102.         {
  103.             // Ignore the parentElement parameter by changing it to the default settings
  104.             DefaultProxySection defaultElement = new DefaultProxySection();
  105.            
  106.             // Initialize the parentElement to the right set of defaults (not needed now,
  107.             // but this will avoid errors in the future if SetDefaults is ever overridden in this class.
  108.             // ConfigurationElement::InitializeDefault is a no-op, so you aren�t hurting perf by anything
  109.             // measurable.
  110.             defaultElement.InitializeDefault();
  111.            
  112.             // Finally, pass it to the base class to do the �right things�
  113.             base.Reset(defaultElement);
  114.         }
  115.     }
  116.    
  117.     internal sealed class DefaultProxySectionInternal
  118.     {
  119.         [SecurityPermission(SecurityAction.Assert, Flags = SecurityPermissionFlag.ControlPrincipal)]
  120.         internal DefaultProxySectionInternal(DefaultProxySection section)
  121.         {
  122.             // If enabled is false, skip everything.
  123.             if (!section.Enabled) {
  124.                 return;
  125.             }
  126.            
  127.             // If nothing else is set, use the system default.
  128.             if (section.Proxy.AutoDetect == ProxyElement.AutoDetectValues.Unspecified && section.Proxy.ScriptLocation == null && String.IsNullOrEmpty(section.Module.Type) && section.Proxy.UseSystemDefault != ProxyElement.UseSystemDefaultValues.True && section.Proxy.ProxyAddress == null && section.Proxy.BypassOnLocal == ProxyElement.BypassOnLocalValues.Unspecified && section.BypassList.Count == 0) {
  129.                 // Old-style indication to turn off the proxy.
  130.                 if (section.Proxy.UseSystemDefault == ProxyElement.UseSystemDefaultValues.False) {
  131.                     this.webProxy = new EmptyWebProxy();
  132.                    
  133.                     // Intentionally ignoring UseDefaultCredentials in this case.
  134.                     return;
  135.                 }
  136.                
  137.             }
  138.             else {
  139.                 // First, check out if we are using a different module type
  140.                 if (!String.IsNullOrEmpty(section.Module.Type)) {
  141.                     Type theType = Type.GetType(section.Module.Type, true, true);
  142.                    
  143.                     if ((theType.Attributes & TypeAttributes.VisibilityMask) != TypeAttributes.Public)
  144.                         throw new ConfigurationErrorsException(SR.GetString(SR.net_config_proxy_module_not_public));
  145.                    
  146.                     // verify that its of the proper type of IWebProxy
  147.                     if (!typeof(IWebProxy).IsAssignableFrom(theType)) {
  148.                         throw new InvalidCastException(SR.GetString(SR.net_invalid_cast, theType.FullName, "IWebProxy"));
  149.                     }
  150.                         // Binder
  151.                         // no arguments
  152.                     this.webProxy = (IWebProxy)Activator.CreateInstance(theType, BindingFlags.CreateInstance | BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public, null, new object[0], CultureInfo.InvariantCulture);
  153.                 }
  154.                 else if (section.Proxy.UseSystemDefault == ProxyElement.UseSystemDefaultValues.True && section.Proxy.AutoDetect == ProxyElement.AutoDetectValues.Unspecified && section.Proxy.ScriptLocation == null) {
  155.                 }
  156.                 else {
  157.                     this.webProxy = new WebProxy();
  158.                 }
  159.                
  160.                 WebProxy tempProxy = this.webProxy as WebProxy;
  161.                
  162.                 if (tempProxy != null) {
  163.                     if (section.Proxy.AutoDetect != ProxyElement.AutoDetectValues.Unspecified) {
  164.                         tempProxy.AutoDetect = section.Proxy.AutoDetect == ProxyElement.AutoDetectValues.True;
  165.                     }
  166.                     if (section.Proxy.ScriptLocation != null) {
  167.                         tempProxy.ScriptLocation = section.Proxy.ScriptLocation;
  168.                     }
  169.                     if (section.Proxy.BypassOnLocal != ProxyElement.BypassOnLocalValues.Unspecified) {
  170.                         tempProxy.BypassProxyOnLocal = section.Proxy.BypassOnLocal == ProxyElement.BypassOnLocalValues.True;
  171.                     }
  172.                     if (section.Proxy.ProxyAddress != null) {
  173.                         tempProxy.Address = section.Proxy.ProxyAddress;
  174.                     }
  175.                     int bypassListSize = section.BypassList.Count;
  176.                     if (bypassListSize > 0) {
  177.                         string[] bypassList = new string[section.BypassList.Count];
  178.                         for (int index = 0; index < bypassListSize; ++index) {
  179.                             bypassList[index] = section.BypassList[index].Address;
  180.                         }
  181.                         tempProxy.BypassList = bypassList;
  182.                     }
  183.                    
  184.                     // Wrap it if type not explicitly specified in Module.
  185.                     if (section.Module.Type == null) {
  186.                         this.webProxy = new WebRequest.WebProxyWrapper(tempProxy);
  187.                     }
  188.                 }
  189.             }
  190.            
  191.             // Now apply UseDefaultCredentials if there's a proxy.
  192.             if (this.webProxy != null && section.UseDefaultCredentials) {
  193.                 this.webProxy.Credentials = SystemNetworkCredential.defaultCredential;
  194.             }
  195.         }
  196.        
  197.         static internal object ClassSyncObject {
  198.             get {
  199.                 if (classSyncObject == null) {
  200.                     object o = new object();
  201.                     Interlocked.CompareExchange(ref classSyncObject, o, null);
  202.                 }
  203.                 return classSyncObject;
  204.             }
  205.         }
  206.        
  207.         static internal DefaultProxySectionInternal GetSection()
  208.         {
  209.             lock (DefaultProxySectionInternal.ClassSyncObject) {
  210.                 DefaultProxySection section = PrivilegedConfigurationManager.GetSection(ConfigurationStrings.DefaultProxySectionPath) as DefaultProxySection;
  211.                 if (section == null)
  212.                     return null;
  213.                
  214.                 try {
  215.                     return new DefaultProxySectionInternal(section);
  216.                 }
  217.                 catch (Exception exception) {
  218.                     if (NclUtilities.IsFatal(exception))
  219.                         throw;
  220.                    
  221.                     throw new ConfigurationErrorsException(SR.GetString(SR.net_config_proxy), exception);
  222.                 }
  223.                 catch {
  224.                     throw new ConfigurationErrorsException(SR.GetString(SR.net_config_proxy), new Exception(SR.GetString(SR.net_nonClsCompliantException)));
  225.                 }
  226.             }
  227.         }
  228.        
  229.         internal IWebProxy WebProxy {
  230.             get { return this.webProxy; }
  231.         }
  232.        
  233.         private IWebProxy webProxy;
  234.         private static object classSyncObject;
  235.     }
  236. }

Developer Fusion