Skip to content

Commit 66e95fb

Browse files
authored
refactor: split http package and move Url into core (#793)
1 parent 57dfad1 commit 66e95fb

File tree

123 files changed

+461
-377
lines changed

Some content is hidden

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

123 files changed

+461
-377
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"id": "ded556fb-ecfc-4270-943b-bde40685372e",
3+
"type": "misc",
4+
"description": "Refactor: split client side HTTP abstractions into new module. Move Url into core"
5+
}

codegen/smithy-kotlin-codegen/src/main/kotlin/software/amazon/smithy/kotlin/codegen/core/KotlinDependency.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ data class KotlinDependency(
100100
// AWS managed dependencies
101101
val CORE = KotlinDependency(GradleConfiguration.Api, RUNTIME_ROOT_NS, RUNTIME_GROUP, "runtime-core", RUNTIME_VERSION)
102102
val HTTP = KotlinDependency(GradleConfiguration.Implementation, "$RUNTIME_ROOT_NS.http", RUNTIME_GROUP, "http", RUNTIME_VERSION)
103+
val HTTP_CLIENT = KotlinDependency(GradleConfiguration.Api, "$RUNTIME_ROOT_NS.http", RUNTIME_GROUP, "http-client", RUNTIME_VERSION)
103104
val SERDE = KotlinDependency(GradleConfiguration.Implementation, "$RUNTIME_ROOT_NS.serde", RUNTIME_GROUP, "serde", RUNTIME_VERSION)
104105
val SERDE_JSON = KotlinDependency(GradleConfiguration.Implementation, "$RUNTIME_ROOT_NS.serde.json", RUNTIME_GROUP, "serde-json", RUNTIME_VERSION)
105106
val SERDE_XML = KotlinDependency(GradleConfiguration.Implementation, "$RUNTIME_ROOT_NS.serde.xml", RUNTIME_GROUP, "serde-xml", RUNTIME_VERSION)

codegen/smithy-kotlin-codegen/src/main/kotlin/software/amazon/smithy/kotlin/codegen/core/RuntimeTypes.kt

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,25 +18,17 @@ object RuntimeTypes {
1818
object Http : RuntimeTypePackage(KotlinDependency.HTTP) {
1919
val HttpBody = symbol("HttpBody")
2020
val HttpMethod = symbol("HttpMethod")
21-
val SdkHttpClient = symbol("SdkHttpClient")
22-
val SdkHttpClientFn = symbol("sdkHttpClient")
2321
val ByteArrayContent = symbol("ByteArrayContent", subpackage = "content")
24-
val QueryParameters = symbol("QueryParameters")
25-
val QueryParametersBuilder = symbol("QueryParametersBuilder")
26-
val toQueryParameters = symbol("toQueryParameters")
2722
val readAll = symbol("readAll")
28-
val parameters = symbol("parameters")
2923
val toByteStream = symbol("toByteStream")
3024
val toHttpBody = symbol("toHttpBody")
3125
val isSuccess = symbol("isSuccess")
3226
val StatusCode = symbol("HttpStatusCode")
3327
val toSdkByteReadChannel = symbol("toSdkByteReadChannel")
3428
val Headers = symbol("Headers")
35-
val Url = symbol("Url")
3629

3730
object Util : RuntimeTypePackage(KotlinDependency.HTTP, "util") {
3831
val encodeLabel = symbol("encodeLabel")
39-
val splitAsQueryParameters = symbol("splitAsQueryParameters")
4032
val quoteHeaderValue = symbol("quoteHeaderValue")
4133
}
4234

@@ -52,6 +44,9 @@ object RuntimeTypes {
5244
val HttpCall = symbol("HttpCall")
5345
val HttpResponse = symbol("HttpResponse")
5446
}
47+
}
48+
object HttpClient : RuntimeTypePackage(KotlinDependency.HTTP_CLIENT) {
49+
val SdkHttpClient = symbol("SdkHttpClient")
5550

5651
object Middleware : RuntimeTypePackage(KotlinDependency.HTTP, "middleware") {
5752
val MutateHeadersMiddleware = symbol("MutateHeaders")
@@ -90,10 +85,12 @@ object RuntimeTypes {
9085
object Config : RuntimeTypePackage(KotlinDependency.HTTP, "config") {
9186
val HttpClientConfig = symbol("HttpClientConfig")
9287
}
88+
9389
object Engine : RuntimeTypePackage(KotlinDependency.HTTP, "engine") {
9490
val HttpClientEngine = symbol("HttpClientEngine")
9591
val manage = symbol("manage", "engine.internal", isExtension = true)
9692
}
93+
9794
object Interceptors : RuntimeTypePackage(KotlinDependency.HTTP, "interceptors") {
9895
val HttpInterceptor = symbol("HttpInterceptor")
9996
val Md5ChecksumInterceptor = symbol("Md5ChecksumInterceptor")
@@ -103,7 +100,7 @@ object RuntimeTypes {
103100
}
104101

105102
object Core : RuntimeTypePackage(KotlinDependency.CORE) {
106-
val ExecutionContext = symbol("ExecutionContext", "client")
103+
val ExecutionContext = symbol("ExecutionContext", "operation")
107104
val ErrorMetadata = symbol("ErrorMetadata")
108105
val ServiceErrorMetadata = symbol("ServiceErrorMetadata")
109106
val Instant = symbol("Instant", "time")
@@ -171,6 +168,15 @@ object RuntimeTypes {
171168
val encodeBase64 = symbol("encodeBase64")
172169
val encodeBase64String = symbol("encodeBase64String")
173170
}
171+
172+
object Net : RuntimeTypePackage(KotlinDependency.CORE, "net") {
173+
val parameters = symbol("parameters")
174+
val QueryParameters = symbol("QueryParameters")
175+
val QueryParametersBuilder = symbol("QueryParametersBuilder")
176+
val splitAsQueryParameters = symbol("splitAsQueryParameters")
177+
val toQueryParameters = symbol("toQueryParameters")
178+
val Url = symbol("Url")
179+
}
174180
}
175181

176182
object SmithyClient : RuntimeTypePackage(KotlinDependency.SMITHY_CLIENT) {

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

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,10 @@ import software.amazon.smithy.rulesengine.language.visit.TemplateVisitor
3030
* The core set of standard library functions available to the rules language.
3131
*/
3232
internal val coreFunctions: Map<String, Symbol> = mapOf(
33-
"substring" to RuntimeTypes.Http.Endpoints.Functions.substring,
34-
"isValidHostLabel" to RuntimeTypes.Http.Endpoints.Functions.isValidHostLabel,
35-
"uriEncode" to RuntimeTypes.Http.Endpoints.Functions.uriEncode,
36-
"parseURL" to RuntimeTypes.Http.Endpoints.Functions.parseUrl,
33+
"substring" to RuntimeTypes.HttpClient.Endpoints.Functions.substring,
34+
"isValidHostLabel" to RuntimeTypes.HttpClient.Endpoints.Functions.isValidHostLabel,
35+
"uriEncode" to RuntimeTypes.HttpClient.Endpoints.Functions.uriEncode,
36+
"parseURL" to RuntimeTypes.HttpClient.Endpoints.Functions.parseUrl,
3737
)
3838

3939
/**
@@ -98,11 +98,11 @@ class DefaultEndpointProviderGenerator(
9898
"public override suspend fun resolveEndpoint(params: #T): #T {",
9999
"}",
100100
paramsSymbol,
101-
RuntimeTypes.Http.Endpoints.Endpoint,
101+
RuntimeTypes.HttpClient.Endpoints.Endpoint,
102102
) {
103103
rules.rules.forEach(::renderRule)
104104
write("")
105-
write("throw #T(\"endpoint rules were exhausted without a match\")", RuntimeTypes.Http.Endpoints.EndpointProviderException)
105+
write("throw #T(\"endpoint rules were exhausted without a match\")", RuntimeTypes.HttpClient.Endpoints.EndpointProviderException)
106106
}
107107
}
108108

@@ -145,8 +145,8 @@ class DefaultEndpointProviderGenerator(
145145

146146
private fun renderEndpointRule(rule: EndpointRule) {
147147
withConditions(rule.conditions) {
148-
writer.withBlock("return #T(", ")", RuntimeTypes.Http.Endpoints.Endpoint) {
149-
writeInline("#T.parse(", RuntimeTypes.Http.Url)
148+
writer.withBlock("return #T(", ")", RuntimeTypes.HttpClient.Endpoints.Endpoint) {
149+
writeInline("#T.parse(", RuntimeTypes.Core.Net.Url)
150150
renderExpression(rule.endpoint.url)
151151
write("),")
152152

@@ -189,7 +189,7 @@ class DefaultEndpointProviderGenerator(
189189

190190
private fun renderErrorRule(rule: ErrorRule) {
191191
withConditions(rule.conditions) {
192-
writer.writeInline("throw #T(", RuntimeTypes.Http.Endpoints.EndpointProviderException)
192+
writer.writeInline("throw #T(", RuntimeTypes.HttpClient.Endpoints.EndpointProviderException)
193193
renderExpression(rule.error)
194194
writer.write(")")
195195
}

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ class DefaultEndpointProviderTestGenerator(
9494

9595
private fun renderTestCaseExpectation(case: EndpointTestCase) {
9696
if (case.expect.error.isPresent) {
97-
writer.withBlock("val ex = assertFailsWith<#T> {", "}", RuntimeTypes.Http.Endpoints.EndpointProviderException) {
97+
writer.withBlock("val ex = assertFailsWith<#T> {", "}", RuntimeTypes.HttpClient.Endpoints.EndpointProviderException) {
9898
write("#T().resolveEndpoint(params)", providerSymbol)
9999
}
100100
writer.write("assertEquals(#S, ex.message)", case.expect.error.get())
@@ -105,8 +105,8 @@ class DefaultEndpointProviderTestGenerator(
105105
CodegenException("endpoint test case has neither an expected error nor endpoint")
106106
}
107107

108-
writer.withBlock("val expected = #T(", ")", RuntimeTypes.Http.Endpoints.Endpoint) {
109-
write("uri = #T.parse(#S),", RuntimeTypes.Http.Url, endpoint.url)
108+
writer.withBlock("val expected = #T(", ")", RuntimeTypes.HttpClient.Endpoints.Endpoint) {
109+
write("uri = #T.parse(#S),", RuntimeTypes.Core.Net.Url, endpoint.url)
110110

111111
if (endpoint.headers.isNotEmpty()) {
112112
withBlock("headers = #T {", "},", RuntimeTypes.Http.Headers) {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ class EndpointProviderGenerator(
3131

3232
fun render() {
3333
renderDocumentation()
34-
writer.write("public typealias EndpointProvider = #T<#T>", RuntimeTypes.Http.Endpoints.EndpointProvider, paramsSymbol)
34+
writer.write("public typealias EndpointProvider = #T<#T>", RuntimeTypes.HttpClient.Endpoints.EndpointProvider, paramsSymbol)
3535
}
3636

3737
private fun renderDocumentation() {

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ class ResolveEndpointMiddlewareGenerator(
4646
fun render() {
4747
writer.openBlock("internal class #L<I>(", CLASS_NAME)
4848
renderConstructorParams()
49-
writer.closeAndOpenBlock("): #T {", RuntimeTypes.Http.Interceptors.HttpInterceptor)
49+
writer.closeAndOpenBlock("): #T {", RuntimeTypes.HttpClient.Interceptors.HttpInterceptor)
5050
renderClassMembers()
5151
writer.write("")
5252
renderBody()
@@ -83,8 +83,8 @@ class ResolveEndpointMiddlewareGenerator(
8383
write("val endpoint = endpointProvider.resolveEndpoint(params)")
8484
write("#T.#T<$CLASS_NAME<*>>{ \"resolved endpoint: \$endpoint\" }", RuntimeTypes.KotlinCoroutines.coroutineContext, RuntimeTypes.Tracing.Core.debug)
8585
write("val reqBuilder = context.protocolRequest.#T()", RuntimeTypes.Http.Request.toBuilder)
86-
write("val req = #T(context.executionContext, reqBuilder)", RuntimeTypes.Http.Operation.SdkHttpRequest)
87-
write("#T(req, endpoint)", RuntimeTypes.Http.Endpoints.setResolvedEndpoint)
86+
write("val req = #T(context.executionContext, reqBuilder)", RuntimeTypes.HttpClient.Operation.SdkHttpRequest)
87+
write("#T(req, endpoint)", RuntimeTypes.HttpClient.Endpoints.setResolvedEndpoint)
8888
renderPostResolution()
8989
write("return req.subject.build()")
9090
}

codegen/smithy-kotlin-codegen/src/main/kotlin/software/amazon/smithy/kotlin/codegen/rendering/protocol/HttpBindingProtocolGenerator.kt

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import software.amazon.smithy.kotlin.codegen.core.*
1212
import software.amazon.smithy.kotlin.codegen.lang.KotlinTypes
1313
import software.amazon.smithy.kotlin.codegen.lang.toEscapedLiteral
1414
import software.amazon.smithy.kotlin.codegen.model.*
15-
import software.amazon.smithy.kotlin.codegen.rendering.endpoints.*
1615
import software.amazon.smithy.kotlin.codegen.rendering.serde.*
1716
import software.amazon.smithy.model.Model
1817
import software.amazon.smithy.model.knowledge.HttpBinding
@@ -166,7 +165,7 @@ abstract class HttpBindingProtocolGenerator : ProtocolGenerator {
166165
val operationSerializerSymbols = setOf(
167166
RuntimeTypes.Http.HttpBody,
168167
RuntimeTypes.Http.HttpMethod,
169-
RuntimeTypes.Http.Operation.HttpSerialize,
168+
RuntimeTypes.HttpClient.Operation.HttpSerialize,
170169
RuntimeTypes.Http.ByteArrayContent,
171170
RuntimeTypes.Http.Request.HttpRequestBuilder,
172171
RuntimeTypes.Http.Request.url,
@@ -178,7 +177,7 @@ abstract class HttpBindingProtocolGenerator : ProtocolGenerator {
178177
writer
179178
.addImport(operationSerializerSymbols)
180179
.write("")
181-
.openBlock("internal class #T: #T<#T> {", serializerSymbol, RuntimeTypes.Http.Operation.HttpSerialize, inputSymbol)
180+
.openBlock("internal class #T: #T<#T> {", serializerSymbol, RuntimeTypes.HttpClient.Operation.HttpSerialize, inputSymbol)
182181
.call {
183182
writer.openBlock("override suspend fun serialize(context: #T, input: #T): #T {", RuntimeTypes.Core.ExecutionContext, inputSymbol, RuntimeTypes.Http.Request.HttpRequestBuilder)
184183
.write("val builder = #T()", RuntimeTypes.Http.Request.HttpRequestBuilder)
@@ -361,8 +360,7 @@ abstract class HttpBindingProtocolGenerator : ProtocolGenerator {
361360
if (queryBindings.isEmpty() && queryLiterals.isEmpty() && queryMapBindings.isEmpty()) return
362361

363362
writer
364-
.addImport(RuntimeTypes.Http.parameters)
365-
.withBlock("#T {", "}", RuntimeTypes.Http.parameters) {
363+
.withBlock("#T {", "}", RuntimeTypes.Core.Net.parameters) {
366364
queryLiterals.forEach { (key, value) ->
367365
writer.write("append(#S, #S)", key, value)
368366
}
@@ -492,7 +490,7 @@ abstract class HttpBindingProtocolGenerator : ProtocolGenerator {
492490
reference(outputSymbol, SymbolReference.ContextOption.DECLARE)
493491
}
494492
val operationDeserializerSymbols = setOf(
495-
RuntimeTypes.Http.Operation.HttpDeserialize,
493+
RuntimeTypes.HttpClient.Operation.HttpDeserialize,
496494
RuntimeTypes.Http.Response.HttpResponse,
497495
)
498496

@@ -508,7 +506,7 @@ abstract class HttpBindingProtocolGenerator : ProtocolGenerator {
508506
.openBlock(
509507
"internal class #T: #T<#T> {",
510508
deserializerSymbol,
511-
RuntimeTypes.Http.Operation.HttpDeserialize,
509+
RuntimeTypes.HttpClient.Operation.HttpDeserialize,
512510
outputSymbol,
513511
)
514512
.write("")
@@ -543,7 +541,7 @@ abstract class HttpBindingProtocolGenerator : ProtocolGenerator {
543541
RuntimeTypes.Serde.SerialKind,
544542
RuntimeTypes.Serde.deserializeStruct,
545543
RuntimeTypes.Http.Response.HttpResponse,
546-
RuntimeTypes.Http.Operation.HttpDeserialize,
544+
RuntimeTypes.HttpClient.Operation.HttpDeserialize,
547545
)
548546

549547
val deserializerSymbol = buildSymbol {
@@ -560,7 +558,7 @@ abstract class HttpBindingProtocolGenerator : ProtocolGenerator {
560558
writer
561559
.addImport(exceptionDeserializerSymbols)
562560
.write("")
563-
.openBlock("internal class #T: #T<#T> {", deserializerSymbol, RuntimeTypes.Http.Operation.HttpDeserialize, outputSymbol)
561+
.openBlock("internal class #T: #T<#T> {", deserializerSymbol, RuntimeTypes.HttpClient.Operation.HttpDeserialize, outputSymbol)
564562
.write("")
565563
.call {
566564
renderHttpDeserialize(ctx, outputSymbol, responseBindings, null, writer)

codegen/smithy-kotlin-codegen/src/main/kotlin/software/amazon/smithy/kotlin/codegen/rendering/protocol/HttpProtocolClientGenerator.kt

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -77,16 +77,16 @@ abstract class HttpProtocolClientGenerator(
7777
*/
7878
protected open fun renderProperties(writer: KotlinWriter) {
7979
writer.write("private val managedResources = #T()", RuntimeTypes.Core.IO.SdkManagedGroup)
80-
writer.write("private val client = #T(config.httpClientEngine)", RuntimeTypes.Http.SdkHttpClient)
80+
writer.write("private val client = #T(config.httpClientEngine)", RuntimeTypes.HttpClient.SdkHttpClient)
8181
}
8282

8383
protected open fun importSymbols(writer: KotlinWriter) {
8484
writer.addImport("${ctx.settings.pkg.name}.model", "*")
8585
writer.addImport("${ctx.settings.pkg.name}.transform", "*")
8686

8787
val defaultClientSymbols = setOf(
88-
RuntimeTypes.Http.Operation.SdkHttpOperation,
89-
RuntimeTypes.Http.Operation.context,
88+
RuntimeTypes.HttpClient.Operation.SdkHttpOperation,
89+
RuntimeTypes.HttpClient.Operation.context,
9090
)
9191
writer.addImport(defaultClientSymbols)
9292
writer.dependencies.addAll(KotlinDependency.HTTP.dependencies)
@@ -211,7 +211,7 @@ abstract class HttpProtocolClientGenerator(
211211
.write(
212212
"""val rootSpan = config.tracer.createRootSpan("#L-${'$'}{op.context.#T}")""",
213213
op.id.name,
214-
RuntimeTypes.Http.Operation.sdkRequestId,
214+
RuntimeTypes.HttpClient.Operation.sdkRequestId,
215215
)
216216
.withBlock(
217217
"return #T.#T(rootSpan) {",
@@ -220,9 +220,9 @@ abstract class HttpProtocolClientGenerator(
220220
RuntimeTypes.Tracing.Core.withRootTraceSpan,
221221
) {
222222
if (hasOutputStream) {
223-
write("op.#T(client, #L, block)", RuntimeTypes.Http.Operation.execute, inputVariableName)
223+
write("op.#T(client, #L, block)", RuntimeTypes.HttpClient.Operation.execute, inputVariableName)
224224
} else {
225-
write("op.#T(client, #L)", RuntimeTypes.Http.Operation.roundTrip, inputVariableName)
225+
write("op.#T(client, #L)", RuntimeTypes.HttpClient.Operation.roundTrip, inputVariableName)
226226
}
227227
}
228228
}
@@ -290,7 +290,7 @@ abstract class HttpProtocolClientGenerator(
290290
?.firstOrNull { it.memberName == httpChecksumTrait?.requestAlgorithmMember?.getOrNull() }
291291

292292
if (hasTrait<HttpChecksumRequiredTrait>() || httpChecksumTrait?.isRequestChecksumRequired == true) {
293-
val interceptorSymbol = RuntimeTypes.Http.Interceptors.Md5ChecksumInterceptor
293+
val interceptorSymbol = RuntimeTypes.HttpClient.Interceptors.Md5ChecksumInterceptor
294294
val inputSymbol = ctx.symbolProvider.toSymbol(ctx.model.expectShape(inputShape))
295295

296296
requestAlgorithmMember?.let {

codegen/smithy-kotlin-codegen/src/main/kotlin/software/amazon/smithy/kotlin/codegen/rendering/util/RuntimeConfigProperty.kt

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,14 @@ import software.amazon.smithy.codegen.core.CodegenException
99
import software.amazon.smithy.kotlin.codegen.core.RuntimeTypes
1010
import software.amazon.smithy.kotlin.codegen.lang.KotlinTypes
1111
import software.amazon.smithy.kotlin.codegen.model.buildSymbol
12-
import software.amazon.smithy.kotlin.codegen.model.namespace
1312

1413
/**
1514
* Common client runtime related config properties
1615
*/
1716
object RuntimeConfigProperty {
1817
val HttpClientEngine = ConfigProperty {
19-
symbol = RuntimeTypes.Http.Engine.HttpClientEngine
20-
baseClass = RuntimeTypes.Http.Config.HttpClientConfig
18+
symbol = RuntimeTypes.HttpClient.Engine.HttpClientEngine
19+
baseClass = RuntimeTypes.HttpClient.Config.HttpClientConfig
2120
useNestedBuilderBaseClass()
2221
documentation = """
2322
Override the default HTTP client engine used to make SDK requests (e.g. configure proxy behavior, timeouts, concurrency, etc).
@@ -33,7 +32,7 @@ object RuntimeConfigProperty {
3332
prop.propertyName,
3433
prop.symbol,
3534
RuntimeTypes.HttpClientEngines.Default.DefaultHttpEngine,
36-
RuntimeTypes.Http.Engine.manage,
35+
RuntimeTypes.HttpClient.Engine.manage,
3736
)
3837
},
3938
)
@@ -129,12 +128,12 @@ object RuntimeConfigProperty {
129128
val HttpInterceptors = ConfigProperty {
130129
name = "interceptors"
131130
val defaultValue = "${KotlinTypes.Collections.mutableListOf.fullName}()"
132-
val target = RuntimeTypes.Http.Interceptors.HttpInterceptor
131+
val target = RuntimeTypes.HttpClient.Interceptors.HttpInterceptor
133132
symbol = KotlinTypes.Collections.list(target, isNullable = false)
134133
builderSymbol = KotlinTypes.Collections.mutableList(target, isNullable = false, default = defaultValue)
135134
toBuilderExpression = ".toMutableList()"
136135

137-
baseClass = RuntimeTypes.Http.Config.HttpClientConfig
136+
baseClass = RuntimeTypes.HttpClient.Config.HttpClientConfig
138137
useNestedBuilderBaseClass()
139138

140139
documentation = """

0 commit comments

Comments
 (0)