Skip to content

Commit 225ff31

Browse files
committed
Merge branch 'main' into jbe/sbs
2 parents accd1a6 + ea415de commit 225ff31

File tree

449 files changed

+11301
-1417
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

449 files changed

+11301
-1417
lines changed

Package.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import PackageDescription
1515

1616
// MARK: - Dynamic Content
1717

18-
let clientRuntimeVersion: Version = "0.111.0"
18+
let clientRuntimeVersion: Version = "0.112.0"
1919
let crtVersion: Version = "0.43.0"
2020

2121
let excludeRuntimeUnitTests = false

Package.version

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1.2.6
1+
1.2.11

Package.version.next

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1.2.7
1+
1.2.12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
# Compatibility with "S3-like" third-party storage services
2+
3+
## Background
4+
5+
Recently, AWS SDK for Swift dropped MD5 for payload checksums, in favor of more
6+
modern and secure algorithms. This has caused problems when accessing certain
7+
operations on "S3-like" third-party cloud storage services that claim to be
8+
API-compatible with AWS S3. To our knowledge, this affects only the S3
9+
`DeleteObjects` operation.
10+
11+
## Example Code
12+
13+
If you are having issues with accessing such third-party services, the following interceptor
14+
code can be used to force the SDK to hash `DeleteObjects` request bodies with MD5:
15+
16+
```swift
17+
class DeleteObjectsMD5InterceptorProvider: HttpInterceptorProvider {
18+
19+
class DeleteObjectsMD5Interceptor<InputType, OutputType>: Interceptor {
20+
typealias RequestType = HTTPRequest
21+
typealias ResponseType = HTTPResponse
22+
23+
let MD5_HEADER = "Content-MD5"
24+
let OTHER_CHECKSUMS_PREFIX = "x-amz-checksum-"
25+
let OTHER_CHECKSUMS_SDK_PREFIX = "x-amz-sdk-checksum-"
26+
27+
func readAfterSerialization(context: some AfterSerialization<InputType, HTTPRequest>) async throws {
28+
let request = context.getRequest()
29+
30+
// Read the request body into memory. Note that this may cause excess memory usage
31+
// when used with large request bodies.
32+
let bodyData: Data?
33+
switch request.body {
34+
case .stream(let stream):
35+
bodyData = try await stream.readToEndAsync()
36+
case .data:
37+
return // body is already in-memory data, no change needed
38+
case .noStream:
39+
bodyData = nil
40+
}
41+
42+
// Re-assign the request body using in-memory data instead of a stream.
43+
request.body = .data(bodyData)
44+
}
45+
46+
func modifyBeforeSigning(context: some MutableRequest<InputType, HTTPRequest>) async throws {
47+
let attributes = context.getAttributes()
48+
let request = context.getRequest()
49+
let body = request.body
50+
51+
// Leave request unmodified if not S3 DeleteObjects
52+
guard attributes.getServiceName() == "S3", attributes.getOperation() == "deleteObjects" else { return }
53+
54+
// Remove all checksum-related headers & trailing headers
55+
let checksumHeaders = request.headers.headers.map { $0.name }.filter { $0.hasPrefix(OTHER_CHECKSUMS_PREFIX) }
56+
checksumHeaders.forEach { request.headers.remove(name: $0) }
57+
let checksumSDKHeaders = request.headers.headers.map { $0.name }.filter { $0.hasPrefix(OTHER_CHECKSUMS_SDK_PREFIX) }
58+
checksumSDKHeaders.forEach { request.headers.remove(name: $0) }
59+
let checksumTrailingHeaders = request.trailingHeaders.headers.map { $0.name }.filter { $0.hasPrefix(OTHER_CHECKSUMS_PREFIX) }
60+
checksumTrailingHeaders.forEach { request.headers.remove(name: $0) }
61+
62+
// If the body is in-memory data, set a MD5 header for the data.
63+
if case .data(let data) = body, let data {
64+
let md5data = try data.computeMD5()
65+
request.headers.add(name: MD5_HEADER, value: md5data.base64EncodedString())
66+
}
67+
}
68+
}
69+
70+
func create<InputType, OutputType>() -> any Interceptor<InputType, OutputType, HTTPRequest, HTTPResponse> {
71+
return DeleteObjectsMD5Interceptor()
72+
}
73+
}
74+
```
75+
76+
Configure your S3 client with the interceptor as follows. Feel free to add any other
77+
needed configuration:
78+
```swift
79+
let config = try await S3Client.Config(
80+
region: "us-east-1", // substitute your region here
81+
httpInterceptorProviders: [DeleteObjectsMD5InterceptorProvider()]
82+
)
83+
let client = S3Client(config: config)
84+
```
85+
86+
## Usage Notes
87+
88+
- This code reads the entire request body into memory to perform the MD5 hashing.
89+
This may cause performance issues when the request is extremely large.
90+
- The interceptor only modifies requests to S3 `DeleteObjects`. All other requests
91+
are sent without modification.
92+
- If your "S3-like" storage service supports the SDK's new checksum options, or adds
93+
support in the future, we recommend not using the interceptor.
94+
- Do not use this interceptor with any AWS service, including AWS S3, or with any
95+
third-party service other than a "S3-like" storage service.

Sources/Services/AWSACM/Sources/AWSACM/ACMClient.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ import typealias SmithyHTTPAuthAPI.AuthSchemes
6666

6767
public class ACMClient: ClientRuntime.Client {
6868
public static let clientName = "ACMClient"
69-
public static let version = "1.2.6"
69+
public static let version = "1.2.11"
7070
let client: ClientRuntime.SdkHttpClient
7171
let config: ACMClient.ACMClientConfiguration
7272
let serviceName = "ACM"

Sources/Services/AWSACMPCA/Sources/AWSACMPCA/ACMPCAClient.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ import typealias SmithyHTTPAuthAPI.AuthSchemes
6666

6767
public class ACMPCAClient: ClientRuntime.Client {
6868
public static let clientName = "ACMPCAClient"
69-
public static let version = "1.2.6"
69+
public static let version = "1.2.11"
7070
let client: ClientRuntime.SdkHttpClient
7171
let config: ACMPCAClient.ACMPCAClientConfiguration
7272
let serviceName = "ACM PCA"

Sources/Services/AWSAPIGateway/Sources/AWSAPIGateway/APIGatewayClient.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ import typealias SmithyHTTPAuthAPI.AuthSchemes
7070

7171
public class APIGatewayClient: ClientRuntime.Client {
7272
public static let clientName = "APIGatewayClient"
73-
public static let version = "1.2.6"
73+
public static let version = "1.2.11"
7474
let client: ClientRuntime.SdkHttpClient
7575
let config: APIGatewayClient.APIGatewayClientConfiguration
7676
let serviceName = "API Gateway"

Sources/Services/AWSARCZonalShift/Sources/AWSARCZonalShift/ARCZonalShiftClient.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ import typealias SmithyHTTPAuthAPI.AuthSchemes
6666

6767
public class ARCZonalShiftClient: ClientRuntime.Client {
6868
public static let clientName = "ARCZonalShiftClient"
69-
public static let version = "1.2.6"
69+
public static let version = "1.2.11"
7070
let client: ClientRuntime.SdkHttpClient
7171
let config: ARCZonalShiftClient.ARCZonalShiftClientConfiguration
7272
let serviceName = "ARC Zonal Shift"

Sources/Services/AWSAccessAnalyzer/Sources/AWSAccessAnalyzer/AccessAnalyzerClient.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ import typealias SmithyHTTPAuthAPI.AuthSchemes
6767

6868
public class AccessAnalyzerClient: ClientRuntime.Client {
6969
public static let clientName = "AccessAnalyzerClient"
70-
public static let version = "1.2.6"
70+
public static let version = "1.2.11"
7171
let client: ClientRuntime.SdkHttpClient
7272
let config: AccessAnalyzerClient.AccessAnalyzerClientConfiguration
7373
let serviceName = "AccessAnalyzer"

Sources/Services/AWSAccount/Sources/AWSAccount/AccountClient.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ import typealias SmithyHTTPAuthAPI.AuthSchemes
6464

6565
public class AccountClient: ClientRuntime.Client {
6666
public static let clientName = "AccountClient"
67-
public static let version = "1.2.6"
67+
public static let version = "1.2.11"
6868
let client: ClientRuntime.SdkHttpClient
6969
let config: AccountClient.AccountClientConfiguration
7070
let serviceName = "Account"

Sources/Services/AWSAmp/Sources/AWSAmp/AmpClient.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ import typealias SmithyHTTPAuthAPI.AuthSchemes
6767

6868
public class AmpClient: ClientRuntime.Client {
6969
public static let clientName = "AmpClient"
70-
public static let version = "1.2.6"
70+
public static let version = "1.2.11"
7171
let client: ClientRuntime.SdkHttpClient
7272
let config: AmpClient.AmpClientConfiguration
7373
let serviceName = "amp"

Sources/Services/AWSAmp/Sources/AWSAmp/Models.swift

+56
Original file line numberDiff line numberDiff line change
@@ -631,6 +631,25 @@ extension AmpClientTypes {
631631
}
632632
}
633633

634+
extension AmpClientTypes {
635+
636+
/// To configure roles that allows users to write to an Amazon Managed Service for Prometheus workspace in a different account.
637+
public struct RoleConfiguration: Swift.Sendable {
638+
/// A ARN identifying the source role configuration.
639+
public var sourceRoleArn: Swift.String?
640+
/// A ARN identifying the target role configuration.
641+
public var targetRoleArn: Swift.String?
642+
643+
public init(
644+
sourceRoleArn: Swift.String? = nil,
645+
targetRoleArn: Swift.String? = nil
646+
) {
647+
self.sourceRoleArn = sourceRoleArn
648+
self.targetRoleArn = targetRoleArn
649+
}
650+
}
651+
}
652+
634653
extension AmpClientTypes {
635654

636655
/// A scrape configuration for a scraper, base 64 encoded. For more information, see [Scraper configuration](https://docs.aws.amazon.com/prometheus/latest/userguide/AMP-collector-how-to.html#AMP-collector-configuration) in the Amazon Managed Service for Prometheus User Guide.
@@ -685,6 +704,8 @@ public struct CreateScraperInput: Swift.Sendable {
685704
/// The Amazon Managed Service for Prometheus workspace to send metrics to.
686705
/// This member is required.
687706
public var destination: AmpClientTypes.Destination?
707+
/// The scraper role configuration for the workspace.
708+
public var roleConfiguration: AmpClientTypes.RoleConfiguration?
688709
/// The configuration file to use in the new scraper. For more information, see [Scraper configuration](https://docs.aws.amazon.com/prometheus/latest/userguide/AMP-collector-how-to.html#AMP-collector-configuration) in the Amazon Managed Service for Prometheus User Guide.
689710
/// This member is required.
690711
public var scrapeConfiguration: AmpClientTypes.ScrapeConfiguration?
@@ -698,13 +719,15 @@ public struct CreateScraperInput: Swift.Sendable {
698719
alias: Swift.String? = nil,
699720
clientToken: Swift.String? = nil,
700721
destination: AmpClientTypes.Destination? = nil,
722+
roleConfiguration: AmpClientTypes.RoleConfiguration? = nil,
701723
scrapeConfiguration: AmpClientTypes.ScrapeConfiguration? = nil,
702724
source: AmpClientTypes.Source? = nil,
703725
tags: [Swift.String: Swift.String]? = nil
704726
) {
705727
self.alias = alias
706728
self.clientToken = clientToken
707729
self.destination = destination
730+
self.roleConfiguration = roleConfiguration
708731
self.scrapeConfiguration = scrapeConfiguration
709732
self.source = source
710733
self.tags = tags
@@ -875,6 +898,8 @@ extension AmpClientTypes {
875898
/// The Amazon Resource Name (ARN) of the IAM role that provides permissions for the scraper to discover and collect metrics on your behalf. For example, arn:aws:iam::123456789012:role/service-role/AmazonGrafanaServiceRole-12example.
876899
/// This member is required.
877900
public var roleArn: Swift.String?
901+
/// To configure roles that allows users to write to an Amazon Managed Service for Prometheus workspace in a different account.
902+
public var roleConfiguration: AmpClientTypes.RoleConfiguration?
878903
/// The configuration in use by the scraper.
879904
/// This member is required.
880905
public var scrapeConfiguration: AmpClientTypes.ScrapeConfiguration?
@@ -899,6 +924,7 @@ extension AmpClientTypes {
899924
destination: AmpClientTypes.Destination? = nil,
900925
lastModifiedAt: Foundation.Date? = nil,
901926
roleArn: Swift.String? = nil,
927+
roleConfiguration: AmpClientTypes.RoleConfiguration? = nil,
902928
scrapeConfiguration: AmpClientTypes.ScrapeConfiguration? = nil,
903929
scraperId: Swift.String? = nil,
904930
source: AmpClientTypes.Source? = nil,
@@ -912,6 +938,7 @@ extension AmpClientTypes {
912938
self.destination = destination
913939
self.lastModifiedAt = lastModifiedAt
914940
self.roleArn = roleArn
941+
self.roleConfiguration = roleConfiguration
915942
self.scrapeConfiguration = scrapeConfiguration
916943
self.scraperId = scraperId
917944
self.source = source
@@ -976,6 +1003,8 @@ extension AmpClientTypes {
9761003
/// The Amazon Resource Name (ARN) of the IAM role that provides permissions for the scraper to discover and collect metrics on your behalf.
9771004
/// This member is required.
9781005
public var roleArn: Swift.String?
1006+
/// To configure roles that allows users to write to an Amazon Managed Service for Prometheus workspace in a different account.
1007+
public var roleConfiguration: AmpClientTypes.RoleConfiguration?
9791008
/// The ID of the scraper.
9801009
/// This member is required.
9811010
public var scraperId: Swift.String?
@@ -997,6 +1026,7 @@ extension AmpClientTypes {
9971026
destination: AmpClientTypes.Destination? = nil,
9981027
lastModifiedAt: Foundation.Date? = nil,
9991028
roleArn: Swift.String? = nil,
1029+
roleConfiguration: AmpClientTypes.RoleConfiguration? = nil,
10001030
scraperId: Swift.String? = nil,
10011031
source: AmpClientTypes.Source? = nil,
10021032
status: AmpClientTypes.ScraperStatus? = nil,
@@ -1009,6 +1039,7 @@ extension AmpClientTypes {
10091039
self.destination = destination
10101040
self.lastModifiedAt = lastModifiedAt
10111041
self.roleArn = roleArn
1042+
self.roleConfiguration = roleConfiguration
10121043
self.scraperId = scraperId
10131044
self.source = source
10141045
self.status = status
@@ -1042,6 +1073,8 @@ public struct UpdateScraperInput: Swift.Sendable {
10421073
public var clientToken: Swift.String?
10431074
/// The new Amazon Managed Service for Prometheus workspace to send metrics to.
10441075
public var destination: AmpClientTypes.Destination?
1076+
/// The scraper role configuration for the workspace.
1077+
public var roleConfiguration: AmpClientTypes.RoleConfiguration?
10451078
/// Contains the base-64 encoded YAML configuration for the scraper. For more information about configuring a scraper, see [Using an Amazon Web Services managed collector](https://docs.aws.amazon.com/prometheus/latest/userguide/AMP-collector-how-to.html) in the Amazon Managed Service for Prometheus User Guide.
10461079
public var scrapeConfiguration: AmpClientTypes.ScrapeConfiguration?
10471080
/// The ID of the scraper to update.
@@ -1052,12 +1085,14 @@ public struct UpdateScraperInput: Swift.Sendable {
10521085
alias: Swift.String? = nil,
10531086
clientToken: Swift.String? = nil,
10541087
destination: AmpClientTypes.Destination? = nil,
1088+
roleConfiguration: AmpClientTypes.RoleConfiguration? = nil,
10551089
scrapeConfiguration: AmpClientTypes.ScrapeConfiguration? = nil,
10561090
scraperId: Swift.String? = nil
10571091
) {
10581092
self.alias = alias
10591093
self.clientToken = clientToken
10601094
self.destination = destination
1095+
self.roleConfiguration = roleConfiguration
10611096
self.scrapeConfiguration = scrapeConfiguration
10621097
self.scraperId = scraperId
10631098
}
@@ -2459,6 +2494,7 @@ extension CreateScraperInput {
24592494
try writer["alias"].write(value.alias)
24602495
try writer["clientToken"].write(value.clientToken)
24612496
try writer["destination"].write(value.destination, with: AmpClientTypes.Destination.write(value:to:))
2497+
try writer["roleConfiguration"].write(value.roleConfiguration, with: AmpClientTypes.RoleConfiguration.write(value:to:))
24622498
try writer["scrapeConfiguration"].write(value.scrapeConfiguration, with: AmpClientTypes.ScrapeConfiguration.write(value:to:))
24632499
try writer["source"].write(value.source, with: AmpClientTypes.Source.write(value:to:))
24642500
try writer["tags"].writeMap(value.tags, valueWritingClosure: SmithyReadWrite.WritingClosures.writeString(value:to:), keyNodeInfo: "key", valueNodeInfo: "value", isFlattened: false)
@@ -2518,6 +2554,7 @@ extension UpdateScraperInput {
25182554
try writer["alias"].write(value.alias)
25192555
try writer["clientToken"].write(value.clientToken)
25202556
try writer["destination"].write(value.destination, with: AmpClientTypes.Destination.write(value:to:))
2557+
try writer["roleConfiguration"].write(value.roleConfiguration, with: AmpClientTypes.RoleConfiguration.write(value:to:))
25212558
try writer["scrapeConfiguration"].write(value.scrapeConfiguration, with: AmpClientTypes.ScrapeConfiguration.write(value:to:))
25222559
}
25232560
}
@@ -3563,6 +3600,24 @@ extension AmpClientTypes.ScraperDescription {
35633600
value.scrapeConfiguration = try reader["scrapeConfiguration"].readIfPresent(with: AmpClientTypes.ScrapeConfiguration.read(from:))
35643601
value.source = try reader["source"].readIfPresent(with: AmpClientTypes.Source.read(from:))
35653602
value.destination = try reader["destination"].readIfPresent(with: AmpClientTypes.Destination.read(from:))
3603+
value.roleConfiguration = try reader["roleConfiguration"].readIfPresent(with: AmpClientTypes.RoleConfiguration.read(from:))
3604+
return value
3605+
}
3606+
}
3607+
3608+
extension AmpClientTypes.RoleConfiguration {
3609+
3610+
static func write(value: AmpClientTypes.RoleConfiguration?, to writer: SmithyJSON.Writer) throws {
3611+
guard let value else { return }
3612+
try writer["sourceRoleArn"].write(value.sourceRoleArn)
3613+
try writer["targetRoleArn"].write(value.targetRoleArn)
3614+
}
3615+
3616+
static func read(from reader: SmithyJSON.Reader) throws -> AmpClientTypes.RoleConfiguration {
3617+
guard reader.hasContent else { throw SmithyReadWrite.ReaderError.requiredValueNotPresent }
3618+
var value = AmpClientTypes.RoleConfiguration()
3619+
value.sourceRoleArn = try reader["sourceRoleArn"].readIfPresent()
3620+
value.targetRoleArn = try reader["targetRoleArn"].readIfPresent()
35663621
return value
35673622
}
35683623
}
@@ -3721,6 +3776,7 @@ extension AmpClientTypes.ScraperSummary {
37213776
value.statusReason = try reader["statusReason"].readIfPresent()
37223777
value.source = try reader["source"].readIfPresent(with: AmpClientTypes.Source.read(from:))
37233778
value.destination = try reader["destination"].readIfPresent(with: AmpClientTypes.Destination.read(from:))
3779+
value.roleConfiguration = try reader["roleConfiguration"].readIfPresent(with: AmpClientTypes.RoleConfiguration.read(from:))
37243780
return value
37253781
}
37263782
}

Sources/Services/AWSAmplify/Sources/AWSAmplify/AmplifyClient.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ import typealias SmithyHTTPAuthAPI.AuthSchemes
6666

6767
public class AmplifyClient: ClientRuntime.Client {
6868
public static let clientName = "AmplifyClient"
69-
public static let version = "1.2.6"
69+
public static let version = "1.2.11"
7070
let client: ClientRuntime.SdkHttpClient
7171
let config: AmplifyClient.AmplifyClientConfiguration
7272
let serviceName = "Amplify"

Sources/Services/AWSAmplifyBackend/Sources/AWSAmplifyBackend/AmplifyBackendClient.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ import typealias SmithyHTTPAuthAPI.AuthSchemes
6464

6565
public class AmplifyBackendClient: ClientRuntime.Client {
6666
public static let clientName = "AmplifyBackendClient"
67-
public static let version = "1.2.6"
67+
public static let version = "1.2.11"
6868
let client: ClientRuntime.SdkHttpClient
6969
let config: AmplifyBackendClient.AmplifyBackendClientConfiguration
7070
let serviceName = "AmplifyBackend"

Sources/Services/AWSAmplifyUIBuilder/Sources/AWSAmplifyUIBuilder/AmplifyUIBuilderClient.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ import typealias SmithyHTTPAuthAPI.AuthSchemes
6767

6868
public class AmplifyUIBuilderClient: ClientRuntime.Client {
6969
public static let clientName = "AmplifyUIBuilderClient"
70-
public static let version = "1.2.6"
70+
public static let version = "1.2.11"
7171
let client: ClientRuntime.SdkHttpClient
7272
let config: AmplifyUIBuilderClient.AmplifyUIBuilderClientConfiguration
7373
let serviceName = "AmplifyUIBuilder"

Sources/Services/AWSApiGatewayManagementApi/Sources/AWSApiGatewayManagementApi/ApiGatewayManagementApiClient.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ import typealias SmithyHTTPAuthAPI.AuthSchemes
6464

6565
public class ApiGatewayManagementApiClient: ClientRuntime.Client {
6666
public static let clientName = "ApiGatewayManagementApiClient"
67-
public static let version = "1.2.6"
67+
public static let version = "1.2.11"
6868
let client: ClientRuntime.SdkHttpClient
6969
let config: ApiGatewayManagementApiClient.ApiGatewayManagementApiClientConfiguration
7070
let serviceName = "ApiGatewayManagementApi"

Sources/Services/AWSApiGatewayV2/Sources/AWSApiGatewayV2/ApiGatewayV2Client.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ import typealias SmithyHTTPAuthAPI.AuthSchemes
6666

6767
public class ApiGatewayV2Client: ClientRuntime.Client {
6868
public static let clientName = "ApiGatewayV2Client"
69-
public static let version = "1.2.6"
69+
public static let version = "1.2.11"
7070
let client: ClientRuntime.SdkHttpClient
7171
let config: ApiGatewayV2Client.ApiGatewayV2ClientConfiguration
7272
let serviceName = "ApiGatewayV2"

0 commit comments

Comments
 (0)