swift/Sources/AlibabaCloudOssSdk/Client.swift (186 lines of code) (raw):
import Foundation
import Tea
import TeaUtils
import AlibabaCloudOSSUtil
import DarabonbaXML
import TeaFileForm
import AlibabaCloudCredentials
open class Client {
public var _endpoint: String?
public var _regionId: String?
public var _hostModel: String?
public var _protocol: String?
public var _readTimeout: Int?
public var _connectTimeout: Int?
public var _signatureVersion: String?
public var _addtionalHeaders: [String]?
public var _localAddr: String?
public var _httpProxy: String?
public var _httpsProxy: String?
public var _noProxy: String?
public var _userAgent: String?
public var _socks5Proxy: String?
public var _isEnableCrc: Bool?
public var _isEnableMD5: Bool?
public var _socks5NetWork: String?
public var _maxIdleConns: Int?
public var _credential: AlibabaCloudCredentials.Client?
public init(_ config: Config) throws {
if (TeaUtils.Client.isUnset(config)) {
throw Tea.ReuqestError([
"name": "ParameterMissing",
"message": "'config' can not be unset"
])
}
if (TeaUtils.Client.empty(config.type)) {
config.type = "access_key"
}
var credentialConfig: AlibabaCloudCredentials.Config = AlibabaCloudCredentials.Config([
"accessKeyId": config.accessKeyId ?? "",
"type": config.type ?? "",
"accessKeySecret": config.accessKeySecret ?? "",
"securityToken": config.securityToken ?? ""
])
self._credential = AlibabaCloudCredentials.Client(credentialConfig)
if (TeaUtils.Client.isUnset(config.isEnableMD5)) {
config.isEnableMD5 = false
}
if (TeaUtils.Client.isUnset(config.isEnableCrc)) {
config.isEnableCrc = false
}
self._endpoint = config.endpoint
self._protocol = config.protocol_
self._regionId = config.regionId
self._userAgent = config.userAgent
self._readTimeout = config.readTimeout
self._connectTimeout = config.connectTimeout
self._localAddr = config.localAddr
self._httpProxy = config.httpProxy
self._httpsProxy = config.httpsProxy
self._noProxy = config.noProxy
self._socks5Proxy = config.socks5Proxy
self._socks5NetWork = config.socks5NetWork
self._maxIdleConns = config.maxIdleConns
self._signatureVersion = config.signatureVersion
self._addtionalHeaders = config.addtionalHeaders
self._hostModel = config.hostModel
self._isEnableMD5 = config.isEnableMD5
self._isEnableCrc = config.isEnableCrc
}
@available(macOS 10.15, iOS 13, tvOS 13, watchOS 6, *)
public func postObject(_ request: PostObjectRequest, _ runtime: AlibabaCloudOSSUtil.RuntimeOptions) async throws -> PostObjectResponse {
try request.validate()
try runtime.validate()
var _runtime: [String: Any] = [
"timeouted": "retry",
"readTimeout": TeaUtils.Client.defaultNumber(runtime.readTimeout, self._readTimeout),
"connectTimeout": TeaUtils.Client.defaultNumber(runtime.connectTimeout, self._connectTimeout),
"httpProxy": TeaUtils.Client.defaultString(runtime.httpProxy, self._httpProxy),
"httpsProxy": TeaUtils.Client.defaultString(runtime.httpsProxy, self._httpsProxy),
"noProxy": TeaUtils.Client.defaultString(runtime.noProxy, self._noProxy),
"maxIdleConns": TeaUtils.Client.defaultNumber(runtime.maxIdleConns, self._maxIdleConns),
"retry": [
"retryable": runtime.autoretry!,
"maxAttempts": TeaUtils.Client.defaultNumber(runtime.maxAttempts, 3)
],
"backoff": [
"policy": TeaUtils.Client.defaultString(runtime.backoffPolicy, "no"),
"period": TeaUtils.Client.defaultNumber(runtime.backoffPeriod, 1)
],
"ignoreSSL": Client.defaultAny(runtime.ignoreSSL, false)
]
var _lastRequest: Tea.TeaRequest? = nil
var _lastException: Tea.TeaError? = nil
var _now: Int32 = Tea.TeaCore.timeNow()
var _retryTimes: Int32 = 0
while (Tea.TeaCore.allowRetry(_runtime["retry"], _retryTimes, _now)) {
if (_retryTimes > 0) {
var _backoffTime: Int32 = Tea.TeaCore.getBackoffTime(_runtime["backoff"], _retryTimes)
if (_backoffTime > 0) {
Tea.TeaCore.sleep(_backoffTime)
}
}
_retryTimes = _retryTimes + 1
do {
var _request: Tea.TeaRequest = Tea.TeaRequest()
var boundary: String = TeaFileForm.Client.getBoundary()
_request.protocol_ = self._protocol ?? ""
_request.method = "POST"
_request.pathname = "/"
_request.headers = [
"host": AlibabaCloudOSSUtil.Client.getHost(request.bucketName, self._regionId, self._endpoint, self._hostModel),
"date": TeaUtils.Client.getDateUTCString(),
"user-agent": getUserAgent()
]
_request.headers["content-type"] = "multipart/form-data; boundary=" + boundary;
var form: [String: Any] = Tea.TeaConverter.merge([
"OSSAccessKeyId": request.header!.accessKeyId ?? "",
"policy": request.header!.policy ?? "",
"Signature": request.header!.signature ?? "",
"key": request.header!.key ?? "",
"success_action_status": request.header!.successActionStatus ?? "",
"file": request.header!.file!
], AlibabaCloudOSSUtil.Client.toMeta(request.header!.userMeta, "x-oss-meta-"))
_request.body = TeaFileForm.Client.toFileForm(form, boundary)
_lastRequest = _request
var _response: Tea.TeaResponse = try await Tea.TeaCore.doAction(_request, _runtime)
var respMap: [String: Any] = [:]
var bodyStr: String = try await TeaUtils.Client.readAsString(_response.body)
if (TeaUtils.Client.is4xx(_response.statusCode) || TeaUtils.Client.is5xx(_response.statusCode)) {
respMap = AlibabaCloudOSSUtil.Client.getErrMessage(bodyStr)
throw Tea.ReuqestError([
"code": respMap["Code"]!,
"message": respMap["Message"]!,
"data": [
"httpCode": _response.statusCode,
"requestId": respMap["RequestId"]!,
"hostId": respMap["HostId"]!
]
])
}
respMap = DarabonbaXML.Client.parseXml(bodyStr, PostObjectResponse())
return Tea.TeaConverter.fromMap(PostObjectResponse(), respMap)
}
catch {
if (Tea.TeaCore.isRetryable(error)) {
_lastException = error as! Tea.RetryableError
continue
}
throw error
}
}
throw Tea.UnretryableError(_lastRequest, _lastException)
}
public func setUserAgent(_ userAgent: String) -> Void {
self._userAgent = userAgent
}
public func appendUserAgent(_ userAgent: String) -> Void {
self._userAgent = self._userAgent ?? "" + " " + userAgent
}
public func getUserAgent() -> String {
var userAgent: String = TeaUtils.Client.getUserAgent(self._userAgent)
return userAgent as! String
}
@available(macOS 10.15, iOS 13, tvOS 13, watchOS 6, *)
public func getAccessKeyId() async throws -> String {
if (TeaUtils.Client.isUnset(self._credential)) {
return ""
}
var accessKeyId: String = try await self._credential!.getAccessKeyId()
return accessKeyId as! String
}
@available(macOS 10.15, iOS 13, tvOS 13, watchOS 6, *)
public func getAccessKeySecret() async throws -> String {
if (TeaUtils.Client.isUnset(self._credential)) {
return ""
}
var secret: String = try await self._credential!.getAccessKeySecret()
return secret as! String
}
public static func defaultAny(_ inputValue: Any?, _ defaultValue: Any?) -> Any {
if (TeaUtils.Client.isUnset(inputValue)) {
return defaultValue as! Any
}
return inputValue as! Any
}
}