Skip to content

Commit c1bcb04

Browse files
authored
fix: favor endpointUrl over endpoint discovery when provided (#1240)
1 parent d7e3603 commit c1bcb04

File tree

3 files changed

+47
-28
lines changed

3 files changed

+47
-28
lines changed
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
{
2+
"id": "e7d8178c-4211-443d-b4d9-44d7019aefd1",
3+
"type": "bugfix",
4+
"description": "Favor `endpointUrl` over endpoint discovery when provided",
5+
"issues": [
6+
"https://github.com/awslabs/aws-sdk-kotlin/issues/1413"
7+
]
8+
}

codegen/smithy-kotlin-codegen/src/main/kotlin/software/amazon/smithy/kotlin/codegen/rendering/endpoints/discovery/EndpointDiscovererGenerator.kt

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import software.amazon.smithy.kotlin.codegen.model.buildSymbol
1313
import software.amazon.smithy.kotlin.codegen.model.expectShape
1414
import software.amazon.smithy.kotlin.codegen.model.expectTrait
1515
import software.amazon.smithy.kotlin.codegen.rendering.endpoints.EndpointResolverAdapterGenerator
16+
import software.amazon.smithy.kotlin.codegen.rendering.endpoints.SdkEndpointBuiltinIntegration
1617
import software.amazon.smithy.model.shapes.OperationShape
1718
import software.amazon.smithy.model.shapes.ServiceShape
1819

@@ -80,21 +81,27 @@ class EndpointDiscovererGenerator(private val ctx: CodegenContext, private val d
8081
EndpointResolverAdapterGenerator.getSymbol(ctx.settings),
8182
RuntimeTypes.HttpClient.Operation.EndpointResolver,
8283
) {
83-
write("val identity = request.identity")
84-
write(
85-
"""require(identity is #T) { "Endpoint discovery requires AWS credentials" }""",
86-
RuntimeTypes.Auth.Credentials.AwsCredentials.Credentials,
87-
)
88-
write("")
89-
write("val cacheKey = DiscoveryParams(client.config.region, identity.accessKeyId)")
90-
write("request.context[discoveryParamsKey] = cacheKey")
91-
write("val discoveredHost = cache.get(cacheKey) { discoverHost(client) }")
92-
write("")
93-
write("val originalEndpoint = delegate.resolve(request)")
94-
withBlock("#T(", ")", RuntimeTypes.SmithyClient.Endpoints.Endpoint) {
95-
write("originalEndpoint.uri.copy { host = discoveredHost },")
96-
write("originalEndpoint.headers,")
97-
write("originalEndpoint.attributes,")
84+
// Backported from https://github.com/smithy-lang/smithy-kotlin/pull/1221; replace when merging v1.5 to main
85+
withBlock("if (client.config.#L == null) {", "}", SdkEndpointBuiltinIntegration.EndpointUrlProp.propertyName) {
86+
write("val identity = request.identity")
87+
write(
88+
"""require(identity is #T) { "Endpoint discovery requires AWS credentials" }""",
89+
RuntimeTypes.Auth.Credentials.AwsCredentials.Credentials,
90+
)
91+
write("")
92+
write("val cacheKey = DiscoveryParams(client.config.region, identity.accessKeyId)")
93+
write("request.context[discoveryParamsKey] = cacheKey")
94+
write("val discoveredHost = cache.get(cacheKey) { discoverHost(client) }")
95+
write("")
96+
write("val originalEndpoint = delegate.resolve(request)")
97+
withBlock("#T(", ")", RuntimeTypes.SmithyClient.Endpoints.Endpoint) {
98+
write("originalEndpoint.uri.copy { host = discoveredHost },")
99+
write("originalEndpoint.headers,")
100+
write("originalEndpoint.attributes,")
101+
}
102+
// If user manually specifies endpointUrl, skip endpoint discovery
103+
closeAndOpenBlock("} else {")
104+
write("delegate.resolve(request)")
98105
}
99106
}
100107
}

codegen/smithy-kotlin-codegen/src/test/kotlin/software/amazon/smithy/kotlin/codegen/rendering/endpoints/discovery/EndpointDiscovererGeneratorTest.kt

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -37,19 +37,23 @@ class EndpointDiscovererGeneratorTest {
3737
actual.shouldContainOnlyOnceWithDiff(
3838
"""
3939
internal fun asEndpointResolver(client: TestClient, delegate: EndpointResolverAdapter) = EndpointResolver { request ->
40-
val identity = request.identity
41-
require(identity is Credentials) { "Endpoint discovery requires AWS credentials" }
42-
43-
val cacheKey = DiscoveryParams(client.config.region, identity.accessKeyId)
44-
request.context[discoveryParamsKey] = cacheKey
45-
val discoveredHost = cache.get(cacheKey) { discoverHost(client) }
46-
47-
val originalEndpoint = delegate.resolve(request)
48-
Endpoint(
49-
originalEndpoint.uri.copy { host = discoveredHost },
50-
originalEndpoint.headers,
51-
originalEndpoint.attributes,
52-
)
40+
if (client.config.endpointUrl == null) {
41+
val identity = request.identity
42+
require(identity is Credentials) { "Endpoint discovery requires AWS credentials" }
43+
44+
val cacheKey = DiscoveryParams(client.config.region, identity.accessKeyId)
45+
request.context[discoveryParamsKey] = cacheKey
46+
val discoveredHost = cache.get(cacheKey) { discoverHost(client) }
47+
48+
val originalEndpoint = delegate.resolve(request)
49+
Endpoint(
50+
originalEndpoint.uri.copy { host = discoveredHost },
51+
originalEndpoint.headers,
52+
originalEndpoint.attributes,
53+
)
54+
} else {
55+
delegate.resolve(request)
56+
}
5357
}
5458
""".formatForTest(),
5559
)

0 commit comments

Comments
 (0)