func buildRequestContext()

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)
    }