in sdk/Util/SignUtils.cs [45:94]
public static string BuildCanonicalString(string method, string resourcePath,
ServiceRequest request)
{
var canonicalString = new StringBuilder();
canonicalString.Append(method).Append(NewLineMarker);
var headers = request.Headers;
IDictionary<string, string> headersToSign = new Dictionary<string, string>();
if (headers != null)
{
foreach (var header in headers)
{
var lowerKey = header.Key.ToLowerInvariant();
if (lowerKey == HttpHeaders.ContentType.ToLowerInvariant()
|| lowerKey == HttpHeaders.ContentMd5.ToLowerInvariant()
|| lowerKey == HttpHeaders.Date.ToLowerInvariant()
|| lowerKey.StartsWith(OssHeaders.OssPrefix))
{
headersToSign.Add(lowerKey, header.Value);
}
}
}
if (!headersToSign.ContainsKey(HttpHeaders.ContentType.ToLowerInvariant()))
headersToSign.Add(HttpHeaders.ContentType.ToLowerInvariant(), "");
if (!headersToSign.ContainsKey(HttpHeaders.ContentMd5.ToLowerInvariant()))
headersToSign.Add(HttpHeaders.ContentMd5.ToLowerInvariant(), "");
// Add all headers to sign into canonical string,
// note that these headers should be ordered before adding.
var sortedHeaders = new List<string>(headersToSign.Keys);
sortedHeaders.Sort(new KeyComparer());
foreach (var key in sortedHeaders)
{
var value = headersToSign[key];
if (key.StartsWith(OssHeaders.OssPrefix))
canonicalString.Append(key).Append(':').Append(value);
else
canonicalString.Append(value);
canonicalString.Append(NewLineMarker);
}
// Add canonical resource
canonicalString.Append(BuildCanonicalizedResource(resourcePath, request.Parameters));
return canonicalString.ToString();
}