/branches/2010/Trentacular.SharePoint.VS2010SPTools/Trentacular.SharePoint/Util/UrlUtils.cs

# · C# · 203 lines · 177 code · 26 blank · 0 comment · 20 complexity · 8641f5bc3e0c69d4d8597cad8c464e45 MD5 · raw file

  1. using System;
  2. using System.Collections.Specialized;
  3. using System.Linq;
  4. using System.Web;
  5. namespace Trentacular.SharePoint.Util
  6. {
  7. public static class UrlUtils
  8. {
  9. public static string AppendQueryString(string url, NameValueCollection queryString)
  10. {
  11. var query = StringUtils.Delimit(queryString.AllKeys.Select(k => string.Format("{0}={1}",
  12. HttpUtility.UrlEncode(k),
  13. HttpUtility.UrlEncode(queryString[k]))
  14. ),
  15. "&");
  16. if (string.IsNullOrEmpty(query))
  17. return url;
  18. string delimiter = url.Contains("?") ? "&" : "?";
  19. return string.Format("{0}{1}{2}", url, delimiter, query);
  20. }
  21. public static string AppendQueryStringPair(string url, string key, string value)
  22. {
  23. string delimiter = url.Contains("?") ? "&" : "?";
  24. return string.Format("{0}{1}{2}={3}",
  25. url,
  26. delimiter,
  27. HttpUtility.UrlEncode(key),
  28. HttpUtility.UrlEncode(value));
  29. }
  30. public static string StripQueryAndHash(string url)
  31. {
  32. int queryIndex = url.IndexOf('?');
  33. if (queryIndex >= 0)
  34. url = url.Remove(queryIndex);
  35. int hashIndex = url.IndexOf('#');
  36. if (hashIndex >= 0)
  37. url = url.Remove(hashIndex);
  38. return url;
  39. }
  40. public static string GetVirtualUrl(this HttpRequest request)
  41. {
  42. string virtualUrl = request.RawUrl.Substring(request.ApplicationPath.Length);
  43. if (virtualUrl[0] != '/')
  44. virtualUrl = virtualUrl.Insert(0, "~/");
  45. else
  46. virtualUrl = virtualUrl.Insert(0, "~");
  47. return virtualUrl;
  48. }
  49. public static string GetAbsoluteApplicationPath(this HttpRequest request)
  50. {
  51. return string.Format("{0}://{1}{2}", request.Url.Scheme, request.Url.Host, request.ApplicationPath.TrimEnd('/'));
  52. }
  53. public static Uri GetOriginalUri(this HttpRequest request)
  54. {
  55. return new Uri(request.Url, request.RawUrl);
  56. }
  57. public static NameValueCollection GenerateQueryStringCollection(string url)
  58. {
  59. NameValueCollection queryString = new NameValueCollection();
  60. int queryIndex = url.IndexOf('?');
  61. if (queryIndex < 0)
  62. return queryString;
  63. string query = url.Substring(queryIndex + 1);
  64. int hashIndex = query.IndexOf('#');
  65. if (hashIndex >= 0)
  66. query = query.Substring(0, hashIndex);
  67. int chars = query.Length;
  68. for (int i = 0; i < chars; i++)
  69. {
  70. int startIndex = i;
  71. int sepIndex = -1;
  72. while (i < chars)
  73. {
  74. char ch = query[i];
  75. if (ch == '=')
  76. {
  77. if (sepIndex < 0)
  78. {
  79. sepIndex = i;
  80. }
  81. }
  82. else if (ch == '&')
  83. {
  84. break;
  85. }
  86. i++;
  87. }
  88. string name = null;
  89. string value = null;
  90. if (sepIndex >= 0)
  91. {
  92. name = query.Substring(startIndex, sepIndex - startIndex);
  93. value = query.Substring(sepIndex + 1, (i - sepIndex) - 1);
  94. }
  95. else
  96. {
  97. value = query.Substring(startIndex, i - startIndex);
  98. }
  99. queryString.Add(HttpUtility.UrlDecode(name), HttpUtility.UrlDecode(value));
  100. if ((i == (chars - 1)) && (query[i] == '&'))
  101. {
  102. queryString.Add(null, string.Empty);
  103. }
  104. }
  105. return queryString;
  106. }
  107. public static string EncodeSpaces(string url)
  108. {
  109. return url.Replace(" ", "%20");
  110. }
  111. public static StringDictionary UrlSpecialCharacters;
  112. static UrlUtils()
  113. {
  114. UrlSpecialCharacters = new StringDictionary();
  115. UrlSpecialCharacters.Add("$", "%24");
  116. UrlSpecialCharacters.Add("&", "%26");
  117. UrlSpecialCharacters.Add("+", "%2B");
  118. UrlSpecialCharacters.Add(",", "%2C");
  119. UrlSpecialCharacters.Add("/", "%2F");
  120. UrlSpecialCharacters.Add(":", "%3A");
  121. UrlSpecialCharacters.Add(";", "%3B");
  122. UrlSpecialCharacters.Add("=", "%3D");
  123. UrlSpecialCharacters.Add("?", "%3F");
  124. UrlSpecialCharacters.Add("@", "%40");
  125. UrlSpecialCharacters.Add(" ", "%20");
  126. UrlSpecialCharacters.Add("\"", "%22");
  127. UrlSpecialCharacters.Add("<", "%3C");
  128. UrlSpecialCharacters.Add(">", "%3E");
  129. UrlSpecialCharacters.Add("#", "%23");
  130. UrlSpecialCharacters.Add("%", "%25");
  131. UrlSpecialCharacters.Add("{", "%7B");
  132. UrlSpecialCharacters.Add("}", "%7D");
  133. UrlSpecialCharacters.Add("|", "%2C");
  134. UrlSpecialCharacters.Add("\\", "%5C");
  135. UrlSpecialCharacters.Add("^", "%5E");
  136. UrlSpecialCharacters.Add("~", "%7E");
  137. UrlSpecialCharacters.Add("[", "%5B");
  138. UrlSpecialCharacters.Add("]", "%5D");
  139. UrlSpecialCharacters.Add("`", "%60");
  140. }
  141. public static string ToUrlSafeString(string text)
  142. {
  143. foreach (string specialChar in UrlSpecialCharacters.Keys)
  144. {
  145. text = text.Replace(specialChar, UrlSpecialCharacters[specialChar]);
  146. }
  147. return text;
  148. }
  149. public static string FromUrlSafeString(string text)
  150. {
  151. foreach (string specialChar in UrlSpecialCharacters.Keys)
  152. {
  153. text = text.Replace(UrlSpecialCharacters[specialChar], specialChar);
  154. }
  155. return text;
  156. }
  157. public static string ToUrlSafeBase64String(byte[] data)
  158. {
  159. return Convert.ToBase64String(data)
  160. .Replace('+', '-')
  161. .Replace('/', '_')
  162. .Replace('=', ',');
  163. }
  164. public static byte[] FromUrlSafeBase64String(string text)
  165. {
  166. return Convert.FromBase64String(text
  167. .Replace('-', '+')
  168. .Replace('_', '/')
  169. .Replace(',', '=')
  170. );
  171. }
  172. public static bool IsVirtualPath(string path)
  173. {
  174. return path.StartsWith("~");
  175. }
  176. }
  177. }