private static string CanonicalizeRequest()

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();
        }