in src/AlibabaCloud.OSS.V2/Signer/SignerV4.cs [188:254]
private static string CanonicalizeRequest(
RequestMessage request,
string resourcePath,
IDictionary<string, string> headers,
List<string> additionalHeaders
)
{
/*
Canonical Request
HTTP Verb + "\n" +
Canonical URI + "\n" +
Canonical Query String + "\n" +
Canonical Headers + "\n" +
Additional Headers + "\n" +
Hashed PayLoad
*/
var httpMethod = request.Method.ToUpperInvariant();
// Canonical Uri
var canonicalUri = resourcePath.UrlEncodePath();
// Canonical Query
var sortedParameters = new SortedDictionary<string, string>(StringComparer.Ordinal);
if (request.RequestUri.Query.IsNotEmpty())
{
var query = request.RequestUri.Query;
if (query.StartsWith("?")) query = query.Substring(1);
foreach (var param in query.Split(new char[] { '&' }, StringSplitOptions.RemoveEmptyEntries))
{
var parts = param.Split(new char[] { '=' }, 2);
sortedParameters.Add(parts[0], parts.Length == 1 ? "" : parts[1]);
}
}
var sb = new StringBuilder();
foreach (var p in sortedParameters)
{
if (sb.Length > 0)
sb.Append("&");
sb.AppendFormat("{0}", p.Key);
if (p.Value.Length > 0)
sb.AppendFormat("={0}", p.Value);
}
var canonicalQueryString = sb.ToString();
var canonicalHeaderString = CanonicalizeHeaders(headers, additionalHeaders);
// Additional Headers
var additionalHeadersString = additionalHeaders.JoinToString(";");
var hashBody = CanonicalizeBodyHash(headers);
var canonicalRequest = new StringBuilder();
canonicalRequest.AppendFormat("{0}\n", httpMethod);
canonicalRequest.AppendFormat("{0}\n", canonicalUri);
canonicalRequest.AppendFormat("{0}\n", canonicalQueryString);
canonicalRequest.AppendFormat("{0}\n", canonicalHeaderString);
canonicalRequest.AppendFormat("{0}\n", additionalHeadersString);
canonicalRequest.AppendFormat("{0}", hashBody);
return canonicalRequest.ToString();
}