sdk/Util/HttpUtils.cs (168 lines of code) (raw):
/*
* Copyright (C) Alibaba Cloud Computing
* All rights reserved.
*
*/
using System.Collections.Generic;
using System.Globalization;
using System.Text;
using System;
namespace Aliyun.OSS.Util
{
public static class HttpUtils
{
public const string Utf8Charset = "utf-8";
public const string Iso88591Charset = "iso-8859-1";
public const string UrlEncodingType = "url";
public const string HttpProto = "http://";
public const string HttpsProto = "https://";
public const string DefaultContentType = "application/octet-stream";
private const string UrlAllowedChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.~";
private const string UrlAllowedCharsPath = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.~/";
private static IDictionary<string, string> _mimeDict = new Dictionary<string, string>();
static HttpUtils()
{
char[] delimiterChars = { ' ', '\t'};
var mimeLines = Properties.Resources.MimeData.ToString().Split('\n');
foreach (var mimeLine in mimeLines)
{
var mimeParts = mimeLine.Split(delimiterChars, StringSplitOptions.RemoveEmptyEntries);
if (mimeParts.Length != 2)
{
continue;
}
var key = mimeParts[0].Trim();
var value = mimeParts[1].Trim();
_mimeDict[key] = value;
}
}
public static string ConbineQueryString(IEnumerable<KeyValuePair<string, string>> parameters)
{
var isFirst = true;
var queryString = new StringBuilder();
foreach (var p in parameters)
{
if (!isFirst)
queryString.Append("&");
isFirst = false;
queryString.Append(p.Key);
if (!string.IsNullOrEmpty(p.Value))
queryString.Append("=").Append(EncodeUri(p.Value, Utf8Charset));
}
return queryString.ToString();
}
public static string EncodeUri(string uriToEncode, string charset)
{
if (string.IsNullOrEmpty(uriToEncode))
return string.Empty;
const string escapeFlag = "%";
var encodedUri = new StringBuilder(uriToEncode.Length * 2);
var bytes = Encoding.GetEncoding(charset).GetBytes(uriToEncode);
foreach (var b in bytes)
{
char ch = (char)b;
if (UrlAllowedChars.IndexOf(ch) != -1)
encodedUri.Append(ch);
else
{
encodedUri.Append(escapeFlag).Append(
string.Format(CultureInfo.InvariantCulture, "{0:X2}", (int)b));
}
}
return encodedUri.ToString();
}
public static string EncodePath(string uriToEncode)
{
if (string.IsNullOrEmpty(uriToEncode))
return string.Empty;
var encoded = new StringBuilder(uriToEncode.Length * 2);
foreach (char symbol in Encoding.UTF8.GetBytes(uriToEncode))
{
if (UrlAllowedCharsPath.IndexOf(symbol) != -1)
encoded.Append(symbol);
else
encoded.Append("%").Append(String.Format("{0:X2}", (int)symbol));
}
return encoded.ToString();
}
public static string DecodeUri(string uriToDecode)
{
if (!string.IsNullOrEmpty(uriToDecode))
{
uriToDecode = uriToDecode.Replace("+", " ");
return Uri.UnescapeDataString(uriToDecode);
}
return string.Empty;
}
public static string Reencode(string data, string fromCharset, string toCharset)
{
if (string.IsNullOrEmpty(data))
return string.Empty;
var bytes = Encoding.GetEncoding(fromCharset).GetBytes(data);
return Encoding.GetEncoding(toCharset).GetString(bytes);
}
public static string GetContentType(string key, string file)
{
string fileType = "";
try
{
if (file != null)
{
fileType = System.IO.Path.GetExtension(file);
}
else if (key != null)
{
fileType = System.IO.Path.GetExtension(key);
}
}
catch
{
}
fileType = fileType.Trim().TrimStart(new char[1] { '.' }).ToLower();
if (_mimeDict.ContainsKey(fileType))
{
return _mimeDict[fileType];
}
return DefaultContentType;
}
public static string JsonEscapeString(string src)
{
if (src == null)
return null;
for (int i = 0; i < src.Length; i++)
if (JsonNeedEscape(src, i))
{
var sb = new StringBuilder();
if (i > 0)
sb.Append(src, 0, i);
return JsonDoEscapeString(sb, src, i);
}
return src;
}
internal static bool JsonNeedEscape(string src, int i)
{
char c = src[i];
return c < 32 || c == '"' || c == '\\'
// Broken lead surrogate
|| (c >= '\uD800' && c <= '\uDBFF' &&
(i == src.Length - 1 || src[i + 1] < '\uDC00' || src[i + 1] > '\uDFFF'))
// Broken tail surrogate
|| (c >= '\uDC00' && c <= '\uDFFF' &&
(i == 0 || src[i - 1] < '\uD800' || src[i - 1] > '\uDBFF'))
// To produce valid JavaScript
|| c == '\u2028' || c == '\u2029'
// Escape "</" for <script> tags
|| (c == '/' && i > 0 && src[i - 1] == '<');
}
internal static string JsonDoEscapeString(StringBuilder sb, string src, int cur)
{
int start = cur;
for (int i = cur; i < src.Length; i++)
if (JsonNeedEscape(src, i))
{
sb.Append(src, start, i - start);
switch (src[i])
{
case '\b': sb.Append("\\b"); break;
case '\f': sb.Append("\\f"); break;
case '\n': sb.Append("\\n"); break;
case '\r': sb.Append("\\r"); break;
case '\t': sb.Append("\\t"); break;
case '\"': sb.Append("\\\""); break;
case '\\': sb.Append("\\\\"); break;
case '/': sb.Append("\\/"); break;
default:
sb.Append("\\u");
sb.Append(((int)src[i]).ToString("x04"));
break;
}
start = i + 1;
}
sb.Append(src, start, src.Length - start);
return sb.ToString();
}
}
}