Skip to content

Commit

Permalink
Merge branch 'main' into feat/modularize-identity-and-auth
Browse files Browse the repository at this point in the history
  • Loading branch information
Sichan Yoo committed Jun 6, 2024
2 parents 38eea1c + 356deec commit 328c8df
Show file tree
Hide file tree
Showing 68 changed files with 407 additions and 404 deletions.
37 changes: 37 additions & 0 deletions Sources/ClientRuntime/Endpoints/DefaultEndpointResolver.swift
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 Sources/ClientRuntime/Endpoints/EndpointResolverMiddleware.swift
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()
}
}
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 }
}
149 changes: 0 additions & 149 deletions Sources/WeatherSDK/EndpointResolver.swift

This file was deleted.

46 changes: 46 additions & 0 deletions Sources/WeatherSDK/Endpoints.swift
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 {}
1 change: 1 addition & 0 deletions Sources/WeatherSDK/WeatherClient.swift
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import enum ClientRuntime.SDKLogLevel
import protocol ClientRuntime.IdempotencyTokenGenerator
import protocol ClientRuntime.SDKLogHandlerFactory
import protocol ClientRuntime.TelemetryProvider
import protocol SmithyHTTPAPI.HTTPClient

public class WeatherClient: Client {
public static let clientName = "WeatherClient"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import ClientRuntime
import SmithyHTTPAPI
import SmithyJSON
import SmithyReadWrite
import class SmithyHTTPAPI.HttpResponse

extension CreateCityOutput {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import SmithyHTTPAPI
import SmithyJSON
import SmithyReadWrite
import SmithyTestUtil
import class SmithyHTTPAPI.HttpResponse

enum CreateCityOutputError {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import ClientRuntime
import SmithyHTTPAPI
import SmithyJSON
import SmithyReadWrite
import class SmithyHTTPAPI.HttpResponse

extension GetCityAnnouncementsOutput {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import SmithyHTTPAPI
import SmithyJSON
import SmithyReadWrite
import SmithyTestUtil
import class SmithyHTTPAPI.HttpResponse

enum GetCityAnnouncementsOutputError {

Expand Down
Loading

0 comments on commit 328c8df

Please sign in to comment.