Sources/OSS/Transform/SerdeObjectMultipart.swift (340 lines of code) (raw):
import Foundation
// MARK: - InitiateMultipartUpload
extension Serde {
static func serializeInitiateMultipartUpload(
_ request: inout InitiateMultipartUploadRequest,
_ input: inout OperationInput
) throws {
if let value = request.forbidOverwrite {
input.headers["x-oss-forbid-overwrite"] = value.toString()
}
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.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.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.encodingType {
input.parameters["encoding-type"] = value
}
}
static func deserializeInitiateMultipartUpload(
_ result: inout InitiateMultipartUploadResult,
_ output: inout OperationOutput
) throws {
let body: [String: String] = try Serde.deserializeXml(output.body, "InitiateMultipartUploadResult")
result.uploadId = body["UploadId"]
result.bucket = body["Bucket"]
result.key = body["Key"]
result.encodingType = body["EncodingType"]
deserializeInitiateMultipartUploadEncodingType(result: &result)
}
static func deserializeInitiateMultipartUploadEncodingType(result: inout InitiateMultipartUploadResult) {
if result.encodingType == "url" {
result.key = result.key?.removingPercentEncoding
}
}
}
// MARK: - UploadPart
extension Serde {
static func serializeUploadPart(
_ request: inout UploadPartRequest,
_ input: inout OperationInput
) throws {
if let value = request.partNumber {
input.parameters["partNumber"] = String(value)
}
if let value = request.uploadId {
input.parameters["uploadId"] = value
}
input.body = request.body
}
static func deserializeUploadPart(
_: inout UploadPartResult,
_: inout OperationOutput
) throws {}
}
// MARK: - CompleteMultipartUpload
extension Serde {
static func serializeCompleteMultipartUpload(
_ request: inout CompleteMultipartUploadRequest,
_ input: inout OperationInput
) throws {
if let value = request.forbidOverwrite {
input.headers["x-oss-forbid-overwrite"] = value.toString()
}
if let value = request.completeAll {
input.headers["x-oss-complete-all"] = value
}
if let value = request.uploadId {
input.parameters["uploadId"] = value
}
if let value = request.encodingType {
input.parameters["encoding-type"] = value
}
if let parts = request.completeMultipartUpload?.parts {
var xmlBody = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
xmlBody.append("<CompleteMultipartUpload>")
for part in parts {
if let partNumber = part.partNumber,
let etag = part.etag
{
xmlBody.append("<Part>")
xmlBody.append("<PartNumber>\(partNumber)</PartNumber>")
xmlBody.append("<ETag>\(etag)</ETag>")
xmlBody.append("</Part>")
}
}
xmlBody.append("</CompleteMultipartUpload>")
input.body = .data(xmlBody.data(using: .utf8)!)
}
}
static func deserializeCompleteMultipartUpload(
_ result: inout CompleteMultipartUploadResult,
_ output: inout OperationOutput
) throws {
if let callbackResult = output.headers["x-oss-callback"] {
result.callbackResult = Data(base64Encoded: callbackResult)
} else {
let body: [String: String] = try Serde.deserializeXml(output.body, "CompleteMultipartUploadResult")
result.bucket = body["Bucket"]
result.key = body["Key"]
result.etag = body["ETag"]
result.location = body["Location"]
result.encodingType = body["EncodingType"]
if result.encodingType == "url" {
result.key = result.key?.removingPercentEncoding
}
}
}
}
// MARK: - UploadPartCopy
extension Serde {
static func serializeUploadPartCopy(
_ request: inout UploadPartCopyRequest,
_ 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.copySourceRange {
input.headers["x-oss-copy-source-range"] = value
}
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.partNumber {
input.parameters["partNumber"] = String(value)
}
if let value = request.uploadId {
input.parameters["uploadId"] = value
}
}
static func deserializeUploadPartCopy(
_ result: inout UploadPartCopyResult,
_ output: inout OperationOutput
) throws {
let body: [String: String] = try Serde.deserializeXml(output.body, "CopyPartResult")
var copyPartResult = CopyPartResult(etag: body["ETag"])
copyPartResult.lastModified = body["LastModified"]?.toDate()
result.copyPartResult = copyPartResult
}
}
// MARK: - AbortMultipartUpload
extension Serde {
static func serializeAbortMultipartUpload(
_ request: inout AbortMultipartUploadRequest,
_ input: inout OperationInput
) throws {
if let value = request.uploadId {
input.parameters["uploadId"] = value
}
}
static func deserializeAbortMultipartUpload(
_: inout AbortMultipartUploadResult,
_: inout OperationOutput
) throws {}
}
// MARK: - ListMultipartUploads
extension Serde {
static func serializeListMultipartUploads(
_ request: inout ListMultipartUploadsRequest,
_ input: inout OperationInput
) throws {
if let value = request.delimiter {
input.parameters["delimiter"] = value
}
if let value = request.maxUploads {
input.parameters["max-uploads"] = String(value)
}
if let value = request.keyMarker {
input.parameters["key-marker"] = value
}
if let value = request.prefix {
input.parameters["prefix"] = value
}
if let value = request.uploadIdMarker {
input.parameters["upload-id-marker"] = value
}
if let value = request.encodingType {
input.parameters["encoding-type"] = value
}
}
static func deserializeListMultipartUploads(
_ result: inout ListMultipartUploadsResult,
_ output: inout OperationOutput
) throws {
let body: [String: Any] = try Serde.deserializeXml(output.body, "ListMultipartUploadsResult")
result.isTruncated = (body["IsTruncated"] as? String)?.toBool()
result.bucket = body["Bucket"] as? String
result.keyMarker = body["KeyMarker"] as? String
result.uploadIdMarker = body["UploadIdMarker"] as? String
result.nextKeyMarker = body["NextKeyMarker"] as? String
result.nextUploadIdMarker = body["NextUploadIdMarker"] as? String
result.delimiter = body["Delimiter"] as? String
result.prefix = body["Prefix"] as? String
result.encodingType = body["EncodingType"] as? String
result.maxUploads = (body["MaxUploads"] as? String)?.toInt()
if let commonPrefixe = body["CommonPrefixes"] as? [String: String] {
var commonPrefixes: [CommonPrefix] = []
if let prefix = commonPrefixe["Prefix"] {
commonPrefixes.append(CommonPrefix(prefix: prefix))
}
result.commonPrefixes = commonPrefixes
} else if let commonPrefixe = body["CommonPrefixes"] as? [[String: String]] {
var commonPrefixes: [CommonPrefix] = []
for element in commonPrefixe {
if let prefix = element["Prefix"] {
commonPrefixes.append(CommonPrefix(prefix: prefix))
}
}
result.commonPrefixes = commonPrefixes
}
var uploads: [Upload] = []
if let uploadElement = body["Upload"] as? [String: String] {
if let key = uploadElement["Key"],
let uploadId = uploadElement["UploadId"]
{
let initiated = uploadElement["Initiated"]?.toDate()
let upload = Upload(initiated: initiated,
key: key,
uploadId: uploadId)
uploads.append(upload)
}
} else if let uploadElements = body["Upload"] as? [[String: String]] {
for element in uploadElements {
if let key = element["Key"],
let uploadId = element["UploadId"]
{
let initiated = element["Initiated"]?.toDate()
let upload = Upload(initiated: initiated,
key: key,
uploadId: uploadId)
uploads.append(upload)
}
}
}
result.uploads = uploads
deserializeListMultipartUploadsEncodingType(result: &result)
}
static func deserializeListMultipartUploadsEncodingType(result: inout ListMultipartUploadsResult) {
if result.encodingType == "url" {
result.prefix = result.prefix?.removingPercentEncoding
result.keyMarker = result.keyMarker?.removingPercentEncoding
result.nextKeyMarker = result.nextKeyMarker?.removingPercentEncoding
result.delimiter = result.delimiter?.removingPercentEncoding
if let uploads = result.uploads {
var decodedUploads: [Upload] = []
for upload in uploads {
var decodedUpload = upload
decodedUpload.key = decodedUpload.key?.removingPercentEncoding
decodedUploads.append(decodedUpload)
}
result.uploads = decodedUploads
}
}
}
}
// MARK: - ListParts
extension Serde {
static func serializeListParts(
_ request: inout ListPartsRequest,
_ input: inout OperationInput
) throws {
if let value = request.uploadId {
input.parameters["uploadId"] = value
}
if let value = request.maxParts {
input.parameters["max-parts"] = String(value)
}
if let value = request.partNumberMarker {
input.parameters["part-number-marker"] = String(value)
}
if let value = request.encodingType {
input.parameters["encoding-type"] = value
}
}
static func deserializeListParts(
_ result: inout ListPartsResult,
_ output: inout OperationOutput
) throws {
let body: [String: Any] = try Serde.deserializeXml(output.body, "ListPartsResult")
result.bucket = body["Bucket"] as? String
result.key = body["Key"] as? String
result.uploadId = body["UploadId"] as? String
result.encodingType = body["EncodingType"] as? String
result.isTruncated = (body["IsTruncated"] as? String)?.toBool()
result.partNumberMarker = (body["PartNumberMarker"] as? String)?.toInt()
result.nextPartNumberMarker = (body["NextPartNumberMarker"] as? String)?.toInt()
result.maxParts = (body["MaxParts"] as? String)?.toInt()
var parts: [Part] = []
if let partElement = body["Part"] as? [String: String] {
var part = Part()
part.etag = partElement["ETag"]
part.hashCrc64 = partElement["HashCrc64"]
part.partNumber = partElement["PartNumber"]?.toInt()
part.size = partElement["Size"]?.toInt()
part.lastModified = partElement["LastModified"]?.toDate()
parts.append(part)
} else if let partElements = body["Part"] as? [[String: String]] {
for element in partElements {
var part = Part()
part.etag = element["ETag"]
part.hashCrc64 = element["HashCrc64"]
part.partNumber = element["PartNumber"]?.toInt()
part.size = element["Size"]?.toInt()
part.lastModified = element["LastModified"]?.toDate()
parts.append(part)
}
}
result.parts = parts
if result.encodingType == "url" {
result.key = result.key?.removingPercentEncoding
}
}
}