func calcCanonicalRequest()

in Sources/OSS/Signer/SignerV4.swift [177:245]


    func calcCanonicalRequest(request: RequestMessage, resourcePath: String, headers: [String: String], additionalHeaders: [String]) -> String {
        /*
         Canonical Request
         HTTP Verb + "\n" +
         Canonical URI + "\n" +
         Canonical Query String + "\n" +
         Canonical Headers + "\n" +
         Additional Headers + "\n" +
         Hashed PayLoad
         */
        let verb = request.method.uppercased()

        let canonicalUri = resourcePath.urlEncodeWithoutSeparator()!

        let canonicalQueries: String
        let urlComps = URLComponents(url: request.requestUri, resolvingAgainstBaseURL: false)!
        let queryItems = urlComps.queryItems
        // print("queryItems: \(queryItems)\n")
        if queryItems != nil {
            canonicalQueries = queryItems!
                .map { (name: $0.name.urlEncode()!, value: $0.value?.urlEncode()) }
                .sorted { $0.name < $1.name }
                .map {
                    if let value = $0.value, value != "" {
                        return "\($0.name)=\(value)"
                    }
                    return "\($0.name)"
                }
                .joined(separator: "&")
        } else {
            canonicalQueries = ""
        }

        let canonicalHeaders = headers
            .filter {
                if $0.key == "content-md5" ||
                    $0.key == "content-type" ||
                    $0.key.hasPrefix("x-oss-") ||
                    additionalHeaders.contains($0.key)
                {
                    return true
                }
                return false
            }
            .map { (key: $0.key, value: $0.value.trim()) }
            .sorted { $0.key < $1.key }
            .map { "\($0.key):\($0.value)\n" }
            .joined(separator: "")

        let canonicalAdditionalHeaders = additionalHeaders
            .sorted()
            .joined(separator: ";")

        let hashedPayLoad = headers["x-oss-content-sha256"] ?? "UNSIGNED-PAYLOAD"

        let canonicalRequest =
            """
            \(verb)\n\
            \(canonicalUri)\n\
            \(canonicalQueries)\n\
            \(canonicalHeaders)\n\
            \(canonicalAdditionalHeaders)\n\
            \(hashedPayLoad)
            """

        // print("canonicalRequest:\n\(canonicalRequest)\n")

        return canonicalRequest
    }