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
}