5 // Lawrence Pit (loz@cable.a2000.nl)
\r
9 // Permission is hereby granted, free of charge, to any person obtaining
10 // a copy of this software and associated documentation files (the
11 // "Software"), to deal in the Software without restriction, including
12 // without limitation the rights to use, copy, modify, merge, publish,
13 // distribute, sublicense, and/or sell copies of the Software, and to
14 // permit persons to whom the Software is furnished to do so, subject to
15 // the following conditions:
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
24 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
30 using System.Collections;
\r
31 using System.Runtime.Serialization;
\r
34 // See RFC 2396 for more info on URI's.
\r
38 public class UriBuilder
\r
40 private string scheme;
\r
41 private string host;
\r
43 private string path;
\r
44 private string query;
\r
45 private string fragment;
\r
46 private string username;
\r
47 private string password;
\r
50 private bool modified;
\r
55 public UriBuilder () : this (Uri.UriSchemeHttp, "loopback")
\r
59 public UriBuilder (string uri) : this (new Uri (uri))
\r
63 public UriBuilder (Uri uri)
\r
65 scheme = uri.Scheme;
\r
68 path = uri.AbsolutePath;
\r
70 fragment = uri.Fragment;
\r
71 username = uri.UserInfo;
\r
72 int pos = username.IndexOf (':');
\r
74 password = username.Substring (pos + 1);
\r
75 username = username.Substring (0, pos);
\r
80 public UriBuilder (string schemeName, string hostName)
\r
82 Scheme = schemeName;
\r
85 Path = String.Empty; // dependent on scheme it may set path to "/"
\r
86 query = String.Empty;
\r
87 fragment = String.Empty;
\r
88 username = String.Empty;
\r
89 password = String.Empty;
\r
93 public UriBuilder (string scheme, string host, int portNumber)
\r
94 : this (scheme, host)
\r
99 public UriBuilder (string scheme, string host, int port, string pathValue)
\r
100 : this (scheme, host, port)
\r
105 public UriBuilder (string scheme, string host, int port, string pathValue, string extraValue)
\r
106 : this (scheme, host, port, pathValue)
\r
108 if (extraValue == null || extraValue.Length == 0)
\r
111 if (extraValue [0] == '#')
\r
112 Fragment = extraValue.Remove (0, 1);
\r
113 else if (extraValue [0] == '?')
\r
114 Query = extraValue.Remove (0, 1);
\r
116 throw new ArgumentException ("extraValue");
\r
122 public string Fragment {
\r
123 get { return fragment; }
\r
126 if (fragment == null)
\r
127 fragment = String.Empty;
\r
128 else if (fragment.Length > 0)
\r
129 // fragment = "#" + EncodeUtf8 (value.Replace ("%23", "#"));
\r
130 fragment = "#" + value.Replace ("%23", "#");
\r
131 query = String.Empty;
\r
136 public string Host {
\r
137 get { return host; }
\r
139 host = (value == null) ? String.Empty : value;;
\r
144 public string Password {
\r
145 get { return password; }
\r
147 password = (value == null) ? String.Empty : value;;
\r
152 public string Path {
\r
153 get { return path; }
\r
155 if (value == null || value.Length == 0) {
\r
158 path = Uri.EscapeString (value.Replace ('\\', '/'), false, true, true);
\r
165 get { return port; }
\r
168 throw new ArgumentOutOfRangeException ("value");
\r
169 // apparently it is
\r
175 public string Query {
\r
176 get { return query; }
\r
178 // LAMESPEC: it doesn't say to always prepend a
\r
179 // question mark to the value.. it does say this
\r
181 if (value == null || value == "")
\r
182 query = String.Empty;
\r
184 // query = "?" + EncodeUtf8 (value);
\r
185 query = "?" + value;
\r
186 fragment = String.Empty;
\r
191 public string Scheme {
\r
192 get { return scheme; }
\r
195 value = String.Empty;
\r
196 int colonPos = value.IndexOf (':');
\r
197 if (colonPos != -1)
\r
198 value = value.Substring (0, colonPos);
\r
199 scheme = value.ToLower ();
\r
208 uri = new Uri (ToString (), true);
\r
214 public string UserName {
\r
215 get { return username; }
\r
217 username = (value == null) ? String.Empty : value;;
\r
224 public override bool Equals (object rparam)
\r
226 return (rparam == null) ? false : this.Uri.Equals (rparam.ToString ());
\r
229 public override int GetHashCode ()
\r
231 return this.Uri.GetHashCode ();
\r
234 public override string ToString ()
\r
236 StringBuilder builder = new StringBuilder ();
\r
238 builder.Append (scheme);
\r
239 builder.Append ("://");
\r
241 if (username != String.Empty) {
\r
242 builder.Append (username);
\r
243 if (password != String.Empty)
\r
244 builder.Append (":" + password);
\r
245 builder.Append ('@');
\r
248 builder.Append (host);
\r
250 builder.Append (":" + port);
\r
252 if (path != String.Empty)
\r
253 builder.Append ('/');
\r
254 builder.Append (path);
\r
255 builder.Append (query);
\r
257 return builder.ToString ();
\r