2010-01-12 Sebastien Pouliot <sebastien@ximian.com>
authorSebastien Pouliot <sebastien@ximian.com>
Tue, 12 Jan 2010 18:43:52 +0000 (18:43 -0000)
committerSebastien Pouliot <sebastien@ximian.com>
Tue, 12 Jan 2010 18:43:52 +0000 (18:43 -0000)
* WebRequest_2_1.cs: Rework registration wrt the two, browser
and client, stacks offered in SL3. Only global works now.

svn path=/trunk/mcs/; revision=149423

mcs/class/System.Net/System.Net/ChangeLog
mcs/class/System.Net/System.Net/WebRequest_2_1.cs

index e86fd430353e0ddf4e3028e0642949b0e5a26d79..c660eb045b4f8362ba82c7575efe31ccdee1947b 100644 (file)
@@ -1,3 +1,8 @@
+2010-01-12  Sebastien Pouliot  <sebastien@ximian.com>
+
+       * WebRequest_2_1.cs: Rework registration wrt the two, browser
+       and client, stacks offered in SL3. Only global works now.
+
 2010-01-11  Sebastien Pouliot  <sebastien@ximian.com>
 
        * InternalWebRequestStreamWrapper.cs: New. Moved (and adapted) 
index a8923bfcd3714fee5e52e587cda6e7df1d49dc20..9ec8fba49830b6fd71d99d9d6fc05054aecf6b96 100644 (file)
@@ -5,7 +5,7 @@
 //     Jb Evain  <jbevain@novell.com>
 //     Sebastien Pouliot <sebastien@ximian.com>
 //
-// Copyright (C) 2008-2009 Novell, Inc (http://www.novell.com)
+// Copyright (C) 2008-2010 Novell, Inc (http://www.novell.com)
 //
 
 //
@@ -40,7 +40,7 @@ namespace System.Net {
 
        public abstract class WebRequest {
 
-               static Type browser_http_request;
+               static IWebRequestCreate default_creator;
                static Dictionary<string, IWebRequestCreate> registred_prefixes;
 
                public abstract string ContentType { get; set; }
@@ -48,6 +48,7 @@ namespace System.Net {
                public abstract string Method { get; set; }
                public abstract Uri RequestUri { get; }
 
+               // custom registered prefixes return null (unless they override this)
                public virtual IWebRequestCreate CreatorInstance { 
                        get { return null; }
                }
@@ -89,36 +90,34 @@ namespace System.Net {
                        if (!uri.IsAbsoluteUri)
                                throw new InvalidOperationException ("Uri is not absolute.");
 
-                       switch (uri.Scheme) {
-                       case "http":
-                       case "https":
-                               // we don't use whatever has been registred but our own
-                               return CreateBrowserWebRequest (uri);
-                       default:
-                               IWebRequestCreate creator;
-                               if (registred_prefixes.TryGetValue (uri.Scheme, out creator)) {
-                                       return creator.Create (uri);
-                               } else {
-                                       throw new NotSupportedException (string.Format ("Scheme {0} not supported", uri.Scheme));
+                       IWebRequestCreate creator = null;
+                       if (!registred_prefixes.TryGetValue (uri.Scheme, out creator)) {
+                               switch (uri.Scheme) {
+                               case "http":
+                               case "https":
+                                       creator = default_creator;
+                                       break;
                                }
                        }
+
+                       if (creator == null)
+                               throw new NotSupportedException (string.Format ("Scheme {0} not supported", uri.Scheme));
+
+                       return creator.Create (uri);
                }
 
-               static WebRequest CreateBrowserWebRequest (Uri uri)
+               internal static void RegisterDefaultStack (IWebRequestCreate creator)
                {
-                       if (browser_http_request == null) {
-                               var assembly = Assembly.Load ("System.Windows.Browser, Version=2.0.5.0, Culture=Neutral, PublicKeyToken=7cec85d7bea7798e");
-                               if (assembly == null)
-                                       throw new InvalidOperationException ("Can not load System.Windows.Browser");
-
-                               browser_http_request = assembly.GetType ("System.Windows.Browser.Net.BrowserHttpWebRequest");
-                               if (browser_http_request == null)
-                                       throw new InvalidOperationException ("Can not get BrowserHttpWebRequest");
-                       }
-
-                       return (WebRequest) Activator.CreateInstance (browser_http_request, new object [] { uri });
+                       default_creator = creator;
                }
 
+               // We can register for
+               // * a protocol (e.g. http) for all requests
+               // * a protocol (e.g. https) for a domain
+               // * a protocol (e.g. http) for a single request
+               //
+               // See "How to: Specify Browser or Client HTTP Handling" for more details
+               // http://msdn.microsoft.com/en-us/library/dd920295%28VS.95%29.aspx
                public static bool RegisterPrefix (string prefix, IWebRequestCreate creator)
                {
                        if (prefix == null)
@@ -126,8 +125,6 @@ namespace System.Net {
                        if (creator == null)
                                throw new ArgumentNullException ("creator");
 
-                       // LAMESPEC: according to doc registering http or https will fail. Actually this is not true
-                       // the registration works but the class being registred won't be used for http[s]
                        if (registred_prefixes.ContainsKey (prefix))
                                return false;