in Sources/OSS/Internal/ClientImpl.swift [329:397]
func buildRequestContext(
with input: inout OperationInput,
opts: OperationOptions?
) throws -> (RequestMessage, ExecuteContext) {
// default api options
let retryMaxAttempts = opts?.retryMaxAttempts
let readWriteTimeout = opts?.readWriteTimeout
var responseHandlers: [ResponseHandler] = [ServerResponseHandler()]
// response delegate
if let handlers = input.metadata.values(key: AttributeKeys.responseHandler) {
handlers.forEach { value in responseHandlers.append(value) }
}
// signing context
var signingContext = SigningContext(
bucket: input.bucket,
key: input.key,
region: options.region,
product: options.product
)
// signing time from user
if let expirationTime = input.metadata.get(key: AttributeKeys.expirationTime) {
signingContext.expirationTime = expirationTime
}
// request
// request::host & path & query
guard let endpoint = options.endpoint else {
throw ClientError.endpointInvalidError()
}
let baseUrl = input.buildHostPath(
host: endpoint.hostPort(),
addressStyle: options.addressStyle
)
var url = "\(endpoint.scheme!)://\(baseUrl)"
let query = input.queryString()
if !query.isEmpty {
url = "\(url)?\(query)"
}
guard let uri = URL(string: url) else {
throw ClientError.requestError(detail: "Build url fail. url: \(url)")
}
// request::headers
var headers: [String: String] = [:]
input.headers.forEach { key, value in headers[key.lowercased()] = value }
headers["user-agent"] = innerOptions.userAgent
// request::body
let request = RequestMessage(
method: input.method,
requestUri: uri,
headers: headers,
content: input.body
)
let context = ExecuteContext(
retryMaxAttempts: retryMaxAttempts,
readWriteTimeout: readWriteTimeout,
signingContext: signingContext,
progressDelegate: input.metadata.get(key: AttributeKeys.progressDelegate),
responseHandlers: responseHandlers,
saveToURL: opts?.saveToURL
)
return (request, context)
}