Sources/OSS/Transform/SerdeObjectBasic.swift (412 lines of code) (raw):
import Foundation
// MARK: - PutObject
extension Serde {
static func serializePutObject(
_ request: inout PutObjectRequest,
_ input: inout OperationInput
) throws {
if let value = request.forbidOverwrite {
input.headers["x-oss-forbid-overwrite"] = String(value)
}
if let value = request.serverSideEncryption {
input.headers["x-oss-server-side-encryption"] = value
}
if let value = request.serverSideDataEncryption {
input.headers["x-oss-server-side-data-encryption"] = value
}
if let value = request.serverSideEncryptionKeyId {
input.headers["x-oss-server-side-encryption-key-id"] = value
}
if let value = request.objectAcl {
input.headers["x-oss-object-acl"] = value
}
if let value = request.storageClass {
input.headers["x-oss-storage-class"] = value
}
if let value = request.tagging {
input.headers["x-oss-tagging"] = value
}
if let value = request.cacheControl {
input.headers["Cache-Control"] = value
}
if let value = request.contentDisposition {
input.headers["Content-Disposition"] = value
}
if let value = request.contentEncoding {
input.headers["Content-Encoding"] = value
}
if let value = request.expires {
input.headers["Expires"] = value
}
if let value = request.contentMd5 {
input.headers["Content-MD5"] = value
}
if let value = request.contentType {
input.headers["Content-Type"] = value
}
if let value = request.callback {
input.headers["x-oss-callback"] = value
}
if let value = request.callbackVar {
input.headers["x-oss-callback-var"] = value
}
if let value = request.trafficLimit {
input.headers["x-oss-traffic-limit"] = String(value)
}
if let value = request.metadata {
for (k, v) in value {
input.headers["x-oss-meta-\(k)"] = v
}
}
input.body = request.body
}
static func deserializePutObject(
_ result: inout PutObjectResult,
_ output: inout OperationOutput
) throws {
if let data = try output.body?.readData() {
result.callbackResult = data
}
}
}
// MARK: - CopyObject
extension Serde {
static func serializeCopyObject(
_ request: inout CopyObjectRequest,
_ input: inout OperationInput
) throws {
if let sourceBucket = request.sourceBucket,
let sourceKey = request.sourceKey
{
input.headers["x-oss-copy-source"] = "/\(sourceBucket)/\(sourceKey)"
}
if let value = request.forbidOverwrite {
input.headers["x-oss-forbid-overwrite"] = value.toString()
}
if let value = request.copySourceIfMatch {
input.headers["x-oss-copy-source-if-match"] = value
}
if let value = request.copySourceIfNoneMatch {
input.headers["x-oss-copy-source-if-none-match"] = value
}
if let value = request.copySourceIfUnmodifiedSince {
input.headers["x-oss-copy-source-if-unmodified-since"] = value
}
if let value = request.copySourceIfModifiedSince {
input.headers["x-oss-copy-source-if-modified-since"] = value
}
if let value = request.metadataDirective {
input.headers["x-oss-metadata-directive"] = value
}
if let value = request.serverSideEncryption {
input.headers["x-oss-server-side-encryption"] = value
}
if let value = request.serverSideDataEncryption {
input.headers["x-oss-server-side-data-encryption"] = value
}
if let value = request.serverSideEncryptionKeyId {
input.headers["x-oss-server-side-encryption-key-id"] = value
}
if let value = request.objectAcl {
input.headers["x-oss-object-acl"] = value
}
if let value = request.storageClass {
input.headers["x-oss-storage-class"] = value
}
if let value = request.tagging {
input.headers["x-oss-tagging"] = value
}
if let value = request.taggingDirective {
input.headers["x-oss-tagging-directive"] = value
}
if let value = request.cacheControl {
input.headers["Cache-Control"] = value
}
if let value = request.contentDisposition {
input.headers["Content-Disposition"] = value
}
if let value = request.contentEncoding {
input.headers["Content-Encoding"] = value
}
if let value = request.expires {
input.headers["Expires"] = value
}
if let value = request.contentMd5 {
input.headers["Content-MD5"] = value
}
if let value = request.contentType {
input.headers["Content-Type"] = value
}
if let value = request.trafficLimit {
input.headers["x-oss-traffic-limit"] = String(value)
}
if let value = request.metadata {
for (k, v) in value {
input.headers["x-oss-meta-\(k)"] = v
}
}
}
static func deserializeCopyObject(
_ result: inout CopyObjectResult,
_ output: inout OperationOutput
) throws {
let body: [String: String] = try Serde.deserializeXml(output.body, "CopyObjectResult")
result.etag = body["ETag"]
if let lastModified = body["LastModified"] {
result.lastModified = lastModified
}
}
}
// MARK: - GetObject
extension Serde {
static func serializeGetObject(
_ request: inout GetObjectRequest,
_ input: inout OperationInput
) throws {
if let value = request.range {
input.headers["Range"] = value
}
if let value = request.rangeBehavior {
input.headers["x-oss-range-behavior"] = value
}
if let value = request.ifModifiedSince {
input.headers["If-Modified-Since"] = value
}
if let value = request.ifUnmodifiedSince {
input.headers["If-Unmodified-Since"] = value
}
if let value = request.ifMatch {
input.headers["If-Match"] = value
}
if let value = request.ifNoneMatch {
input.headers["If-None-Match"] = value
}
if let value = request.acceptEncoding {
input.headers["Accept-Encoding"] = value
}
if let value = request.responseContentType {
input.parameters["response-content-type"] = value
}
if let value = request.responseContentLanguage {
input.parameters["response-content-language"] = value
}
if let value = request.responseExpires {
input.parameters["response-expires"] = value
}
if let value = request.responseCacheControl {
input.parameters["response-cache-control"] = value
}
if let value = request.responseContentDisposition {
input.parameters["response-content-disposition"] = value
}
if let value = request.responseContentEncoding {
input.parameters["response-content-encoding"] = value
}
if let value = request.versionId {
input.parameters["versionId"] = value
}
if let value = request.trafficLimit {
input.headers["x-oss-traffic-limit"] = String(value)
}
if let value = request.process {
input.headers["x-oss-process"] = String(value)
}
}
static func deserializeGetObject(
_ result: inout GetObjectResult,
_ output: inout OperationOutput
) throws {
result.body = output.body
}
}
// MARK: - AppendObject
extension Serde {
static func serializeAppendObject(
_ request: inout AppendObjectRequest,
_ input: inout OperationInput
) throws {
if let value = request.serverSideEncryption {
input.headers["x-oss-server-side-encryption"] = value
}
if let value = request.objectAcl {
input.headers["x-oss-object-acl"] = value
}
if let value = request.storageClass {
input.headers["x-oss-storage-class"] = value
}
if let value = request.metadata {
for (k, v) in value {
input.headers["x-oss-meta-\(k)"] = v
}
}
if let value = request.cacheControl {
input.headers["Cache-Control"] = value
}
if let value = request.contentDisposition {
input.headers["Content-Disposition"] = value
}
if let value = request.contentEncoding {
input.headers["Content-Encoding"] = value
}
if let value = request.contentMd5 {
input.headers["Content-MD5"] = value
}
if let value = request.contentType {
input.headers["Content-Type"] = value
}
if let value = request.expires {
input.headers["Expires"] = value
}
if let value = request.position {
input.parameters["position"] = String(value)
}
if let value = request.trafficLimit {
input.headers["x-oss-traffic-limit"] = String(value)
}
input.body = request.body
}
static func deserializeAppendObject(
_: inout AppendObjectResult,
_: inout OperationOutput
) throws {}
}
// MARK: - DeleteObject
extension Serde {
static func serializeDeleteObject(
_ request: inout DeleteObjectRequest,
_ input: inout OperationInput
) throws {
if let value = request.versionId {
input.parameters["versionId"] = value
}
}
static func deserializeDeleteObject(
_: inout DeleteObjectResult,
_: inout OperationOutput
) throws {}
}
// MARK: - HeadObject
extension Serde {
static func serializeHeadObject(
_ request: inout HeadObjectRequest,
_ input: inout OperationInput
) throws {
if let value = request.ifModifiedSince {
input.headers["If-Modified-Since"] = value
}
if let value = request.ifUnmodifiedSince {
input.headers["If-Unmodified-Since"] = value
}
if let value = request.ifMatch {
input.headers["If-Match"] = value
}
if let value = request.ifNoneMatch {
input.headers["If-None-Match"] = value
}
if let value = request.versionId {
input.parameters["versionId"] = value
}
}
static func deserializeHeadObject(
_: inout HeadObjectResult,
_: inout OperationOutput
) throws {}
}
// MARK: - GetObjectMeta
extension Serde {
static func serializeGetObjectMeta(
_ request: inout GetObjectMetaRequest,
_ input: inout OperationInput
) throws {
if let value = request.versionId {
input.parameters["versionId"] = value
}
}
static func deserializeGetObjectMeta(
_: inout GetObjectMetaResult,
_: inout OperationOutput
) throws {}
}
// MARK: - DeleteMultipleObjects
extension Serde {
static func serializeDeleteMultipleObjects(
_ request: inout DeleteMultipleObjectsRequest,
_ input: inout OperationInput
) throws {
if let value = request.encodingType {
input.headers["Encoding-Type"] = value
}
var xmlBody = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
xmlBody.append("<Delete>")
if let quiet = request.quiet {
xmlBody.append("<Quiet>\(quiet)</Quiet>")
}
if let objects = request.objects {
for object in objects {
if let key = object.key {
xmlBody.append("<Object><Key>\(key.escape())</Key>")
if let versionId = object.versionId {
xmlBody.append("<VersionId>\(versionId)</VersionId>")
}
xmlBody.append("</Object>")
}
}
}
xmlBody.append("</Delete>")
if let body = xmlBody.data(using: .utf8) {
input.body = .data(body)
}
}
static func deserializeDeleteMultipleObjects(
_ result: inout DeleteMultipleObjectsResult,
_ output: inout OperationOutput
) throws {
let deleteResult: [String: Any] = try Serde.deserializeXml(output.body, "DeleteResult")
result.encodingType = deleteResult["EncodingType"] as? String
if let deleted = deleteResult["Deleted"] as? [[String: Any]] {
var deletedObjects: [DeletedInfo] = []
for object in deleted {
guard let key = object["Key"] as? String else {
continue
}
var deletedObject = DeletedInfo(key: key,
versionId: object["VersionId"] as? String,
deleteMarker: (object["DeleteMarker"] as? String)?.toBool(),
deleteMarkerVersionId: object["DeleteMarkerVersionId"] as? String)
if result.encodingType == "url" {
deletedObject.key = deletedObject.key?.removingPercentEncoding
}
deletedObjects.append(deletedObject)
}
result.deletedObjects = deletedObjects
}
}
}
// MARK: - RestoreObject
extension Serde {
static func serializeRestoreObject(
_ request: inout RestoreObjectRequest,
_ input: inout OperationInput
) throws {
if let value = request.versionId {
input.parameters["versionId"] = value
}
var xmlBody = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
xmlBody.append("<RestoreRequest>")
if let days = request.restoreRequest?.days {
xmlBody.append("<Days>\(days)</Days>")
}
if let tier = request.restoreRequest?.jobParameters?.tier {
xmlBody.append("<JobParameters><Tier>\(tier)</Tier></JobParameters>")
}
xmlBody.append("</RestoreRequest>")
if let body = xmlBody.data(using: .utf8) {
input.body = .data(body)
}
}
static func deserializeRestoreObject(
_: inout RestoreObjectResult,
_: inout OperationOutput
) throws {}
}
// MARK: - CleanRestoredObject
extension Serde {
static func serializeCleanRestoredObject(
_: inout CleanRestoredObjectRequest,
_: inout OperationInput
) throws {}
static func deserializeCleanRestoredObject(
_: inout CleanRestoredObjectResult,
_: inout OperationOutput
) throws {}
}