func preAuthHeader()

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