Darabonba/URL.cs (99 lines of code) (raw):
using System;
using System.Globalization;
using System.Net;
using System.Text;
namespace Darabonba
{
public class URL
{
private Uri _uri;
public URL(string str)
{
_uri = new Uri(str);
}
public string Path()
{
return _uri.AbsolutePath + _uri.Query;
}
public string Pathname()
{
return _uri.AbsolutePath;
}
public string Protocol()
{
return _uri.Scheme;
}
public string Hostname()
{
return _uri.Host;
}
public string Host()
{
return _uri.Authority;
}
public string Port()
{
return _uri.Port == -1 ? "" : _uri.Port.ToString();
}
public string Hash()
{
return string.IsNullOrWhiteSpace(_uri.Fragment) ? "" : _uri.Fragment.TrimStart('#');
}
public string Search()
{
return string.IsNullOrWhiteSpace(_uri.Query) ? "" : _uri.Query.TrimStart('?');
}
public string Href()
{
return _uri.ToString();
}
public string Auth()
{
return _uri.UserInfo;
}
public static URL Parse(string url)
{
return new URL(url);
}
public static string UrlEncode(string url)
{
return url != null ? WebUtility.UrlEncode(url) : string.Empty;
}
public static string PercentEncode(string value)
{
if (value == null)
{
return null;
}
var stringBuilder = new StringBuilder();
var text = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.~";
var bytes = Encoding.UTF8.GetBytes(value);
foreach (char c in bytes)
{
if (text.IndexOf(c) >= 0)
{
stringBuilder.Append(c);
}
else
{
stringBuilder.Append("%").Append(string.Format(CultureInfo.InvariantCulture, "{0:X2}", (int)c));
}
}
return stringBuilder.ToString();
}
public static string PathEncode(string path)
{
if (string.IsNullOrEmpty(path) || path == "/")
{
return path;
}
var paths = path.Split('/');
var stringBuilder = new StringBuilder();
foreach (var s in paths)
{
stringBuilder.Append('/').Append(PercentEncode(s));
}
return "/" + stringBuilder.ToString().TrimStart('/');
}
}
}