aliyun-net-credentials/Http/HttpRequest.cs (160 lines of code) (raw):
using System;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Text.RegularExpressions;
using System.Collections.Generic;
using Aliyun.Credentials.Exceptions;
using Aliyun.Credentials.Utils;
namespace Aliyun.Credentials.Http
{
public class HttpRequest
{
private FormatType? contentType;
protected static readonly string UserAgent = "User-Agent";
private static readonly string DefaultUserAgent;
static HttpRequest()
{
DefaultUserAgent = GetDefaultUserAgent();
}
public HttpRequest()
{
Headers = new Dictionary<string, string>
{
{ UserAgent, DefaultUserAgent }
};
UrlParameters = new Dictionary<string, string>();
}
public HttpRequest(string strUrl)
{
Url = strUrl;
Headers = new Dictionary<string, string>
{
{ UserAgent, DefaultUserAgent }
};
UrlParameters = new Dictionary<string, string>();
}
public HttpRequest(string strUrl, Dictionary<string, string> tmpHeaders)
{
Url = strUrl;
if (null != tmpHeaders)
{
Headers = tmpHeaders;
Headers[UserAgent] = DefaultUserAgent;
}
else
{
Headers = new Dictionary<string, string>
{
{ UserAgent, DefaultUserAgent }
};
}
UrlParameters = new Dictionary<string, string>();
}
public void SetCommonUrlParameters()
{
DictionaryUtil.Add(UrlParameters, "Timestamp", ParameterHelper.FormatIso8601Date(DateTime.UtcNow));
DictionaryUtil.Add(UrlParameters, "SignatureNonce", Guid.NewGuid().ToString());
DictionaryUtil.Add(UrlParameters, "SignatureMethod", "HMAC-SHA1");
DictionaryUtil.Add(UrlParameters, "SignatureVersion", "1.0");
}
public void AddUrlParameter(string key, string value)
{
DictionaryUtil.Add(UrlParameters, key, value);
}
public string GetHttpContentString()
{
string stringContent = string.Empty;
if (this.Content != null)
{
try
{
if (string.IsNullOrWhiteSpace(this.Encoding))
{
stringContent = Convert.ToBase64String(this.Content);
}
else
{
stringContent = System.Text.Encoding.GetEncoding(Encoding).GetString(this.Content);
}
}
catch
{
throw new CredentialException("Can not parse response due to unsupported encoding.");
}
}
return stringContent;
}
public void SetHttpContent(byte[] content, string encoding, FormatType? format)
{
if (content == null)
{
contentType = null;
Content = null;
Encoding = null;
Headers.Remove("Content-MD5");
Headers.Remove("Content-Type");
Headers["Content-Length"] = "0";
return;
}
if (Method == MethodType.GET)
{
content = new byte[0];
}
Content = content;
Encoding = encoding;
string contentLen = content.Length.ToString();
string strMd5 = ParameterHelper.Md5SumAndBase64(content);
Headers["Content-MD5"] = strMd5;
Headers["Content-Length"] = contentLen;
if (format != null)
{
Headers["Content-Type"] = ParameterHelper.FormatTypeToString(format);
}
}
public Dictionary<string, string> Headers { get; set; }
public Dictionary<string, string> UrlParameters { get; set; }
public string Url { get; set; }
public MethodType? Method { get; set; }
public FormatType? ContentType
{
get { return contentType; }
set
{
if (value != null)
{
this.contentType = value;
}
}
}
internal static string GetDefaultUserAgent()
{
string osVersion = Environment.OSVersion.ToString();
string clientVersion = GetRuntimeRegexValue(RuntimeEnvironment.GetRuntimeDirectory());
string version = Assembly.GetExecutingAssembly().GetName().Version.ToString();
string defaultUserAgent = string.Format("AlibabaCloud ({0}) {1} Credentials/{2} TeaDSL/1",
osVersion,
clientVersion,
version
);
return defaultUserAgent;
}
internal static string GetRuntimeRegexValue(string value)
{
var rx = new Regex(@"(\.NET).*(\\|\/).*(\d)", RegexOptions.Compiled | RegexOptions.IgnoreCase);
var matches = rx.Match(value);
char[] separator = { '\\', '/' };
if (matches.Success)
{
var clientValueArray = matches.Value.Split(separator);
return BuildClientVersion(clientValueArray);
}
return "RuntimeNotFound";
}
internal static string BuildClientVersion(string[] value)
{
var finalValue = "";
for (var i = 0; i < value.Length - 1; ++i)
{
finalValue += value[i].Replace(".", "").ToLower();
}
finalValue += "/" + value[value.Length - 1];
return finalValue;
}
public byte[] Content { get; set; }
public string Encoding { get; set; }
public int ReadTimeout { get; set; }
public int ConnectTimeout { get; set; }
}
}