5 // Lawrence Pit (loz@cable.a2000.nl)
\r
7 // Copyright (C) 2005 Novell, Inc (http://www.novell.com)
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;
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
57 : this (Uri.UriSchemeHttp, "localhost")
59 : this (Uri.UriSchemeHttp, "loopback")
64 public UriBuilder (string uri) : this (new Uri (uri))
\r
68 public UriBuilder (Uri uri)
\r
70 scheme = uri.Scheme;
\r
73 path = uri.AbsolutePath;
\r
75 fragment = uri.Fragment;
\r
76 username = uri.UserInfo;
\r
77 int pos = username.IndexOf (':');
\r
79 password = username.Substring (pos + 1);
\r
80 username = username.Substring (0, pos);
\r
82 password = String.Empty;
\r
87 public UriBuilder (string schemeName, string hostName)
\r
89 Scheme = schemeName;
\r
92 Path = String.Empty; // dependent on scheme it may set path to "/"
\r
93 query = String.Empty;
\r
94 fragment = String.Empty;
\r
95 username = String.Empty;
\r
96 password = String.Empty;
\r
100 public UriBuilder (string scheme, string host, int portNumber)
\r
101 : this (scheme, host)
\r
106 public UriBuilder (string scheme, string host, int port, string pathValue)
\r
107 : this (scheme, host, port)
\r
112 public UriBuilder (string scheme, string host, int port, string pathValue, string extraValue)
\r
113 : this (scheme, host, port, pathValue)
\r
115 if (extraValue == null || extraValue.Length == 0)
\r
118 if (extraValue [0] == '#')
\r
119 Fragment = extraValue.Remove (0, 1);
\r
120 else if (extraValue [0] == '?')
\r
121 Query = extraValue.Remove (0, 1);
\r
123 throw new ArgumentException ("extraValue");
\r
129 public string Fragment {
\r
130 get { return fragment; }
\r
133 if (fragment == null)
\r
134 fragment = String.Empty;
\r
135 else if (fragment.Length > 0)
\r
136 // fragment = "#" + EncodeUtf8 (value.Replace ("%23", "#"));
\r
137 fragment = "#" + value.Replace ("%23", "#");
\r
138 query = String.Empty;
\r
143 public string Host {
\r
144 get { return host; }
\r
146 host = (value == null) ? String.Empty : value;;
\r
151 public string Password {
\r
152 get { return password; }
\r
154 password = (value == null) ? String.Empty : value;;
\r
159 public string Path {
\r
160 get { return path; }
\r
162 if (value == null || value.Length == 0) {
\r
165 path = Uri.EscapeString (value.Replace ('\\', '/'), false, true, true);
\r
172 get { return port; }
\r
176 throw new ArgumentOutOfRangeException ("value");
179 throw new ArgumentOutOfRangeException ("value");
181 // apparently it is
\r
187 public string Query {
\r
188 get { return query; }
\r
190 // LAMESPEC: it doesn't say to always prepend a
\r
191 // question mark to the value.. it does say this
\r
193 if (value == null || value == "")
\r
194 query = String.Empty;
\r
196 // query = "?" + EncodeUtf8 (value);
\r
197 query = "?" + value;
\r
198 fragment = String.Empty;
\r
203 public string Scheme {
\r
204 get { return scheme; }
\r
207 value = String.Empty;
\r
208 int colonPos = value.IndexOf (':');
\r
209 if (colonPos != -1)
\r
210 value = value.Substring (0, colonPos);
\r
211 scheme = value.ToLower ();
\r
220 uri = new Uri (ToString (), true);
\r
226 public string UserName {
\r
227 get { return username; }
\r
229 username = (value == null) ? String.Empty : value;;
\r
236 public override bool Equals (object rparam)
\r
238 return (rparam == null) ? false : this.Uri.Equals (rparam.ToString ());
\r
241 public override int GetHashCode ()
\r
243 return this.Uri.GetHashCode ();
\r
246 public override string ToString ()
\r
248 StringBuilder builder = new StringBuilder ();
\r
250 builder.Append (scheme);
\r
251 builder.Append ("://");
\r
253 if (username != String.Empty) {
\r
254 builder.Append (username);
\r
255 if (password != String.Empty)
\r
256 builder.Append (":" + password);
\r
257 builder.Append ('@');
\r
260 builder.Append (host);
\r
262 builder.Append (":" + port);
\r
264 if (path != String.Empty &&
\r
265 builder [builder.Length - 1] != '/' &&
\r
266 path.Length > 0 && path [0] != '/')
\r
267 builder.Append ('/');
\r
268 builder.Append (path);
\r
269 builder.Append (query);
\r
271 return builder.ToString ();
\r