func preAuthQuery()

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: ";")
    }