Skip to content

Commit 0f204d2

Browse files
committed
feat(client-s3): use regional endpoint by default
1 parent 76c0068 commit 0f204d2

File tree

7 files changed

+86
-5
lines changed

7 files changed

+86
-5
lines changed

clients/client-s3/S3Client.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,7 @@ import {
240240
} from "@aws-sdk/middleware-host-header";
241241
import { getLoggerPlugin } from "@aws-sdk/middleware-logger";
242242
import { RetryInputConfig, RetryResolvedConfig, getRetryPlugin, resolveRetryConfig } from "@aws-sdk/middleware-retry";
243-
import { getValidateBucketNamePlugin } from "@aws-sdk/middleware-sdk-s3";
243+
import { getUseRegionalEndpointPlugin, getValidateBucketNamePlugin } from "@aws-sdk/middleware-sdk-s3";
244244
import {
245245
AwsAuthInputConfig,
246246
AwsAuthResolvedConfig,
@@ -621,6 +621,7 @@ export class S3Client extends __Client<
621621
this.middlewareStack.use(getUserAgentPlugin(this.config));
622622
this.middlewareStack.use(getContentLengthPlugin(this.config));
623623
this.middlewareStack.use(getValidateBucketNamePlugin(this.config));
624+
this.middlewareStack.use(getUseRegionalEndpointPlugin(this.config));
624625
this.middlewareStack.use(getAddExpectContinuePlugin(this.config));
625626
this.middlewareStack.use(getHostHeaderPlugin(this.config));
626627
this.middlewareStack.use(getLoggerPlugin(this.config));

codegen/smithy-aws-typescript-codegen/src/main/java/software/amazon/smithy/aws/typescript/codegen/AddBuiltinPlugins.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,12 @@ public List<RuntimeClientPlugin> getClientPlugins() {
100100
.servicePredicate((m, s) -> testServiceId(s, "API Gateway"))
101101
.build(),
102102
RuntimeClientPlugin.builder()
103-
.withConventions(AwsDependency.VALIDATE_BUCKET_NAME.dependency, "ValidateBucketName",
103+
.withConventions(AwsDependency.S3_MIDDLEWARE.dependency, "ValidateBucketName",
104+
HAS_MIDDLEWARE)
105+
.servicePredicate((m, s) -> testServiceId(s, "S3"))
106+
.build(),
107+
RuntimeClientPlugin.builder()
108+
.withConventions(AwsDependency.S3_MIDDLEWARE.dependency, "UseRegionalEndpoint",
104109
HAS_MIDDLEWARE)
105110
.servicePredicate((m, s) -> testServiceId(s, "S3"))
106111
.build(),

codegen/smithy-aws-typescript-codegen/src/main/java/software/amazon/smithy/aws/typescript/codegen/AwsDependency.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ public enum AwsDependency implements SymbolDependencyContainer {
3232
MIDDLEWARE_SIGNING(NORMAL_DEPENDENCY, "@aws-sdk/middleware-signing", "^1.0.0-beta.1"),
3333
CREDENTIAL_PROVIDER_NODE(NORMAL_DEPENDENCY, "@aws-sdk/credential-provider-node", "^1.0.0-beta.1"),
3434
ACCEPT_HEADER(NORMAL_DEPENDENCY, "@aws-sdk/middleware-sdk-api-gateway", "^1.0.0-beta.1"),
35-
VALIDATE_BUCKET_NAME(NORMAL_DEPENDENCY, "@aws-sdk/middleware-sdk-s3", "^1.0.0-beta.1"),
35+
S3_MIDDLEWARE(NORMAL_DEPENDENCY, "@aws-sdk/middleware-sdk-s3", "^1.0.0-beta.1"),
3636
ADD_EXPECT_CONTINUE(NORMAL_DEPENDENCY, "@aws-sdk/middleware-expect-continue", "^1.0.0-beta.1"),
3737
GLACIER_MIDDLEWARE(NORMAL_DEPENDENCY, "@aws-sdk/middleware-sdk-glacier", "^1.0.0-beta.1"),
3838
MACHINELEARNING_MIDDLEWARE(NORMAL_DEPENDENCY, "@aws-sdk/middleware-sdk-machinelearning", "^1.0.0-beta.1"),
@@ -52,8 +52,7 @@ public enum AwsDependency implements SymbolDependencyContainer {
5252
BODY_CHECKSUM_GENERATOR_BROWSER(NORMAL_DEPENDENCY, "@aws-sdk/body-checksum-browser", "^1.0.0-beta.0"),
5353
BODY_CHECKSUM_GENERATOR_NODE(NORMAL_DEPENDENCY, "@aws-sdk/body-checksum-node", "^1.0.0-beta.0"),
5454
XML_BUILDER(NORMAL_DEPENDENCY, "@aws-sdk/xml-builder", "^1.0.0-beta.1"),
55-
XML_PARSER(NORMAL_DEPENDENCY, "fast-xml-parser", "^3.16.0"),
56-
UUID_GENERATOR(NORMAL_DEPENDENCY, "uuid", "^3.0.0"),
55+
XML_PARSER(NORMAL_DEPENDENCY, "fast-xml-parser", "^3.16.0"), UUID_GENERATOR(NORMAL_DEPENDENCY, "uuid", "^3.0.0"),
5756
UUID_GENERATOR_TYPES(DEV_DEPENDENCY, "@types/uuid", "^3.0.0"),
5857
MIDDLEWARE_EVENTSTREAM(NORMAL_DEPENDENCY, "@aws-sdk/middleware-eventstream", "^1.0.0-beta.0"),
5958
AWS_SDK_EVENTSTREAM_HANDLER_NODE(NORMAL_DEPENDENCY, "@aws-sdk/eventstream-handler-node", "^1.0.0-beta.0"),

packages/middleware-sdk-s3/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
"license": "Apache-2.0",
2020
"dependencies": {
2121
"@aws-sdk/util-arn-parser": "1.0.0-gamma.3",
22+
"@aws-sdk/protocol-http": "1.0.0-gamma.7",
2223
"tslib": "^1.8.0"
2324
},
2425
"devDependencies": {
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
export * from "./validate-bucket-name";
2+
export * from "./use-regional-endpoint";
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import { HttpRequest } from "@aws-sdk/protocol-http";
2+
3+
import { useRegionalEndpointMiddleware } from "./use-regional-endpoint";
4+
5+
describe("useRegionalEndpointMiddleware", () => {
6+
const mockNextHandler = jest.fn();
7+
beforeEach(() => {
8+
jest.clearAllMocks();
9+
});
10+
11+
it("should modify the hostname if it's global endpoint", async () => {
12+
const handler = useRegionalEndpointMiddleware()(mockNextHandler, {} as any);
13+
await handler({
14+
input: {},
15+
request: new HttpRequest({
16+
hostname: "s3.amazonaws.com",
17+
}),
18+
});
19+
expect(mockNextHandler.mock.calls.length).toBe(1);
20+
expect(mockNextHandler.mock.calls[0][0].request.hostname).toEqual("s3.us-east-1.amazonaws.com");
21+
});
22+
23+
it("should not modify the hostname if it's regional endpoint", async () => {
24+
const handler = useRegionalEndpointMiddleware()(mockNextHandler, {} as any);
25+
await handler({
26+
input: {},
27+
request: new HttpRequest({
28+
hostname: "s3.us-west-2.amazonaws.com",
29+
}),
30+
});
31+
expect(mockNextHandler.mock.calls.length).toBe(1);
32+
expect(mockNextHandler.mock.calls[0][0].request.hostname).toEqual("s3.us-west-2.amazonaws.com");
33+
});
34+
});
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import { HttpRequest } from "@aws-sdk/protocol-http";
2+
import {
3+
BuildHandler,
4+
BuildHandlerArguments,
5+
BuildHandlerOptions,
6+
BuildHandlerOutput,
7+
BuildMiddleware,
8+
Endpoint,
9+
MetadataBearer,
10+
Pluggable,
11+
Provider,
12+
} from "@aws-sdk/types";
13+
14+
export function useRegionalEndpointMiddleware(config: {
15+
region: Provider<string>;
16+
endpoint: Provider<Endpoint>;
17+
}): BuildMiddleware<any, any> {
18+
return <Output extends MetadataBearer>(next: BuildHandler<any, Output>): BuildHandler<any, Output> => async (
19+
args: BuildHandlerArguments<any>
20+
): Promise<BuildHandlerOutput<Output>> => {
21+
const { request } = args;
22+
if (HttpRequest.isInstance(request) && request.hostname === "s3.amazonaws.com") {
23+
request.hostname = "s3.us-east-1.amazonaws.com";
24+
}
25+
return next({ ...args });
26+
};
27+
}
28+
29+
export const useRegionalEndpointMiddlewareOptions: BuildHandlerOptions = {
30+
step: "build",
31+
tags: ["USE_REGIONAL_ENDPOINT", "S3"],
32+
name: "useRegionalEndpointMiddleware",
33+
};
34+
35+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
36+
export const getUseRegionalEndpointPlugin = (unused: any): Pluggable<any, any> => ({
37+
applyToStack: (clientStack) => {
38+
clientStack.add(useRegionalEndpointMiddleware(), useRegionalEndpointMiddlewareOptions);
39+
},
40+
});

0 commit comments

Comments
 (0)