in Sources/OSS/Signer/SignerV4.swift [96:168]
func preAuthQuery(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)])
// Expiration
let expiration = context.expirationTime ?? signTime.addingTimeInterval(15 * 60)
let expires = Int(expiration.timeIntervalSince1970 - signTime.timeIntervalSince1970)
context.expirationTime = expiration
// Scope
let scope = "\(date)/\(region)/\(product)/aliyun_v4_request"
// Other Headers
// Lowercase request headers
var headers: [String: String] = [:]
for (key, value) in request.headers {
headers[key.lowercased()] = value
}
// 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)
}
}
// Credential information signature
var query = request.requestUri.query ?? ""
if query.count > 0 {
query += "&"
}
query += "x-oss-signature-version=OSS4-HMAC-SHA256"
query += "&x-oss-date=\(datetime)"
query += "&x-oss-expires=\(expires)"
let credentialQuery = "\(cred.accessKeyId)/\(scope)"
query += "&x-oss-credential=\(credentialQuery.urlEncode()!)"
if additionalSignedHeaders.count > 0 {
let addHeaderStr = additionalSignedHeaders.sorted().joined(separator: ";")
query += "&x-oss-additional-headers=\(addHeaderStr.urlEncode()!)"
}
if let securityToken = cred.securityToken, !securityToken.isEmpty {
query += "&x-oss-security-token=\(securityToken.urlEncode()!)"
}
request.requestUri = URL(string: request.requestUri.absoluteString.split(separator: "?")[0] + "?" + query)!
// 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: ";")
}