Skip to content

Commit 0df9672

Browse files
committed
feat(middleware-bucket-endpoint): set region from arn to handler context
1 parent 4fdd70a commit 0df9672

File tree

2 files changed

+50
-18
lines changed

2 files changed

+50
-18
lines changed

packages/middleware-bucket-endpoint/src/bucketEndpointMiddleware.spec.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,5 +163,23 @@ describe("bucketEndpointMiddleware", () => {
163163
expect(mockArnParse).toBeCalled();
164164
expect(mockArnValidation).toBeCalled();
165165
});
166+
167+
it("should set signing_region to middleware context if the request will use region from ARN", async () => {
168+
const request = new HttpRequest(requestInput);
169+
previouslyResolvedConfig.useArnRegion.mockReturnValue(true);
170+
const arnRegion = "us-west-2";
171+
mockArnParse.mockReturnValue({ region: arnRegion });
172+
const handlerContext = {} as any;
173+
const handler = bucketEndpointMiddleware(
174+
resolveBucketEndpointConfig({
175+
...previouslyResolvedConfig,
176+
})
177+
)(next, handlerContext);
178+
await handler({
179+
input: { Bucket: `myendpoint-123456789012.s3-accesspoint.${arnRegion}.amazonaws.com` },
180+
request,
181+
});
182+
expect(handlerContext).toMatchObject({ signing_region: arnRegion });
183+
});
166184
});
167185
});

packages/middleware-bucket-endpoint/src/bucketEndpointMiddleware.ts

Lines changed: 32 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import {
44
BuildHandlerArguments,
55
BuildHandlerOutput,
66
BuildMiddleware,
7+
HandlerExecutionContext,
78
MetadataBearer,
89
Pluggable,
910
RelativeMiddlewareOptions,
@@ -15,27 +16,50 @@ import { getPseudoRegion } from "./bucketHostnameUtils";
1516
import { BucketEndpointResolvedConfig } from "./configurations";
1617

1718
export function bucketEndpointMiddleware(options: BucketEndpointResolvedConfig): 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 { Bucket: bucketName } = args.input;
19+
return <Output extends MetadataBearer>(
20+
next: BuildHandler<any, Output>,
21+
context: HandlerExecutionContext
22+
): BuildHandler<any, Output> => async (args: BuildHandlerArguments<any>): Promise<BuildHandlerOutput<Output>> => {
23+
const { Bucket: bucketName } = args.input as { Bucket: string };
2224
let replaceBucketInPath = options.bucketEndpoint;
2325
const request = args.request;
2426
if (HttpRequest.isInstance(request)) {
2527
if (options.bucketEndpoint) {
2628
request.hostname = bucketName;
27-
} else {
28-
const isBucketNameArn = validateArn(bucketName);
29+
} else if (validateArn(bucketName)) {
30+
const bucketArn = parseArn(bucketName);
31+
const clientRegion = getPseudoRegion(await options.region());
32+
const { partition, signingRegion } = (await options.regionInfoProvider(clientRegion)) || {};
33+
const useArnRegion = await options.useArnRegion();
2934
const { hostname, bucketEndpoint } = bucketHostname({
30-
bucketName: isBucketNameArn ? parseArn(bucketName) : bucketName,
35+
bucketName: bucketArn,
3136
baseHostname: request.hostname,
3237
accelerateEndpoint: options.useAccelerateEndpoint,
3338
dualstackEndpoint: options.useDualstackEndpoint,
3439
pathStyleEndpoint: options.forcePathStyle,
3540
tlsCompatible: request.protocol === "https:",
36-
...(isBucketNameArn ? await getArnHostnameParameters(options) : {}),
41+
useArnRegion,
42+
clientPartition: partition,
43+
clientSigningRegion: signingRegion,
3744
});
3845

46+
// If the request needs to use a region inferred from ARN that different from client region, we need to set
47+
// them in the handler context so the signer will use them
48+
if (useArnRegion && clientRegion !== bucketArn.region) {
49+
context["signing_region"] = bucketArn.region;
50+
}
51+
52+
request.hostname = hostname;
53+
replaceBucketInPath = bucketEndpoint;
54+
} else {
55+
const { hostname, bucketEndpoint } = bucketHostname({
56+
bucketName,
57+
baseHostname: request.hostname,
58+
accelerateEndpoint: options.useAccelerateEndpoint,
59+
dualstackEndpoint: options.useDualstackEndpoint,
60+
pathStyleEndpoint: options.forcePathStyle,
61+
tlsCompatible: request.protocol === "https:",
62+
});
3963
request.hostname = hostname;
4064
replaceBucketInPath = bucketEndpoint;
4165
}
@@ -52,16 +76,6 @@ export function bucketEndpointMiddleware(options: BucketEndpointResolvedConfig):
5276
};
5377
}
5478

55-
const getArnHostnameParameters = async (options: BucketEndpointResolvedConfig) => {
56-
const clientRegion = await options.region();
57-
const clientRegionInfo = await options.regionInfoProvider(getPseudoRegion(clientRegion));
58-
return {
59-
useArnRegion: await options.useArnRegion(),
60-
clientPartition: clientRegionInfo?.partition,
61-
clientSigningRegion: clientRegionInfo?.signingRegion,
62-
};
63-
};
64-
6579
export const bucketEndpointMiddlewareOptions: RelativeMiddlewareOptions = {
6680
tags: ["BUCKET_ENDPOINT"],
6781
name: "bucketEndpointMiddleware",

0 commit comments

Comments
 (0)