util/csharp/core/Common.cs (144 lines of code) (raw):
/**
* This module used for OpenSearch SDK
*/
// This file is auto-generated, don't edit it. Thanks.
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;
using System.Linq;
using System.Security.Cryptography;
using Tea;
using Tea.Utils;
using System.Text;
using System.Globalization;
namespace AlibabaCloud.OpenSearchUtil
{
public class Common
{
/**
* Append a string into a string arrat
* @example append(["a", "b"], "c") => ["a", "b", "c"]
* @param strings the string list
* @param item the string to be appended
* @return new array
*/
public static List<string> Append(List<string> strings, string item)
{
strings.Add(item);
return strings;
}
/**
* get the map's keys
* @param m the map
* @return new array
*/
public static List<string> Keys(Dictionary<string, object> m)
{
return m.Keys.ToList();
}
/**
* Join array elements with a spearator string.
* @example join(["a", "b"], ".") => "a.b"
* @param strings the string list
* @param spearator the spearator
* @return the joined string
*/
public static string Join(List<string> strings, string separator)
{
return string.Join(separator, strings);
}
/**
* Get date.
* @example 2006-01-02T15:04:05Z
* @return date string
*/
public static string GetDate()
{
return DateTime.Now.ToUniversalTime().ToString("yyyy-MM-dd'T'HH:mm:ss'Z'");
}
/**
* Get signature with request, accesskeyId, accessKeySecret.
* @param origin the source map
* @return signature string
*/
public static string GetSignature(TeaRequest request, string accessKeyId, string accessKeySecret)
{
return "OPENSEARCH " + accessKeyId + ":" + GetSignature(request, accessKeySecret);
}
/**
* Get content MD5.
* @param content the string which will be calculated
* @return md5 string
*/
public static string GetContentMD5(string content)
{
using (MD5 md5Hash = MD5.Create())
{
byte[] data = md5Hash.ComputeHash(Encoding.UTF8.GetBytes(content));
StringBuilder sBuilder = new StringBuilder();
for (int i = 0; i < data.Length; i++)
{
sBuilder.Append(data[i].ToString("x2"));
}
return sBuilder.ToString();
}
}
/**
* Splice origin into string with sep.
* @param origin the source map
* @param sep the spearator
* @return the spliced string
*/
public static string MapToString(Dictionary<string, string> origin, string sep)
{
string ret = string.Empty;
foreach (var keypair in origin)
{
ret += keypair.Key + sep + keypair.Value + ",";
}
return ret.TrimEnd(',');
}
/**
* Compose the string to Sign.
* @param request TeaRequest
* @param resource opensearch Uri with path.
* @param accessKeySecret .
* @return SignedStr SignedString.
*/
internal static string GetSignedStr(TeaRequest request, string resource, string accessKeySecret)
{
// Find out the "x-opensearch-"'s address in header of the request
var tmp = new Dictionary<string, string>();
foreach (var keypair in request.Headers)
{
if (keypair.Key.ToSafeString().ToLower().StartsWith("x-opensearch-"))
{
tmp.Add(keypair.Key.ToSafeString().ToLower(), keypair.Value);
}
}
List<string> sortedKeys = tmp.Keys.ToList();
sortedKeys.Sort();
// Get the canonicalizedHeaders
string canonicalizedHeaders = string.Empty;
foreach (string key in sortedKeys)
{
canonicalizedHeaders += string.Format("{0}:{1}\n", key, tmp[key]);
}
// Give other parameters values
// when sign URL, date is expires
string contentType = request.Headers.Get("Content-Type");
string contentMd5 = request.Headers.Get("Content-MD5").ToSafeString();
string date = request.Headers.Get("Date");
string method = request.Method.ToUpper();
string signStr = string.Format("{0}\n{1}\n{2}\n{3}\n{4}{5}", method, contentMd5, contentType, date, canonicalizedHeaders, resource);
System.Diagnostics.Debug.WriteLine("Alibabacloud.OpenSearchUtil.GetSignature:stringToSign is " + signStr.ToString());
byte[] signData;
using (KeyedHashAlgorithm algorithm = CryptoConfig.CreateFromName("HMACSHA1") as KeyedHashAlgorithm)
{
algorithm.Key = Encoding.UTF8.GetBytes(accessKeySecret);
signData = algorithm.ComputeHash(Encoding.UTF8.GetBytes(signStr.ToString().ToCharArray()));
}
string signedStr = System.Convert.ToBase64String(signData);
return signedStr;
}
internal static string GetSignature(TeaRequest request, string accessKeySecret)
{
string resource = request.Pathname
.Replace("%2F", "/")
.Replace("%3F", "?")
.Replace("%3D", "=")
.Replace("%26", "&");
List<string> sortedKeys = request.Query.Keys.ToList();
var queryPairsList = new List<string>();
sortedKeys.Sort();
foreach (string key in sortedKeys)
{
string value = request.Query.Get(key);
if (value == null)
{
continue;
}
string valueStr = PercentEncode(value);
valueStr = valueStr.Replace("'", "%27");
queryPairsList.Add(key + "=" + valueStr);
}
String queryPairsString = Join(queryPairsList, "&");
if (queryPairsString.Length > 0)
{
resource = resource + "?" + queryPairsString;
}
return GetSignedStr(request, resource, accessKeySecret);
}
internal static string PercentEncode(string value)
{
if (value == null)
{
return null;
}
var stringBuilder = new StringBuilder();
var text = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.~";
var bytes = Encoding.UTF8.GetBytes(value);
foreach (char c in bytes)
{
if (text.IndexOf(c) >= 0)
{
stringBuilder.Append(c);
}
else
{
stringBuilder.Append("%").Append(string.Format(CultureInfo.InvariantCulture, "{0:X2}", (int) c));
}
}
string encodeStr = stringBuilder.ToString()
.Replace("*", "%2A");
return encodeStr;
}
}
}