451 lines
15 KiB
C#
451 lines
15 KiB
C#
// Decompiled with JetBrains decompiler
|
|
// Type: Rei.Fs.UriUtil
|
|
// Assembly: Rei.Fs, Version=1.13.2.8796, Culture=neutral, PublicKeyToken=null
|
|
// MVID: D8B08A8B-697C-4439-9CFF-1BE4EE46F7B0
|
|
// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Fs.dll
|
|
|
|
using Microsoft.VisualBasic.CompilerServices;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Globalization;
|
|
using System.Text;
|
|
|
|
namespace Rei.Fs
|
|
{
|
|
public class UriUtil
|
|
{
|
|
private const string unescapestringforsegment = "!$&'()*+,-.0123456789:;=@ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~";
|
|
private const string unescapestringforquery = "!$&'()*+,-.0123456789:;=@ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~/?";
|
|
private const string FormUrlEncodeReserved = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789$-_.!*'(),\",";
|
|
private const string OAuthUnreserved = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._~";
|
|
|
|
public static Uri AddLastSlash(Uri target)
|
|
{
|
|
string leftPart = target.GetLeftPart(UriPartial.Path);
|
|
if (leftPart.EndsWith("/"))
|
|
return target;
|
|
return new Uri(leftPart + "/" + target.Query + target.Fragment);
|
|
}
|
|
|
|
public static Uri RemoveLastSlash(Uri target)
|
|
{
|
|
if (target.Segments.Length == 1)
|
|
return target;
|
|
string leftPart = target.GetLeftPart(UriPartial.Path);
|
|
if (!leftPart.EndsWith("/"))
|
|
return target;
|
|
return new Uri(leftPart.Substring(0, checked (leftPart.Length - 1)) + target.Query + target.Fragment);
|
|
}
|
|
|
|
public static bool EndWithSlash(Uri target)
|
|
{
|
|
return target.GetLeftPart(UriPartial.Path).EndsWith("/");
|
|
}
|
|
|
|
public static Uri GetParent(Uri target)
|
|
{
|
|
string str = target.AbsolutePath;
|
|
int index = checked (str.Length - 1);
|
|
while (index >= 0 && Operators.CompareString(Conversions.ToString(str[index]), "/", false) == 0)
|
|
checked { --index; }
|
|
while (index >= 0 && Operators.CompareString(Conversions.ToString(str[index]), "/", false) != 0)
|
|
checked { --index; }
|
|
while (index >= 0 && Operators.CompareString(Conversions.ToString(str[index]), "/", false) == 0)
|
|
checked { --index; }
|
|
int num = checked (index + 1);
|
|
if (num == 0)
|
|
{
|
|
str = "/";
|
|
num = 0;
|
|
}
|
|
if (Operators.CompareString(target.Authority, "", false) == 0)
|
|
return new Uri(target.Scheme + ":" + str.Substring(0, checked (num + 1)));
|
|
return new Uri(target.Scheme + "://" + target.Authority + str.Substring(0, checked (num + 1)));
|
|
}
|
|
|
|
public static Uri GetRoot(Uri target)
|
|
{
|
|
if (Operators.CompareString(target.Authority, "", false) == 0)
|
|
return new Uri(target.Scheme + ":/");
|
|
return new Uri(target.Scheme + "://" + target.Authority + "/");
|
|
}
|
|
|
|
public static string GetLastSegment(Uri target)
|
|
{
|
|
string absolutePath = target.AbsolutePath;
|
|
int length = absolutePath.Length;
|
|
int num = length;
|
|
while (num == length)
|
|
{
|
|
checked { --length; }
|
|
if (length < 0)
|
|
{
|
|
num = -1;
|
|
break;
|
|
}
|
|
num = absolutePath.LastIndexOf('/', length);
|
|
if (num < 0)
|
|
{
|
|
num = -1;
|
|
break;
|
|
}
|
|
}
|
|
return absolutePath.Substring(checked (num + 1), checked (length - num));
|
|
}
|
|
|
|
public static string GetLastName(Uri target)
|
|
{
|
|
string stringToUnescape = UriUtil.GetLastSegment(target);
|
|
try
|
|
{
|
|
stringToUnescape = Uri.UnescapeDataString(stringToUnescape);
|
|
}
|
|
catch (UriFormatException ex)
|
|
{
|
|
ProjectData.SetProjectError((Exception) ex);
|
|
ProjectData.ClearProjectError();
|
|
}
|
|
return stringToUnescape;
|
|
}
|
|
|
|
public static string GetAuthority(Uri target)
|
|
{
|
|
return target.GetComponents(UriComponents.SchemeAndServer | UriComponents.UserInfo, UriFormat.UriEscaped) + "/";
|
|
}
|
|
|
|
public static Uri CombineSegment(Uri baseuri, string segment)
|
|
{
|
|
if (baseuri.AbsoluteUri.EndsWith("/"))
|
|
return new Uri(baseuri.AbsoluteUri + segment);
|
|
return new Uri(baseuri.AbsoluteUri + "/" + segment);
|
|
}
|
|
|
|
public static Uri CombineName(Uri baseuri, string name)
|
|
{
|
|
return UriUtil.CombineSegment(baseuri, Uri.EscapeDataString(name));
|
|
}
|
|
|
|
public static bool UriEquals(Uri u1, Uri u2, bool casesensitive)
|
|
{
|
|
if ((object) u1 == null)
|
|
return (object) u2 == null;
|
|
if ((object) u2 == null)
|
|
return false;
|
|
if (casesensitive)
|
|
return Uri.Compare(UriUtil.RemoveLastSlash(u1), UriUtil.RemoveLastSlash(u2), UriComponents.AbsoluteUri, UriFormat.Unescaped, StringComparison.InvariantCulture) == 0;
|
|
return Uri.Compare(UriUtil.RemoveLastSlash(u1), UriUtil.RemoveLastSlash(u2), UriComponents.AbsoluteUri, UriFormat.Unescaped, StringComparison.InvariantCultureIgnoreCase) == 0;
|
|
}
|
|
|
|
private static string UriEncodeConvertHelper(string str, Encoding sourceencoding, Encoding destinationencoding, bool queryorfragment)
|
|
{
|
|
if (str.Contains("%u") || str.Contains("%U"))
|
|
throw new ArgumentException("cannot use %u encoding uri");
|
|
List<byte> byteList = new List<byte>();
|
|
int index1=0;
|
|
while (index1 < str.Length)
|
|
{
|
|
if ((int) str[index1] != 37)
|
|
{
|
|
byteList.Add(Convert.ToByte(str[index1]));
|
|
checked { ++index1; }
|
|
}
|
|
else
|
|
{
|
|
byteList.Add(Convert.ToByte(str.Substring(checked (index1 + 1), 2), 16));
|
|
checked { index1 += 3; }
|
|
}
|
|
}
|
|
byte[] numArray = new byte[checked (byteList.Count - 1 + 1)];
|
|
byteList.CopyTo(numArray);
|
|
str = sourceencoding.GetString(numArray);
|
|
StringBuilder stringBuilder = new StringBuilder(checked (str.Length * 3));
|
|
string str1 = !queryorfragment ? "!$&'()*+,-.0123456789:;=@ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~" : "!$&'()*+,-.0123456789:;=@ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~/?";
|
|
int num1 = 0;
|
|
int num2 = checked (str.Length - 1);
|
|
int index2 = num1;
|
|
while (index2 <= num2)
|
|
{
|
|
if (str1.Contains(Conversions.ToString(str[index2])))
|
|
{
|
|
stringBuilder.Append(str[index2]);
|
|
}
|
|
else
|
|
{
|
|
byte[] bytes = destinationencoding.GetBytes(Conversions.ToString(str[index2]));
|
|
int index3 = 0;
|
|
while (index3 < bytes.Length)
|
|
{
|
|
byte num3 = bytes[index3];
|
|
char ch = Convert.ToChar(num3);
|
|
if (str1.Contains(Conversions.ToString(ch)))
|
|
{
|
|
stringBuilder.Append(ch);
|
|
}
|
|
else
|
|
{
|
|
stringBuilder.Append("%");
|
|
stringBuilder.Append(num3.ToString("X2"));
|
|
}
|
|
checked { ++index3; }
|
|
}
|
|
}
|
|
checked { ++index2; }
|
|
}
|
|
str = stringBuilder.ToString();
|
|
return str;
|
|
}
|
|
|
|
public static Uri UriEncodeConvert(Uri target, Encoding sourceencoding, Encoding destinationencoding)
|
|
{
|
|
if (sourceencoding == null)
|
|
sourceencoding = Encoding.UTF8;
|
|
if (destinationencoding == null)
|
|
destinationencoding = Encoding.UTF8;
|
|
if (sourceencoding == destinationencoding)
|
|
return target;
|
|
string components = target.GetComponents(UriComponents.SchemeAndServer | UriComponents.UserInfo, UriFormat.UriEscaped);
|
|
string[] strArray = target.GetComponents(UriComponents.Path, UriFormat.UriEscaped).Split(new char[1]
|
|
{
|
|
'/'
|
|
}, StringSplitOptions.None);
|
|
int num1 = 0;
|
|
int num2 = checked (strArray.Length - 1);
|
|
int index = num1;
|
|
while (index <= num2)
|
|
{
|
|
strArray[index] = UriUtil.UriEncodeConvertHelper(strArray[index], sourceencoding, destinationencoding, false);
|
|
checked { ++index; }
|
|
}
|
|
string str1 = target.GetComponents(UriComponents.Query, UriFormat.UriEscaped);
|
|
if (str1.Length > 0)
|
|
str1 = UriUtil.UriEncodeConvertHelper(str1, sourceencoding, destinationencoding, true);
|
|
string str2 = target.GetComponents(UriComponents.Fragment, UriFormat.UriEscaped);
|
|
if (str2.Length > 0)
|
|
str2 = UriUtil.UriEncodeConvertHelper(str2, sourceencoding, destinationencoding, true);
|
|
string uriString = components + "/" + string.Join("/", strArray);
|
|
if (str1.Length > 0)
|
|
uriString = uriString + "?" + str1;
|
|
if (str2.Length > 0)
|
|
uriString = uriString + "#" + str2;
|
|
return new Uri(uriString);
|
|
}
|
|
|
|
public static bool IsChild(Uri baseuri, Uri target)
|
|
{
|
|
if (checked (baseuri.Segments.Length + 1) != target.Segments.Length)
|
|
return false;
|
|
return UriUtil.IsDescendant(baseuri, target);
|
|
}
|
|
|
|
public static bool IsDescendant(Uri baseuri, Uri target)
|
|
{
|
|
if (checked (baseuri.Segments.Length + 1) > target.Segments.Length || Operators.CompareString(baseuri.Scheme, target.Scheme, false) != 0 || (Operators.CompareString(baseuri.Host, target.Host, false) != 0 || baseuri.Port != target.Port) || Operators.CompareString(baseuri.UserInfo, target.UserInfo, false) != 0)
|
|
return false;
|
|
int num1 = 0;
|
|
int num2 = checked (baseuri.Segments.Length - 1);
|
|
int index = num1;
|
|
while (index <= num2)
|
|
{
|
|
if (!UriUtil.IsSameSegmentString(baseuri.Segments[index], target.Segments[index]))
|
|
return false;
|
|
checked { ++index; }
|
|
}
|
|
return true;
|
|
}
|
|
|
|
public static bool IsSameSegmentString(string seg1, string seg2)
|
|
{
|
|
while (seg1.EndsWith("/"))
|
|
seg1 = seg1.Substring(0, checked (seg1.Length - 1));
|
|
while (seg2.EndsWith("/"))
|
|
seg2 = seg2.Substring(0, checked (seg2.Length - 1));
|
|
return Operators.CompareString(Uri.UnescapeDataString(seg1), Uri.UnescapeDataString(seg2), false) == 0;
|
|
}
|
|
|
|
public static bool IsRoot(Uri u)
|
|
{
|
|
return u.Segments.Length < 2;
|
|
}
|
|
|
|
public static string FormUrlEncode(string str)
|
|
{
|
|
StringBuilder stringBuilder = new StringBuilder();
|
|
int num1 = 0;
|
|
int num2 = checked (str.Length - 1);
|
|
int index1 = num1;
|
|
while (index1 <= num2)
|
|
{
|
|
if ((int) str[index1] == 32)
|
|
stringBuilder.Append("+");
|
|
else if ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789$-_.!*'(),\",".Contains(Conversions.ToString(str[index1])))
|
|
{
|
|
stringBuilder.Append(str[index1]);
|
|
}
|
|
else
|
|
{
|
|
byte[] bytes = Encoding.UTF8.GetBytes(Conversions.ToString(str[index1]));
|
|
int index2 = 0;
|
|
while (index2 < bytes.Length)
|
|
{
|
|
byte num3 = bytes[index2];
|
|
stringBuilder.Append("%");
|
|
stringBuilder.Append(num3.ToString("X2"));
|
|
checked { ++index2; }
|
|
}
|
|
}
|
|
checked { ++index1; }
|
|
}
|
|
return stringBuilder.ToString();
|
|
}
|
|
|
|
public static string OAuthEncode(string str)
|
|
{
|
|
StringBuilder stringBuilder = new StringBuilder();
|
|
int num1 = 0;
|
|
int num2 = checked (str.Length - 1);
|
|
int index1 = num1;
|
|
while (index1 <= num2)
|
|
{
|
|
if ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._~".Contains(Conversions.ToString(str[index1])))
|
|
{
|
|
stringBuilder.Append(str[index1]);
|
|
}
|
|
else
|
|
{
|
|
byte[] bytes = Encoding.UTF8.GetBytes(Conversions.ToString(str[index1]));
|
|
int index2 = 0;
|
|
while (index2 < bytes.Length)
|
|
{
|
|
byte num3 = bytes[index2];
|
|
stringBuilder.Append("%");
|
|
stringBuilder.Append(num3.ToString("X2"));
|
|
checked { ++index2; }
|
|
}
|
|
}
|
|
checked { ++index1; }
|
|
}
|
|
return stringBuilder.ToString();
|
|
}
|
|
|
|
public static string OAuthDecode(string str)
|
|
{
|
|
List<byte> byteList = new List<byte>();
|
|
int index = 0;
|
|
while (index < str.Length)
|
|
{
|
|
byte result;
|
|
if (Operators.CompareString(Conversions.ToString(str[index]), "%", false) == 0 && index < checked (str.Length - 3) && byte.TryParse(str.Substring(checked (index + 1), 2), NumberStyles.HexNumber, (IFormatProvider) null, out result))
|
|
{
|
|
byteList.Add(result);
|
|
checked { index += 3; }
|
|
}
|
|
else
|
|
{
|
|
byteList.AddRange((IEnumerable<byte>) Encoding.UTF8.GetBytes(Conversions.ToString(str[index])));
|
|
checked { ++index; }
|
|
}
|
|
}
|
|
return Encoding.UTF8.GetString(byteList.ToArray());
|
|
}
|
|
|
|
public static Uri CreateNextCopyName(Uri target)
|
|
{
|
|
int result = 2;
|
|
string lastSegment = UriUtil.GetLastSegment(target);
|
|
string str = UriUtil.RemoveExtension(lastSegment);
|
|
if (str.EndsWith(")"))
|
|
{
|
|
int length = str.LastIndexOf("(");
|
|
if (int.TryParse(str.Substring(checked (length + 1), checked (str.Length - length - 2)), out result))
|
|
{
|
|
str = str.Substring(0, length).TrimEnd();
|
|
checked { ++result; }
|
|
}
|
|
}
|
|
return new Uri(UriUtil.GetParent(target).AbsoluteUri + str + " (" + result.ToString() + ")" + UriUtil.GetExtension(lastSegment));
|
|
}
|
|
|
|
public static string CreateNextCopyName(string name)
|
|
{
|
|
int result = 1;
|
|
string str = UriUtil.RemoveExtension(name);
|
|
if (str.EndsWith(")"))
|
|
{
|
|
int num = str.LastIndexOf("(");
|
|
if (int.TryParse(str.Substring(checked (num + 1), checked (str.Length - num - 2)), out result))
|
|
str = str.Substring(0, checked (num - 1));
|
|
}
|
|
int num1 = checked (result + 1);
|
|
return str + " (" + num1.ToString() + ")" + UriUtil.GetExtension(name);
|
|
}
|
|
|
|
public static string CreateFormUrlencodedString(Dictionary<string, string> values)
|
|
{
|
|
List<string> stringList = new List<string>();
|
|
Dictionary<string, string>.KeyCollection.Enumerator enumerator = values.Keys.GetEnumerator();
|
|
try
|
|
{
|
|
while (enumerator.MoveNext())
|
|
{
|
|
string current = enumerator.Current;
|
|
stringList.Add(Uri.EscapeDataString(current).Replace("%20", "+") + "=" + Uri.EscapeDataString(values[current]).Replace("%20", "+"));
|
|
}
|
|
}
|
|
finally
|
|
{
|
|
enumerator.Dispose();
|
|
}
|
|
return string.Join("&", stringList.ToArray());
|
|
}
|
|
|
|
public static Uri CreateUriFromSchemeAndPath(string scheme, string path)
|
|
{
|
|
string[] strArray = path.Split(new char[1]{ '/' }, StringSplitOptions.RemoveEmptyEntries);
|
|
string str = "";
|
|
if (strArray.Length == 0)
|
|
{
|
|
str = "/";
|
|
}
|
|
else
|
|
{
|
|
int num1 = 0;
|
|
int num2 = checked (strArray.Length - 1);
|
|
int index = num1;
|
|
while (index <= num2)
|
|
{
|
|
str = str + "/" + Uri.EscapeDataString(strArray[index]);
|
|
checked { ++index; }
|
|
}
|
|
}
|
|
return new Uri(scheme + ":" + str);
|
|
}
|
|
|
|
private static string GetFilename(string path)
|
|
{
|
|
while (path.EndsWith("\\"))
|
|
path = path.Substring(0, checked (path.Length - 1));
|
|
int num = path.LastIndexOf("\\");
|
|
if (num < 0)
|
|
return path;
|
|
return path.Substring(checked (num + 1));
|
|
}
|
|
|
|
private static string RemoveExtension(string filename)
|
|
{
|
|
int length = filename.LastIndexOf(".");
|
|
if (length < 0)
|
|
return filename;
|
|
return filename.Substring(0, length);
|
|
}
|
|
|
|
private static string GetExtension(string path)
|
|
{
|
|
string filename = UriUtil.GetFilename(path);
|
|
int num = filename.LastIndexOf(".");
|
|
if (num < 0 || checked (num + 1) >= filename.Length)
|
|
return "";
|
|
return filename.Substring(checked (num + 1));
|
|
}
|
|
}
|
|
}
|