Skip to content

Commit e3e4097

Browse files
authored
feat: expose ability to set framework in useragent (#494)
1 parent e4b0fd2 commit e3e4097

File tree

7 files changed

+36
-17
lines changed

7 files changed

+36
-17
lines changed

Diff for: AWSClientRuntime/Sources/AWSClientConfiguration.swift

+1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ public protocol AWSRuntimeConfiguration {
1111
var signingRegion: String? {get set}
1212
var endpointResolver: EndpointResolver {get set}
1313
var regionResolver: RegionResolver {get set}
14+
var frameworkMetadata: FrameworkMetadata? {get set}
1415
}
1516

1617
public typealias AWSClientConfiguration = SDKRuntimeConfiguration & AWSRuntimeConfiguration

Diff for: AWSClientRuntime/Sources/Http/AWSUserAgentMetadata.swift

+3-2
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ public struct AWSUserAgentMetadata {
5959
self.frameworkMetadata = frameworkMetadata
6060
}
6161

62-
public static func fromEnv(apiMetadata: APIMetadata) -> AWSUserAgentMetadata {
62+
public static func fromEnv(apiMetadata: APIMetadata, frameworkMetadata: FrameworkMetadata? = nil) -> AWSUserAgentMetadata {
6363
let sdkMetadata = SDKMetadata(name: "swift", version: apiMetadata.version)
6464
// TODO: figure out a better way to get both current OS and version of that OS
6565
let osMetadata = OSMetadata(family: currentOS, version: nil)
@@ -68,6 +68,7 @@ public struct AWSUserAgentMetadata {
6868
apiMetadata: apiMetadata,
6969
osMetadata: osMetadata,
7070
languageMetadata: langMetadata,
71-
executionEnvMetadata: ExecutionEnvMetadata.detectExecEnv())
71+
executionEnvMetadata: ExecutionEnvMetadata.detectExecEnv(),
72+
frameworkMetadata: frameworkMetadata)
7273
}
7374
}

Diff for: codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/AWSClientRuntimeTypes.kt

+1
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ object AWSClientRuntimeTypes {
3939
val RetryerMiddleware = runtimeSymbol("RetryerMiddleware")
4040
val EndpointResolverMiddleware = runtimeSymbol("EndpointResolverMiddleware")
4141
val EndpointResolver = runtimeSymbol("EndpointResolver")
42+
val FrameworkMetadata = runtimeSymbol("FrameworkMetadata")
4243
val CredentialsProvider = runtimeSymbol("CredentialsProvider")
4344
val AWSCredentialsProvider = runtimeSymbol("AWSCredentialsProvider")
4445
val AWSClientConfiguration = runtimeSymbol("AWSClientConfiguration")

Diff for: codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/AWSServiceConfig.kt

+18-10
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,12 @@ import software.amazon.smithy.swift.codegen.SwiftWriter
1212
import software.amazon.smithy.swift.codegen.integration.ConfigField
1313
import software.amazon.smithy.swift.codegen.integration.ServiceConfig
1414

15-
const val REGION_CONFIG_NAME = "region"
1615
const val CREDENTIALS_PROVIDER_CONFIG_NAME = "credentialsProvider"
17-
const val SIGNING_REGION_CONFIG_NAME = "signingRegion"
1816
const val ENDPOINT_RESOLVER = "endpointResolver"
17+
const val FRAMEWORK_METADATA = "frameworkMetadata"
18+
const val REGION_CONFIG_NAME = "region"
1919
const val REGION_RESOLVER = "regionResolver"
20+
const val SIGNING_REGION_CONFIG_NAME = "signingRegion"
2021

2122
class AWSServiceConfig(writer: SwiftWriter, serviceName: String) : ServiceConfig(writer, serviceName) {
2223
override val typesToConformConfigTo: List<Symbol>
@@ -41,6 +42,7 @@ class AWSServiceConfig(writer: SwiftWriter, serviceName: String) : ServiceConfig
4142
}
4243
writer.indent().write("self.credentialsProvider = try \$N.fromChain()", AWSClientRuntimeTypes.Core.AWSCredentialsProvider)
4344
writer.dedent().write("}")
45+
writer.write("self.frameworkMetadata = frameworkMetadata")
4446
val runtimeTimeConfigFields = sdkRuntimeConfigProperties()
4547
runtimeTimeConfigFields.forEach {
4648
writer.write("self.${it.memberName} = runtimeConfig.${it.memberName}")
@@ -68,22 +70,28 @@ class AWSServiceConfig(writer: SwiftWriter, serviceName: String) : ServiceConfig
6870

6971
override fun otherRuntimeConfigProperties(): List<ConfigField> {
7072
return listOf(
71-
ConfigField(
72-
REGION_CONFIG_NAME,
73-
SwiftTypes.String,
74-
"\$T",
75-
"The region to send requests to. (Required)"
76-
),
7773
ConfigField(
7874
CREDENTIALS_PROVIDER_CONFIG_NAME, AWSClientRuntimeTypes.Core.CredentialsProvider,
7975
documentation = "The credentials provider to use to authenticate requests."
8076
),
81-
ConfigField(SIGNING_REGION_CONFIG_NAME, SwiftTypes.String, "\$T", "The region to sign requests in. (Required)"),
8277
ConfigField(
8378
ENDPOINT_RESOLVER, AWSClientRuntimeTypes.Core.EndpointResolver,
8479
documentation = "The endpoint resolver used to resolve endpoints."
8580
),
86-
ConfigField(REGION_RESOLVER, AWSClientRuntimeTypes.Core.RegionResolver, documentation = "The region resolver uses an array of region providers to resolve the region.")
81+
ConfigField(
82+
FRAMEWORK_METADATA,
83+
AWSClientRuntimeTypes.Core.FrameworkMetadata,
84+
formatter = "\$T",
85+
documentation = "Contains information to inject lib/ into user-agent"
86+
),
87+
ConfigField(
88+
REGION_CONFIG_NAME,
89+
SwiftTypes.String,
90+
"\$T",
91+
"The region to send requests to. (Required)"
92+
),
93+
ConfigField(REGION_RESOLVER, AWSClientRuntimeTypes.Core.RegionResolver, documentation = "The region resolver uses an array of region providers to resolve the region."),
94+
ConfigField(SIGNING_REGION_CONFIG_NAME, SwiftTypes.String, "\$T", "The region to sign requests in. (Required)")
8795
).sortedBy { it.memberName }
8896
}
8997
}

Diff for: codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/middleware/UserAgentMiddleware.kt

+2-1
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,11 @@ class UserAgentMiddleware(val settings: SwiftSettings) : MiddlewareRenderable {
2222
override val position = MiddlewarePosition.BEFORE
2323

2424
override fun render(writer: SwiftWriter, op: OperationShape, operationStackName: String) {
25+
writer.write("let apiMetadata = \$N(serviceId: serviceName, version: \"${settings.moduleVersion}\")", AWSClientRuntimeTypes.Core.APIMetadata)
2526
writer.write("$operationStackName.${middlewareStep.stringValue()}.intercept(position: ${position.stringValue()}, middleware: \$N(${middlewareParamsString()}))", AWSClientRuntimeTypes.Core.UserAgentMiddleware)
2627
}
2728

2829
private fun middlewareParamsString(): String {
29-
return "metadata: ${AWSClientRuntimeTypes.Core.AWSUserAgentMetadata}.fromEnv(apiMetadata: ${AWSClientRuntimeTypes.Core.APIMetadata}(serviceId: serviceName, version: \"${settings.moduleVersion}\"))"
30+
return "metadata: ${AWSClientRuntimeTypes.Core.AWSUserAgentMetadata}.fromEnv(apiMetadata: apiMetadata, frameworkMetadata: config.frameworkMetadata)"
3031
}
3132
}

Diff for: codegen/smithy-aws-swift-codegen/src/test/kotlin/software/amazon/smithy/aws/swift/codegen/PresignerGeneratorTests.kt

+6-3
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,8 @@ class PresignerGeneratorTests {
4444
operation.initializeStep.intercept(position: .after, middleware: GetFooInputURLPathMiddleware())
4545
operation.initializeStep.intercept(position: .after, middleware: GetFooInputURLHostMiddleware())
4646
operation.buildStep.intercept(position: .before, middleware: AWSClientRuntime.EndpointResolverMiddleware(endpointResolver: config.endpointResolver, serviceId: serviceName))
47-
operation.buildStep.intercept(position: .before, middleware: AWSClientRuntime.UserAgentMiddleware(metadata: AWSClientRuntime.AWSUserAgentMetadata.fromEnv(apiMetadata: AWSClientRuntime.APIMetadata(serviceId: serviceName, version: "1.0.0"))))
47+
let apiMetadata = AWSClientRuntime.APIMetadata(serviceId: serviceName, version: "1.0.0")
48+
operation.buildStep.intercept(position: .before, middleware: AWSClientRuntime.UserAgentMiddleware(metadata: AWSClientRuntime.AWSUserAgentMetadata.fromEnv(apiMetadata: apiMetadata, frameworkMetadata: config.frameworkMetadata)))
4849
operation.serializeStep.intercept(position: .after, middleware: GetFooInputHeadersMiddleware())
4950
operation.serializeStep.intercept(position: .after, middleware: GetFooInputQueryItemMiddleware())
5051
operation.finalizeStep.intercept(position: .after, middleware: AWSClientRuntime.RetryerMiddleware(retryer: config.retryer))
@@ -99,7 +100,8 @@ class PresignerGeneratorTests {
99100
operation.initializeStep.intercept(position: .after, middleware: PostFooInputURLPathMiddleware())
100101
operation.initializeStep.intercept(position: .after, middleware: PostFooInputURLHostMiddleware())
101102
operation.buildStep.intercept(position: .before, middleware: AWSClientRuntime.EndpointResolverMiddleware(endpointResolver: config.endpointResolver, serviceId: serviceName))
102-
operation.buildStep.intercept(position: .before, middleware: AWSClientRuntime.UserAgentMiddleware(metadata: AWSClientRuntime.AWSUserAgentMetadata.fromEnv(apiMetadata: AWSClientRuntime.APIMetadata(serviceId: serviceName, version: "1.0.0"))))
103+
let apiMetadata = AWSClientRuntime.APIMetadata(serviceId: serviceName, version: "1.0.0")
104+
operation.buildStep.intercept(position: .before, middleware: AWSClientRuntime.UserAgentMiddleware(metadata: AWSClientRuntime.AWSUserAgentMetadata.fromEnv(apiMetadata: apiMetadata, frameworkMetadata: config.frameworkMetadata)))
103105
operation.serializeStep.intercept(position: .after, middleware: PostFooInputHeadersMiddleware())
104106
operation.serializeStep.intercept(position: .after, middleware: PostFooInputQueryItemMiddleware())
105107
operation.serializeStep.intercept(position: .after, middleware: ContentTypeMiddleware<PostFooInput, PostFooOutputResponse, PostFooOutputError>(contentType: "application/json"))
@@ -157,7 +159,8 @@ class PresignerGeneratorTests {
157159
operation.initializeStep.intercept(position: .after, middleware: PutFooInputURLPathMiddleware())
158160
operation.initializeStep.intercept(position: .after, middleware: PutFooInputURLHostMiddleware())
159161
operation.buildStep.intercept(position: .before, middleware: AWSClientRuntime.EndpointResolverMiddleware(endpointResolver: config.endpointResolver, serviceId: serviceName))
160-
operation.buildStep.intercept(position: .before, middleware: AWSClientRuntime.UserAgentMiddleware(metadata: AWSClientRuntime.AWSUserAgentMetadata.fromEnv(apiMetadata: AWSClientRuntime.APIMetadata(serviceId: serviceName, version: "1.0.0"))))
162+
let apiMetadata = AWSClientRuntime.APIMetadata(serviceId: serviceName, version: "1.0.0")
163+
operation.buildStep.intercept(position: .before, middleware: AWSClientRuntime.UserAgentMiddleware(metadata: AWSClientRuntime.AWSUserAgentMetadata.fromEnv(apiMetadata: apiMetadata, frameworkMetadata: config.frameworkMetadata)))
161164
operation.serializeStep.intercept(position: .after, middleware: PutFooInputHeadersMiddleware())
162165
operation.serializeStep.intercept(position: .after, middleware: PutFooInputQueryItemMiddleware())
163166
operation.serializeStep.intercept(position: .after, middleware: ContentTypeMiddleware<PutFooInput, PutFooOutputResponse, PutFooOutputError>(contentType: "application/json"))

Diff for: codegen/smithy-aws-swift-codegen/src/test/kotlin/software/amazon/smithy/aws/swift/codegen/RestJsonProtocolGeneratorTests.kt

+5-1
Original file line numberDiff line numberDiff line change
@@ -119,13 +119,15 @@ class RestJsonProtocolGeneratorTests {
119119
120120
public var credentialsProvider: AWSClientRuntime.CredentialsProvider
121121
public var endpointResolver: AWSClientRuntime.EndpointResolver
122+
public var frameworkMetadata: AWSClientRuntime.FrameworkMetadata?
122123
public var region: Swift.String?
123124
public var regionResolver: AWSClientRuntime.RegionResolver
124125
public var signingRegion: Swift.String?
125126
126127
public init(
127128
credentialsProvider: AWSClientRuntime.CredentialsProvider? = nil,
128129
endpointResolver: AWSClientRuntime.EndpointResolver? = nil,
130+
frameworkMetadata: AWSClientRuntime.FrameworkMetadata? = nil,
129131
region: Swift.String? = nil,
130132
regionResolver: AWSClientRuntime.RegionResolver? = nil,
131133
signingRegion: Swift.String? = nil,
@@ -141,6 +143,7 @@ class RestJsonProtocolGeneratorTests {
141143
} else {
142144
self.credentialsProvider = try AWSClientRuntime.AWSCredentialsProvider.fromChain()
143145
}
146+
self.frameworkMetadata = frameworkMetadata
144147
self.clientLogMode = runtimeConfig.clientLogMode
145148
self.decoder = runtimeConfig.decoder
146149
self.encoder = runtimeConfig.encoder
@@ -154,12 +157,13 @@ class RestJsonProtocolGeneratorTests {
154157
public convenience init(
155158
credentialsProvider: AWSClientRuntime.CredentialsProvider? = nil,
156159
endpointResolver: AWSClientRuntime.EndpointResolver? = nil,
160+
frameworkMetadata: AWSClientRuntime.FrameworkMetadata? = nil,
157161
region: Swift.String? = nil,
158162
regionResolver: AWSClientRuntime.RegionResolver? = nil,
159163
signingRegion: Swift.String? = nil
160164
) throws {
161165
let defaultRuntimeConfig = try ClientRuntime.DefaultSDKRuntimeConfiguration("ExampleClient")
162-
try self.init(credentialsProvider: credentialsProvider, endpointResolver: endpointResolver, region: region, regionResolver: regionResolver, signingRegion: signingRegion, runtimeConfig: defaultRuntimeConfig)
166+
try self.init(credentialsProvider: credentialsProvider, endpointResolver: endpointResolver, frameworkMetadata: frameworkMetadata, region: region, regionResolver: regionResolver, signingRegion: signingRegion, runtimeConfig: defaultRuntimeConfig)
163167
}
164168
}
165169
}

0 commit comments

Comments
 (0)