* DiscoveryClientProtocol.cs: Now it can get alternate urls from HTML pages
authorLluis Sanchez <lluis@novell.com>
Tue, 2 Mar 2004 15:03:12 +0000 (15:03 -0000)
committerLluis Sanchez <lluis@novell.com>
Tue, 2 Mar 2004 15:03:12 +0000 (15:03 -0000)
  that include a link tag. Added support for loading files from a the
  file system.

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

mcs/class/System.Web.Services/System.Web.Services.Discovery/ChangeLog
mcs/class/System.Web.Services/System.Web.Services.Discovery/DiscoveryClientProtocol.cs

index 10af1119e9ecebf2f8040ab3424993872f976685..7e6cead26328600212d487afa51dcb03ab708c70 100755 (executable)
@@ -1,3 +1,9 @@
+2004-03-02  Lluis Sanchez Gual  <lluis@ximian.com>
+
+       * DiscoveryClientProtocol.cs: Now it can get alternate urls from HTML pages
+         that include a link tag. Added support for loading files from a the
+         file system.
+
 2004-01-24  Lluis Sanchez Gual <lluis@ximian.com>
 
        * ContractReference.cs, DiscoveryClientProtocol.cs, 
index 960cd5ec89c09955d913cdfba282c58ed502d83b..9b3a7a0944fb6f7d1dc0a5dd51924effc84fe5b1 100755 (executable)
@@ -16,6 +16,7 @@ using System.Xml;
 using System.Xml.Schema;\r
 using System.Xml.Serialization;\r
 using System.Net;\r
+using System.Text.RegularExpressions;\r
 \r
 namespace System.Web.Services.Discovery {\r
        public class DiscoveryClientProtocol : HttpWebClientProtocol {\r
@@ -81,7 +82,38 @@ namespace System.Web.Services.Discovery {
 \r
                public DiscoveryDocument DiscoverAny (string url)\r
                {\r
-                       Stream stream = Download (ref url);\r
+                       string contentType = null;\r
+                       Stream stream = Download (ref url, ref contentType);\r
+\r
+                       if (contentType.IndexOf ("text/html") != -1)\r
+                       {\r
+                               // Look for an alternate url\r
+                               \r
+                               StreamReader sr = new StreamReader (stream);\r
+                               string str = sr.ReadToEnd ();\r
+                               \r
+                               string rex = "link\\s*rel\\s*=\\s*[\"']?alternate[\"']?\\s*";\r
+                               rex += "type\\s*=\\s*[\"']?text/xml[\"']?\\s*href\\s*=\\s*(?:\"(?<1>[^\"]*)\"|'(?<1>[^']*)'|(?<1>\\S+))";\r
+                               Regex rob = new Regex (rex, RegexOptions.IgnoreCase);\r
+                               Match m = rob.Match (str);\r
+                               if (!m.Success) \r
+                                       throw new InvalidOperationException ("The HTML document does not contain Web service discovery information");\r
+                               \r
+                               if (url.StartsWith ("/"))\r
+                               {\r
+                                       Uri uri = new Uri (url);\r
+                                       url = uri.GetLeftPart (UriPartial.Authority) + m.Groups[1];\r
+                               }\r
+                               else\r
+                               {\r
+                                       int i = url.LastIndexOf ('/');\r
+                                       if (i == -1)\r
+                                               throw new InvalidOperationException ("The HTML document does not contain Web service discovery information");\r
+                                       url = url.Substring (0,i+1) + m.Groups[1];\r
+                               }\r
+                               stream = Download (ref url);\r
+                       }\r
+                       \r
                        XmlTextReader reader = new XmlTextReader (stream);\r
                        reader.MoveToContent ();\r
                        DiscoveryDocument doc;\r
@@ -132,10 +164,24 @@ namespace System.Web.Services.Discovery {
                \r
                public Stream Download (ref string url, ref string contentType)\r
                {\r
-                       WebRequest request = GetWebRequest (new Uri(url));\r
-                       WebResponse resp = request.GetResponse ();\r
-                       contentType = resp.ContentType;\r
-                       return resp.GetResponseStream ();\r
+                       if (url.StartsWith ("http://") || url.StartsWith ("https://"))\r
+                       {\r
+                               WebRequest request = GetWebRequest (new Uri(url));\r
+                               WebResponse resp = request.GetResponse ();\r
+                               contentType = resp.ContentType;\r
+                               return resp.GetResponseStream ();\r
+                       }\r
+                       else\r
+                       {\r
+                               string ext = Path.GetExtension (url).ToLower();\r
+                               if (ext == ".wsdl" || ext == ".xsd")\r
+                               {\r
+                                       contentType = "text/xml";\r
+                                       return new FileStream (url, FileMode.Open, FileAccess.Read);\r
+                               }\r
+                               else\r
+                                       throw new InvalidOperationException ("Unrecognized file type '" + url + "'. Extension must be one of .wsdl or .xsd");\r
+                       }\r
                }\r
                \r
                public DiscoveryClientResultCollection ReadAll (string topLevelFilename)\r