Sources/OSS/Internal/SignerMiddleware.swift (42 lines of code) (raw):
import Foundation
private struct NopCredentialsProvider: CredentialsProvider {
let cred = Credentials(accessKeyId: "", accessKeySecret: "")
public func getCredentials() async throws -> Credentials {
return cred
}
}
class SignerMiddleware: ExecuteMiddleware {
let signer: Signer
let nextHandler: ExecuteMiddleware
let provider: CredentialsProvider
private let logger: LogAgent?
init(
nextHandler: ExecuteMiddleware,
signer: Signer,
provider: CredentialsProvider?,
logger: LogAgent? = nil
) {
self.nextHandler = nextHandler
self.signer = signer
self.provider = provider ?? NopCredentialsProvider()
self.logger = logger
}
public func execute(request: RequestMessage, context: ExecuteContext) async throws -> ResponseMessage {
if provider is AnonymousCredentialsProvider {
return try await nextHandler.execute(request: request, context: context)
}
let credentials: Credentials
do {
credentials = try await provider.getCredentials()
} catch {
throw ClientError.credentialsFetchError(innerError: error)
}
if credentials.isEmpty() {
throw ClientError.credentialsEmptyError()
}
context.signingContext?.credentials = credentials
let req = try await signer.sign(request: request, signingContext: &(context.signingContext!))
logger?.info("stringToSign: \n\(context.signingContext!.stringToSign)")
return try await nextHandler.execute(request: req, context: context)
}
}