1 // System.Xml.XmlUrlResolver.cs
3 // Author: Duncan Mak (duncan@ximian.com)
4 // Atsushi Enomoto (ginga@kit.hi-ho.ne.jp)
10 // Permission is hereby granted, free of charge, to any person obtaining
11 // a copy of this software and associated documentation files (the
12 // "Software"), to deal in the Software without restriction, including
13 // without limitation the rights to use, copy, modify, merge, publish,
14 // distribute, sublicense, and/or sell copies of the Software, and to
15 // permit persons to whom the Software is furnished to do so, subject to
16 // the following conditions:
18 // The above copyright notice and this permission notice shall be
19 // included in all copies or substantial portions of the Software.
21 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
22 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
23 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
24 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
25 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
26 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
27 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
34 using System.Net.Cache;
35 using System.Threading.Tasks;
40 public class XmlUrlResolver : XmlResolver
43 ICredentials credential;
45 RequestCachePolicy cachePolicy;
50 public XmlUrlResolver ()
56 public override ICredentials Credentials
58 set { credential = value; }
62 public RequestCachePolicy CachePolicy {
63 set { cachePolicy = value; }
66 public IWebProxy Proxy {
67 set { proxy = value; }
72 public override object GetEntity (Uri absoluteUri, string role, Type ofObjectToReturn)
74 if (ofObjectToReturn == null)
75 ofObjectToReturn = typeof (Stream);
76 if (ofObjectToReturn != typeof (Stream))
77 throw new XmlException ("This object type is not supported.");
80 if (!absoluteUri.IsAbsoluteUri)
81 throw new ArgumentException ("uri must be absolute.", "absoluteUri");
84 if (absoluteUri.Scheme == "file") {
85 if (absoluteUri.AbsolutePath == String.Empty)
86 throw new ArgumentException ("uri must be absolute.", "absoluteUri");
87 return new FileStream (UnescapeRelativeUriBody (absoluteUri.LocalPath), FileMode.Open, FileAccess.Read, FileShare.Read);
90 // (MS documentation says) parameter role isn't used yet.
91 WebRequest req = WebRequest.Create (absoluteUri);
93 if (cachePolicy != null)
94 req.CachePolicy = cachePolicy;
98 if (credential != null)
99 req.Credentials = credential;
100 return req.GetResponse().GetResponseStream();
104 public override Uri ResolveUri (Uri baseUri, string relativeUri)
106 return base.ResolveUri (baseUri, relativeUri);
110 // see also XmlResolver.EscapeRelativeUriBody().
111 private string UnescapeRelativeUriBody (string src)
113 return src.Replace ("%3C", "<")
114 .Replace ("%3E", ">")
115 .Replace ("%23", "#")
116 .Replace ("%22", "\"")
117 .Replace ("%20", " ")
118 .Replace ("%25", "%");
122 public override async Task<object> GetEntityAsync (
123 Uri absoluteUri, string role, Type ofObjectToReturn)
125 if (ofObjectToReturn == null)
126 ofObjectToReturn = typeof (Stream);
127 if (ofObjectToReturn != typeof (Stream))
128 throw new XmlException ("This object type is not supported.");
130 if (!absoluteUri.IsAbsoluteUri)
131 throw new ArgumentException ("uri must be absolute.", "absoluteUri");
133 if (absoluteUri.Scheme == "file") {
134 if (absoluteUri.AbsolutePath == String.Empty)
135 throw new ArgumentException ("uri must be absolute.", "absoluteUri");
136 return new FileStream (UnescapeRelativeUriBody (absoluteUri.LocalPath), FileMode.Open, FileAccess.Read, FileShare.Read);
139 // (MS documentation says) parameter role isn't used yet.
140 WebRequest req = WebRequest.Create (absoluteUri);
141 if (cachePolicy != null)
142 req.CachePolicy = cachePolicy;
145 if (credential != null)
146 req.Credentials = credential;
147 var res = await req.GetResponseAsync ().ConfigureAwait (false);
148 return res.GetResponseStream ();