Skip to content

Commit a7475d7

Browse files
committed
WIP - generic useragent refactoring.
1 parent 8afb134 commit a7475d7

File tree

16 files changed

+335
-355
lines changed

16 files changed

+335
-355
lines changed

codegen/aws/core/src/main/java/software/amazon/smithy/python/aws/codegen/AwsUserAgentIntegration.java

Lines changed: 35 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import software.amazon.smithy.codegen.core.Symbol;
99
import software.amazon.smithy.codegen.core.SymbolReference;
1010
import software.amazon.smithy.python.codegen.ConfigProperty;
11+
import software.amazon.smithy.python.codegen.GenerationContext;
1112
import software.amazon.smithy.python.codegen.integrations.PythonIntegration;
1213
import software.amazon.smithy.python.codegen.integrations.RuntimeClientPlugin;
1314
import software.amazon.smithy.utils.SmithyInternalApi;
@@ -18,35 +19,40 @@
1819
@SmithyInternalApi
1920
public class AwsUserAgentIntegration implements PythonIntegration {
2021
@Override
21-
public List<RuntimeClientPlugin> getClientPlugins() {
22-
return List.of(
23-
RuntimeClientPlugin.builder()
24-
.addConfigProperty(
25-
ConfigProperty.builder()
26-
.name("user_agent_extra")
27-
.documentation("Additional suffix to be added to the User-Agent header.")
28-
.type(Symbol.builder().name("str").build())
29-
.nullable(true)
30-
.build())
31-
.addConfigProperty(
32-
ConfigProperty.builder()
33-
.name("sdk_ua_app_id")
34-
.documentation(
35-
"A unique and opaque application ID that is appended to the User-Agent header.")
36-
.type(Symbol.builder().name("str").build())
37-
.nullable(true)
38-
.build())
39-
.pythonPlugin(
40-
SymbolReference.builder()
41-
.symbol(Symbol.builder()
42-
.namespace(
43-
AwsPythonDependency.SMITHY_AWS_CORE.packageName() + ".plugins",
44-
".")
45-
.name("user_agent_plugin")
46-
.addDependency(AwsPythonDependency.SMITHY_AWS_CORE)
47-
.build())
48-
.build())
49-
.build());
22+
public List<RuntimeClientPlugin> getClientPlugins(GenerationContext context) {
23+
if (context.applicationProtocol().isHttpProtocol()) {
24+
return List.of(
25+
RuntimeClientPlugin.builder()
26+
.addConfigProperty(
27+
ConfigProperty.builder()
28+
.name("user_agent_extra")
29+
.documentation("Additional suffix to be added to the User-Agent header.")
30+
.type(Symbol.builder().name("str").build())
31+
.nullable(true)
32+
.build())
33+
.addConfigProperty(
34+
ConfigProperty.builder()
35+
.name("sdk_ua_app_id")
36+
.documentation(
37+
"A unique and opaque application ID that is appended to the User-Agent header.")
38+
.type(Symbol.builder().name("str").build())
39+
.nullable(true)
40+
.build())
41+
.pythonPlugin(
42+
SymbolReference.builder()
43+
.symbol(Symbol.builder()
44+
.namespace(
45+
AwsPythonDependency.SMITHY_AWS_CORE.packageName()
46+
+ ".plugins",
47+
".")
48+
.name("aws_user_agent_plugin")
49+
.addDependency(AwsPythonDependency.SMITHY_AWS_CORE)
50+
.build())
51+
.build())
52+
.build());
53+
} else {
54+
return List.of();
55+
}
5056
}
5157

5258
}

codegen/core/src/main/java/software/amazon/smithy/python/codegen/ClientGenerator.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ private void generateService(PythonWriter writer) {
7676
var defaultPlugins = new LinkedHashSet<SymbolReference>();
7777

7878
for (PythonIntegration integration : context.integrations()) {
79-
for (RuntimeClientPlugin runtimeClientPlugin : integration.getClientPlugins()) {
79+
for (RuntimeClientPlugin runtimeClientPlugin : integration.getClientPlugins(context)) {
8080
if (runtimeClientPlugin.matchesService(context.model(), service)) {
8181
runtimeClientPlugin.getPythonPlugin().ifPresent(defaultPlugins::add);
8282
}
@@ -657,7 +657,7 @@ private boolean hasEventStream() {
657657
private void initializeHttpAuthParameters(PythonWriter writer) {
658658
var derived = new LinkedHashSet<DerivedProperty>();
659659
for (PythonIntegration integration : context.integrations()) {
660-
for (RuntimeClientPlugin plugin : integration.getClientPlugins()) {
660+
for (RuntimeClientPlugin plugin : integration.getClientPlugins(context)) {
661661
if (plugin.matchesService(context.model(), service)
662662
&& plugin.getAuthScheme().isPresent()
663663
&& plugin.getAuthScheme().get().getApplicationProtocol().isHttpProtocol()) {
@@ -746,7 +746,7 @@ private void writeSharedOperationInit(PythonWriter writer, OperationShape operat
746746

747747
var defaultPlugins = new LinkedHashSet<SymbolReference>();
748748
for (PythonIntegration integration : context.integrations()) {
749-
for (RuntimeClientPlugin runtimeClientPlugin : integration.getClientPlugins()) {
749+
for (RuntimeClientPlugin runtimeClientPlugin : integration.getClientPlugins(context)) {
750750
if (runtimeClientPlugin.matchesOperation(context.model(), service, operation)) {
751751
runtimeClientPlugin.getPythonPlugin().ifPresent(defaultPlugins::add);
752752
}

codegen/core/src/main/java/software/amazon/smithy/python/codegen/HttpAuthGenerator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ public void run() {
4343
var properties = new ArrayList<DerivedProperty>();
4444
var service = context.settings().service(context.model());
4545
for (PythonIntegration integration : context.integrations()) {
46-
for (RuntimeClientPlugin plugin : integration.getClientPlugins()) {
46+
for (RuntimeClientPlugin plugin : integration.getClientPlugins(context)) {
4747
if (plugin.matchesService(context.model(), service)
4848
&& plugin.getAuthScheme().isPresent()
4949
&& plugin.getAuthScheme().get().getApplicationProtocol().isHttpProtocol()) {

codegen/core/src/main/java/software/amazon/smithy/python/codegen/generators/ConfigGenerator.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,7 @@ private static void writeDefaultHttpAuthSchemes(GenerationContext context, Pytho
219219
var supportedAuthSchemes = new LinkedHashMap<String, Symbol>();
220220
var service = context.settings().service(context.model());
221221
for (PythonIntegration integration : context.integrations()) {
222-
for (RuntimeClientPlugin plugin : integration.getClientPlugins()) {
222+
for (RuntimeClientPlugin plugin : integration.getClientPlugins(context)) {
223223
if (plugin.matchesService(context.model(), service)
224224
&& plugin.getAuthScheme().isPresent()
225225
&& plugin.getAuthScheme().get().getApplicationProtocol().isHttpProtocol()) {
@@ -324,7 +324,7 @@ private void generateConfig(GenerationContext context, PythonWriter writer) {
324324

325325
// Add any relevant config properties from plugins.
326326
for (PythonIntegration integration : context.integrations()) {
327-
for (RuntimeClientPlugin plugin : integration.getClientPlugins()) {
327+
for (RuntimeClientPlugin plugin : integration.getClientPlugins(context)) {
328328
if (plugin.matchesService(model, service)) {
329329
properties.addAll(plugin.getConfigProperties());
330330
}

codegen/core/src/main/java/software/amazon/smithy/python/codegen/integrations/HttpApiKeyAuth.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public final class HttpApiKeyAuth implements PythonIntegration {
2424
private static final String OPTION_GENERATOR_NAME = "_generate_api_key_option";
2525

2626
@Override
27-
public List<RuntimeClientPlugin> getClientPlugins() {
27+
public List<RuntimeClientPlugin> getClientPlugins(GenerationContext context) {
2828
return List.of(
2929
RuntimeClientPlugin.builder()
3030
.servicePredicate((model, service) -> service.hasTrait(HttpApiKeyAuthTrait.class))

codegen/core/src/main/java/software/amazon/smithy/python/codegen/integrations/PythonIntegration.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ default List<ProtocolGenerator> getProtocolGenerators() {
3535
*
3636
* @return Returns the list of RuntimePlugins to apply to the client.
3737
*/
38-
default List<RuntimeClientPlugin> getClientPlugins() {
38+
default List<RuntimeClientPlugin> getClientPlugins(GenerationContext context) {
3939
return Collections.emptyList();
4040
}
4141
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
/*
2+
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
package software.amazon.smithy.python.codegen.integrations;
6+
7+
import java.util.List;
8+
import software.amazon.smithy.codegen.core.Symbol;
9+
import software.amazon.smithy.codegen.core.SymbolReference;
10+
import software.amazon.smithy.python.codegen.GenerationContext;
11+
import software.amazon.smithy.python.codegen.SmithyPythonDependency;
12+
import software.amazon.smithy.utils.SmithyInternalApi;
13+
14+
/**
15+
* Adds a runtime plugin to set generic user agent.
16+
*/
17+
@SmithyInternalApi
18+
public class UserAgentIntegration implements PythonIntegration {
19+
@Override
20+
public List<RuntimeClientPlugin> getClientPlugins(GenerationContext context) {
21+
if (context.applicationProtocol().isHttpProtocol()) {
22+
return List.of(
23+
RuntimeClientPlugin.builder()
24+
.pythonPlugin(
25+
SymbolReference.builder()
26+
.symbol(Symbol.builder()
27+
.namespace(
28+
SmithyPythonDependency.SMITHY_HTTP.packageName()
29+
+ ".plugins",
30+
".")
31+
.name("user_agent_plugin")
32+
.addDependency(SmithyPythonDependency.SMITHY_HTTP)
33+
.build())
34+
.build())
35+
.build());
36+
} else {
37+
return List.of();
38+
}
39+
}
40+
}

codegen/core/src/main/resources/META-INF/services/software.amazon.smithy.python.codegen.integrations.PythonIntegration

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,4 @@
55

66
software.amazon.smithy.python.codegen.integrations.RestJsonIntegration
77
software.amazon.smithy.python.codegen.integrations.HttpApiKeyAuth
8+
software.amazon.smithy.python.codegen.integrations.UserAgentIntegration
Lines changed: 3 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,8 @@
11
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
22
# SPDX-License-Identifier: Apache-2.0
3-
4-
from smithy_aws_core.user_agent import UserAgent
5-
from smithy_core.interceptors import Interceptor, InterceptorContext, Request
6-
from smithy_http import Field
7-
from smithy_http.aio import HTTPRequest
3+
from smithy_core.interceptors import Interceptor, Request
4+
from smithy_http.aio.interfaces import HTTPRequest
85

96

107
class UserAgentInterceptor(Interceptor[Request, None, HTTPRequest, None]):
11-
"""Adds UserAgent header to the Request before signing."""
12-
13-
def __init__(
14-
self,
15-
*,
16-
ua_suffix: str | None = None,
17-
ua_app_id: str | None = None,
18-
sdk_version: str | None = "0.0.1",
19-
) -> None:
20-
"""Initialize the UserAgentInterceptor.
21-
22-
:param ua_suffix: Additional suffix to be added to the UserAgent header.
23-
:param ua_app_id: User defined and opaque application ID to be added to the
24-
UserAgent header.
25-
:param sdk_version: SDK version to be added to the UserAgent header.
26-
"""
27-
super().__init__()
28-
self._ua_suffix = ua_suffix
29-
self._ua_app_id = ua_app_id
30-
self._sdk_version = sdk_version
31-
32-
def modify_before_signing(
33-
self, context: InterceptorContext[Request, None, HTTPRequest, None]
34-
) -> HTTPRequest:
35-
user_agent = UserAgent.from_environment().with_config(
36-
ua_suffix=self._ua_suffix,
37-
ua_app_id=self._ua_app_id,
38-
sdk_version=self._sdk_version,
39-
)
40-
request = context.transport_request
41-
request.fields.set_field(
42-
Field(name="User-Agent", values=[user_agent.to_string()])
43-
)
44-
return context.transport_request
8+
"""Adds UserAgent header to the Request before signing."""

packages/smithy-aws-core/src/smithy_aws_core/plugins/__init__.py

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,5 @@
55

66
from smithy_aws_core.interceptors.user_agent import UserAgentInterceptor
77

8-
9-
# TODO: Define a Protocol for Config w/ interceptor method?
10-
def user_agent_plugin(config: Any) -> None:
11-
config.interceptors.append(
12-
UserAgentInterceptor(
13-
ua_suffix=config.user_agent_extra,
14-
ua_app_id=config.sdk_ua_app_id,
15-
)
16-
)
8+
def aws_user_agent_plugin(config: Any) -> None:
9+
config.interceptors.append(UserAgentInterceptor())

0 commit comments

Comments
 (0)