231 lines
6.8 KiB
C#
231 lines
6.8 KiB
C#
|
// MIRROR CHANGE: drop in Codice.Utils HttpUtility subset to not depend on Unity's plastic scm package
|
||
|
// SOURCE: Unity Plastic SCM package
|
||
|
|
||
|
using System;
|
||
|
using System.Collections;
|
||
|
using System.Collections.Generic;
|
||
|
using System.Collections.Specialized;
|
||
|
using System.IO;
|
||
|
using System.Text;
|
||
|
|
||
|
namespace Edgegap.Codice.Utils // MIRROR CHANGE: namespace Edgegap.* to not collide if anyone has Plastic SCM installed already
|
||
|
{
|
||
|
public sealed class HttpUtility
|
||
|
{
|
||
|
private static void WriteCharBytes(IList buf, char ch, Encoding e)
|
||
|
{
|
||
|
if (ch > 'ÿ')
|
||
|
{
|
||
|
Encoding encoding = e;
|
||
|
char[] chars = new char[1]{ ch };
|
||
|
foreach (byte num in encoding.GetBytes(chars))
|
||
|
buf.Add((object) num);
|
||
|
}
|
||
|
else
|
||
|
buf.Add((object) (byte) ch);
|
||
|
}
|
||
|
|
||
|
public static string UrlDecode(string s, Encoding e)
|
||
|
{
|
||
|
if (null == s)
|
||
|
return (string) null;
|
||
|
if (s.IndexOf('%') == -1 && s.IndexOf('+') == -1)
|
||
|
return s;
|
||
|
if (e == null)
|
||
|
e = Encoding.UTF8;
|
||
|
long length = (long) s.Length;
|
||
|
List<byte> buf = new List<byte>();
|
||
|
for (int index = 0; (long) index < length; ++index)
|
||
|
{
|
||
|
char ch = s[index];
|
||
|
if (ch == '%' && (long) (index + 2) < length && s[index + 1] != '%')
|
||
|
{
|
||
|
if (s[index + 1] == 'u' && (long) (index + 5) < length)
|
||
|
{
|
||
|
int num = HttpUtility.GetChar(s, index + 2, 4);
|
||
|
if (num != -1)
|
||
|
{
|
||
|
HttpUtility.WriteCharBytes((IList) buf, (char) num, e);
|
||
|
index += 5;
|
||
|
}
|
||
|
else
|
||
|
HttpUtility.WriteCharBytes((IList) buf, '%', e);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
int num;
|
||
|
if ((num = HttpUtility.GetChar(s, index + 1, 2)) != -1)
|
||
|
{
|
||
|
HttpUtility.WriteCharBytes((IList) buf, (char) num, e);
|
||
|
index += 2;
|
||
|
}
|
||
|
else
|
||
|
HttpUtility.WriteCharBytes((IList) buf, '%', e);
|
||
|
}
|
||
|
}
|
||
|
else if (ch == '+')
|
||
|
HttpUtility.WriteCharBytes((IList) buf, ' ', e);
|
||
|
else
|
||
|
HttpUtility.WriteCharBytes((IList) buf, ch, e);
|
||
|
}
|
||
|
byte[] array = buf.ToArray();
|
||
|
return e.GetString(array);
|
||
|
}
|
||
|
|
||
|
private static int GetInt(byte b)
|
||
|
{
|
||
|
char ch = (char) b;
|
||
|
if (ch >= '0' && ch <= '9')
|
||
|
return (int) ch - 48;
|
||
|
if (ch >= 'a' && ch <= 'f')
|
||
|
return (int) ch - 97 + 10;
|
||
|
return ch >= 'A' && ch <= 'F' ? (int) ch - 65 + 10 : -1;
|
||
|
}
|
||
|
|
||
|
private static int GetChar(string str, int offset, int length)
|
||
|
{
|
||
|
int num1 = 0;
|
||
|
int num2 = length + offset;
|
||
|
for (int index = offset; index < num2; ++index)
|
||
|
{
|
||
|
char b = str[index];
|
||
|
if (b > '\u007F')
|
||
|
return -1;
|
||
|
int num3 = HttpUtility.GetInt((byte) b);
|
||
|
if (num3 == -1)
|
||
|
return -1;
|
||
|
num1 = (num1 << 4) + num3;
|
||
|
}
|
||
|
return num1;
|
||
|
}
|
||
|
|
||
|
public static string UrlEncode(string str) => HttpUtility.UrlEncode(str, Encoding.UTF8);
|
||
|
|
||
|
public static string UrlEncode(string s, Encoding Enc)
|
||
|
{
|
||
|
if (s == null)
|
||
|
return (string) null;
|
||
|
if (s == string.Empty)
|
||
|
return string.Empty;
|
||
|
bool flag = false;
|
||
|
int length = s.Length;
|
||
|
for (int index = 0; index < length; ++index)
|
||
|
{
|
||
|
char c = s[index];
|
||
|
if ((c < '0' || c < 'A' && c > '9' || c > 'Z' && c < 'a' || c > 'z') && !HttpEncoder.NotEncoded(c))
|
||
|
{
|
||
|
flag = true;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
if (!flag)
|
||
|
return s;
|
||
|
byte[] bytes1 = new byte[Enc.GetMaxByteCount(s.Length)];
|
||
|
int bytes2 = Enc.GetBytes(s, 0, s.Length, bytes1, 0);
|
||
|
return Encoding.ASCII.GetString(HttpUtility.UrlEncodeToBytes(bytes1, 0, bytes2));
|
||
|
}
|
||
|
|
||
|
public static byte[] UrlEncodeToBytes(byte[] bytes, int offset, int count) => bytes == null ? (byte[]) null : HttpEncoder.Current.UrlEncode(bytes, offset, count);
|
||
|
|
||
|
public static string HtmlDecode(string s)
|
||
|
{
|
||
|
if (s == null)
|
||
|
return (string) null;
|
||
|
using (StringWriter output = new StringWriter())
|
||
|
{
|
||
|
HttpEncoder.Current.HtmlDecode(s, (TextWriter) output);
|
||
|
return output.ToString();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public static NameValueCollection ParseQueryString(string query) => HttpUtility.ParseQueryString(query, Encoding.UTF8);
|
||
|
|
||
|
public static NameValueCollection ParseQueryString(
|
||
|
string query,
|
||
|
Encoding encoding)
|
||
|
{
|
||
|
if (query == null)
|
||
|
throw new ArgumentNullException(nameof (query));
|
||
|
if (encoding == null)
|
||
|
throw new ArgumentNullException(nameof (encoding));
|
||
|
if (query.Length == 0 || query.Length == 1 && query[0] == '?')
|
||
|
return (NameValueCollection) new HttpUtility.HttpQSCollection();
|
||
|
if (query[0] == '?')
|
||
|
query = query.Substring(1);
|
||
|
NameValueCollection result = (NameValueCollection) new HttpUtility.HttpQSCollection();
|
||
|
HttpUtility.ParseQueryString(query, encoding, result);
|
||
|
return result;
|
||
|
}
|
||
|
|
||
|
internal static void ParseQueryString(
|
||
|
string query,
|
||
|
Encoding encoding,
|
||
|
NameValueCollection result)
|
||
|
{
|
||
|
if (query.Length == 0)
|
||
|
return;
|
||
|
string str1 = HttpUtility.HtmlDecode(query);
|
||
|
int length = str1.Length;
|
||
|
int num1 = 0;
|
||
|
bool flag = true;
|
||
|
while (num1 <= length)
|
||
|
{
|
||
|
int startIndex = -1;
|
||
|
int num2 = -1;
|
||
|
for (int index = num1; index < length; ++index)
|
||
|
{
|
||
|
if (startIndex == -1 && str1[index] == '=')
|
||
|
startIndex = index + 1;
|
||
|
else if (str1[index] == '&')
|
||
|
{
|
||
|
num2 = index;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
if (flag)
|
||
|
{
|
||
|
flag = false;
|
||
|
if (str1[num1] == '?')
|
||
|
++num1;
|
||
|
}
|
||
|
string name;
|
||
|
if (startIndex == -1)
|
||
|
{
|
||
|
name = (string) null;
|
||
|
startIndex = num1;
|
||
|
}
|
||
|
else
|
||
|
name = HttpUtility.UrlDecode(str1.Substring(num1, startIndex - num1 - 1), encoding);
|
||
|
if (num2 < 0)
|
||
|
{
|
||
|
num1 = -1;
|
||
|
num2 = str1.Length;
|
||
|
}
|
||
|
else
|
||
|
num1 = num2 + 1;
|
||
|
string str2 = HttpUtility.UrlDecode(str1.Substring(startIndex, num2 - startIndex), encoding);
|
||
|
result.Add(name, str2);
|
||
|
if (num1 == -1)
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private sealed class HttpQSCollection : NameValueCollection
|
||
|
{
|
||
|
public override string ToString()
|
||
|
{
|
||
|
int count = this.Count;
|
||
|
if (count == 0)
|
||
|
return "";
|
||
|
StringBuilder stringBuilder = new StringBuilder();
|
||
|
string[] allKeys = this.AllKeys;
|
||
|
for (int index = 0; index < count; ++index)
|
||
|
stringBuilder.AppendFormat("{0}={1}&", (object) allKeys[index], (object) HttpUtility.UrlEncode(this[allKeys[index]]));
|
||
|
if (stringBuilder.Length > 0)
|
||
|
--stringBuilder.Length;
|
||
|
return stringBuilder.ToString();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|