-
Notifications
You must be signed in to change notification settings - Fork 28
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'main' into feat/modularize-identity-and-auth
- Loading branch information
Showing
68 changed files
with
407 additions
and
404 deletions.
There are no files selected for viewing
37 changes: 37 additions & 0 deletions
37
Sources/ClientRuntime/Endpoints/DefaultEndpointResolver.swift
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,37 @@ | ||
// | ||
// Copyright Amazon.com Inc. or its affiliates. | ||
// All Rights Reserved. | ||
// | ||
// SPDX-License-Identifier: Apache-2.0 | ||
// | ||
|
||
import struct SmithyHTTPAPI.Endpoint | ||
import struct SmithyHTTPAPI.Headers | ||
|
||
public struct DefaultEndpointResolver<Params: EndpointsRequestContextProviding> { | ||
|
||
private let engine: ClientRuntime.EndpointsRuleEngine | ||
|
||
public init(partitions: String, ruleSet: String) throws { | ||
engine = try ClientRuntime.EndpointsRuleEngine(partitions: partitions, ruleSet: ruleSet) | ||
} | ||
|
||
public func resolve(params: Params) throws -> SmithyHTTPAPI.Endpoint { | ||
guard let crtResolvedEndpoint = try engine.resolve(context: params.context) else { | ||
throw EndpointError.unresolved("Failed to resolve endpoint") | ||
} | ||
|
||
if crtResolvedEndpoint.getType() == .error { | ||
let error = crtResolvedEndpoint.getError() | ||
throw EndpointError.unresolved(error) | ||
} | ||
|
||
guard let url = crtResolvedEndpoint.getURL() else { | ||
throw EndpointError.unresolved("Failed to get URL from endpoint") | ||
} | ||
|
||
let headers = crtResolvedEndpoint.getHeaders() ?? [:] | ||
let properties = crtResolvedEndpoint.getProperties() ?? [:] | ||
return try Endpoint(urlString: url, headers: Headers(headers), properties: properties) | ||
} | ||
} |
112 changes: 112 additions & 0 deletions
112
Sources/ClientRuntime/Endpoints/EndpointResolverMiddleware.swift
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,112 @@ | ||
// | ||
// Copyright Amazon.com Inc. or its affiliates. | ||
// All Rights Reserved. | ||
// | ||
// SPDX-License-Identifier: Apache-2.0 | ||
// | ||
|
||
import class Smithy.Context | ||
import struct SmithyHTTPAPI.Endpoint | ||
import class SmithyHTTPAPI.SdkHttpRequest | ||
import class SmithyHTTPAPI.SdkHttpRequestBuilder | ||
import struct SmithyHTTPAuthAPI.SelectedAuthScheme | ||
import enum SmithyHTTPAuthAPI.SigningAlgorithm | ||
import enum SmithyHTTPAuthAPI.SigningPropertyKeys | ||
|
||
public struct EndpointResolverMiddleware<OperationStackOutput, Params: EndpointsRequestContextProviding>: Middleware { | ||
public let id: Swift.String = "EndpointResolverMiddleware" | ||
|
||
let endpointResolverBlock: (Params) throws -> Endpoint | ||
|
||
let endpointParams: Params | ||
|
||
let authSchemeResolver: EndpointsAuthSchemeResolver | ||
|
||
public init( | ||
endpointResolverBlock: @escaping (Params) throws -> Endpoint, | ||
endpointParams: Params, | ||
authSchemeResolver: EndpointsAuthSchemeResolver = DefaultEndpointsAuthSchemeResolver() | ||
) { | ||
self.endpointResolverBlock = endpointResolverBlock | ||
self.endpointParams = endpointParams | ||
self.authSchemeResolver = authSchemeResolver | ||
} | ||
|
||
public func handle<H>( | ||
context: Smithy.Context, | ||
input: SmithyHTTPAPI.SdkHttpRequestBuilder, | ||
next: H | ||
) async throws -> OperationOutput<OperationStackOutput> | ||
where H: Handler, | ||
Self.MInput == H.Input, | ||
Self.MOutput == H.Output { | ||
let selectedAuthScheme = context.selectedAuthScheme | ||
let request = input.build() | ||
let updatedRequest = | ||
try await apply(request: request, selectedAuthScheme: selectedAuthScheme, attributes: context) | ||
return try await next.handle(context: context, input: updatedRequest.toBuilder()) | ||
} | ||
public typealias MInput = SmithyHTTPAPI.SdkHttpRequestBuilder | ||
public typealias MOutput = OperationOutput<OperationStackOutput> | ||
} | ||
|
||
extension EndpointResolverMiddleware: ApplyEndpoint { | ||
|
||
public func apply( | ||
request: SdkHttpRequest, | ||
selectedAuthScheme: SelectedAuthScheme?, | ||
attributes: Smithy.Context | ||
) async throws -> SdkHttpRequest { | ||
let builder = request.toBuilder() | ||
|
||
let endpoint = try endpointResolverBlock(endpointParams) | ||
|
||
var signingName: String? | ||
var signingAlgorithm: String? | ||
if let authSchemes = endpoint.authSchemes() { | ||
let schemes = try authSchemes.map { try EndpointsAuthScheme(from: $0) } | ||
let authScheme = try authSchemeResolver.resolve(authSchemes: schemes) | ||
signingAlgorithm = authScheme.name | ||
switch authScheme { | ||
case .sigV4(let param): | ||
signingName = param.signingName | ||
case .sigV4A(let param): | ||
signingName = param.signingName | ||
case .none: | ||
break | ||
} | ||
} | ||
|
||
let awsEndpoint = SmithyEndpoint(endpoint: endpoint, signingName: signingName) | ||
|
||
var host = "" | ||
if let hostOverride = attributes.host { | ||
host = hostOverride | ||
} else { | ||
host = "\(attributes.hostPrefix ?? "")\(awsEndpoint.endpoint.host)" | ||
} | ||
|
||
if let protocolType = awsEndpoint.endpoint.protocolType { | ||
builder.withProtocol(protocolType) | ||
} | ||
|
||
if let signingName = signingName { | ||
attributes.signingName = signingName | ||
attributes.selectedAuthScheme = selectedAuthScheme?.getCopyWithUpdatedSigningProperty( | ||
key: SigningPropertyKeys.signingName, value: signingName | ||
) | ||
} | ||
|
||
if let signingAlgorithm = signingAlgorithm { | ||
attributes.signingAlgorithm = SigningAlgorithm(rawValue: signingAlgorithm) | ||
} | ||
|
||
return builder.withMethod(attributes.method) | ||
.withHost(host) | ||
.withPort(awsEndpoint.endpoint.port) | ||
.withPath(awsEndpoint.endpoint.path.appendingPathComponent(attributes.path)) | ||
.withHeaders(endpoint.headers) | ||
.withHeader(name: "Host", value: host) | ||
.build() | ||
} | ||
} |
10 changes: 10 additions & 0 deletions
10
Sources/ClientRuntime/Endpoints/EndpointsRequestContextProviding.swift
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
// | ||
// Copyright Amazon.com Inc. or its affiliates. | ||
// All Rights Reserved. | ||
// | ||
// SPDX-License-Identifier: Apache-2.0 | ||
// | ||
|
||
public protocol EndpointsRequestContextProviding { | ||
var context: EndpointsRequestContext { get throws } | ||
} |
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,46 @@ | ||
// Code generated by smithy-swift-codegen. DO NOT EDIT! | ||
|
||
import class ClientRuntime.EndpointsRequestContext | ||
import let ClientRuntime.partitionJSON | ||
import protocol ClientRuntime.EndpointsRequestContextProviding | ||
import struct ClientRuntime.DefaultEndpointResolver | ||
import struct SmithyHTTPAPI.Endpoint | ||
|
||
public struct EndpointParams { | ||
/// docs | ||
public let region: Swift.String | ||
|
||
public init( | ||
region: Swift.String | ||
) | ||
{ | ||
self.region = region | ||
} | ||
} | ||
|
||
extension EndpointParams: ClientRuntime.EndpointsRequestContextProviding { | ||
|
||
public var context: ClientRuntime.EndpointsRequestContext { | ||
get throws { | ||
let context = try ClientRuntime.EndpointsRequestContext() | ||
try context.add(name: "Region", value: self.region) | ||
return context | ||
} | ||
} | ||
} | ||
|
||
public protocol EndpointResolver { | ||
func resolve(params: EndpointParams) throws -> SmithyHTTPAPI.Endpoint | ||
} | ||
|
||
typealias DefaultEndpointResolver = ClientRuntime.DefaultEndpointResolver<EndpointParams> | ||
|
||
extension DefaultEndpointResolver { | ||
private static let ruleSet = "{\"version\":\"1.3\",\"parameters\":{\"Region\":{\"required\":true,\"documentation\":\"docs\",\"type\":\"String\"}},\"rules\":[{\"conditions\":[],\"documentation\":\"base rule\",\"endpoint\":{\"url\":\"https://{Region}.amazonaws.com\",\"properties\":{},\"headers\":{}},\"type\":\"endpoint\"}]}" | ||
|
||
init() throws { | ||
try self.init(partitions: ClientRuntime.partitionJSON, ruleSet: Self.ruleSet) | ||
} | ||
} | ||
|
||
extension DefaultEndpointResolver: EndpointResolver {} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.