// Copyright Amazon.com Inc. or its affiliates. // All Rights Reserved. // // SPDX-License-Identifier: Apache-2.0 import Foundation import AWSS3 import ClientRuntime import AWSClientRuntime extension UploadPartInput { func customPresignURL(config: S3ClientConfigurationProtocol, expiration: TimeInterval) async throws -> ClientRuntime.URL? { let serviceName = "S3" let input = self let encoder = ClientRuntime.XMLEncoder() encoder.dateEncodingStrategy = .secondsSince1970 let decoder = ClientRuntime.XMLDecoder() decoder.dateDecodingStrategy = .secondsSince1970 decoder.trimValueWhitespaces = false decoder.removeWhitespaceElements = true let context = ClientRuntime.HttpContextBuilder() .withEncoder(value: encoder) .withDecoder(value: decoder) .withMethod(value: .put) .withServiceName(value: serviceName) .withOperation(value: "uploadPart") .withIdempotencyTokenGenerator(value: config.idempotencyTokenGenerator) .withLogger(value: config.logger) .withCredentialsProvider(value: config.credentialsProvider) .withRegion(value: config.region) .withSigningName(value: "s3") .withSigningRegion(value: config.signingRegion) var operation = ClientRuntime.OperationStack(id: "uploadPart") operation.initializeStep.intercept(position: .after, middleware: ClientRuntime.URLPathMiddleware()) operation.initializeStep.intercept(position: .after, middleware: ClientRuntime.URLHostMiddleware()) operation.buildStep.intercept(position: .before, middleware: EndpointResolverMiddleware(endpointResolver: config.endpointResolver, endpointParams: config.endpointParams(withBucket: input.bucket))) operation.serializeStep.intercept(position: .after, middleware: UploadPartInputBodyMiddleware()) operation.serializeStep.intercept(position: .after, middleware: QueryItemMiddleware()) operation.finalizeStep.intercept(position: .after, middleware: RetryerMiddleware(retryer: config.retryer)) let sigv4Config = AWSClientRuntime.SigV4Config( signatureType: .requestQueryParams, useDoubleURIEncode: false, expiration: expiration, unsignedBody: true, signingAlgorithm: .sigv4 ) operation.finalizeStep.intercept(position: .before, middleware: AWSClientRuntime.SigV4Middleware(config: sigv4Config)) operation.deserializeStep.intercept(position: .before, middleware: ClientRuntime.LoggerMiddleware(clientLogMode: config.clientLogMode)) operation.deserializeStep.intercept(position: .after, middleware: ClientRuntime.DeserializeMiddleware()) let presignedRequestBuilder = try await operation.presignedRequest(context: context.build(), input: input, next: ClientRuntime.NoopHandler()) guard let builtRequest = presignedRequestBuilder?.build(), let presignedURL = builtRequest.endpoint.url else { return nil } return presignedURL } }