in Sources/OSS/Signer/SignerV4.swift [30:86]
func preAuthHeader(request: inout RequestMessage, context: inout SigningContext) {
let cred = context.credentials!
let region = context.region ?? ""
let product = context.product ?? ""
// Date
let signTime = context.signTime ?? Date().addingTimeInterval(context.clockOffset ?? 0)
let datetime = Self.iso8601Datetime.string(from: signTime)
let date = String(datetime[datetime.startIndex ..< datetime.index(datetime.startIndex, offsetBy: 8)])
let datetimeGmt = Self.rfc822Datetime.string(from: signTime)
// Scope
let scope = "\(date)/\(region)/\(product)/aliyun_v4_request"
// Credential information signature
if let securityToken = cred.securityToken, !securityToken.isEmpty {
request.headers["x-oss-security-token"] = cred.securityToken
}
// Other Headers
request.headers["x-oss-content-sha256"] = "UNSIGNED-PAYLOAD"
request.headers["x-oss-date"] = datetime
request.headers["Date"] = datetimeGmt
// Lowercase request headers
var headers: [String: String] = [:]
for (key, value) in request.headers {
headers[key.lowercased()] = value
}
// let headers = request.headers
// Lowercase additional headers
var additionalSignedHeaders: [String] = []
context.additionalHeaderNames?.forEach { key in
let lowkey = key.lowercased()
if !(lowkey == "content-md5" ||
lowkey == "content-type" ||
lowkey.hasPrefix("x-oss-")) && headers.keys.contains(lowkey)
{
additionalSignedHeaders.append(lowkey)
}
}
// CanonicalRequest
let canonicalRequest = calcCanonicalRequest(
request: request,
resourcePath: resourcePath(bucket: context.bucket, key: context.key),
headers: headers,
additionalHeaders: additionalSignedHeaders
)
// StringToSign
context.stringToSign = calcStringToSign(datetime: datetime, scope: scope, canonicalRequest: canonicalRequest)
context.dateToSign = date
context.scopeToSign = scope
context.additionalHeadersToSign = additionalSignedHeaders.sorted().joined(separator: ";")
}