82 lines
3.7 KiB
JavaScript
82 lines
3.7 KiB
JavaScript
|
|
import { parse as parseArn, validate as validateArn } from "@aws-sdk/util-arn-parser";
|
||
|
|
import { HttpRequest } from "@smithy/protocol-http";
|
||
|
|
import { bucketHostname } from "./bucketHostname";
|
||
|
|
export const bucketEndpointMiddleware = (options) => (next, context) => async (args) => {
|
||
|
|
const { Bucket: bucketName } = args.input;
|
||
|
|
let replaceBucketInPath = options.bucketEndpoint;
|
||
|
|
const request = args.request;
|
||
|
|
if (HttpRequest.isInstance(request)) {
|
||
|
|
if (options.bucketEndpoint) {
|
||
|
|
request.hostname = bucketName;
|
||
|
|
}
|
||
|
|
else if (validateArn(bucketName)) {
|
||
|
|
const bucketArn = parseArn(bucketName);
|
||
|
|
const clientRegion = await options.region();
|
||
|
|
const useDualstackEndpoint = await options.useDualstackEndpoint();
|
||
|
|
const useFipsEndpoint = await options.useFipsEndpoint();
|
||
|
|
const { partition, signingRegion = clientRegion } = (await options.regionInfoProvider(clientRegion, { useDualstackEndpoint, useFipsEndpoint })) || {};
|
||
|
|
const useArnRegion = await options.useArnRegion();
|
||
|
|
const { hostname, bucketEndpoint, signingRegion: modifiedSigningRegion, signingService, } = bucketHostname({
|
||
|
|
bucketName: bucketArn,
|
||
|
|
baseHostname: request.hostname,
|
||
|
|
accelerateEndpoint: options.useAccelerateEndpoint,
|
||
|
|
dualstackEndpoint: useDualstackEndpoint,
|
||
|
|
fipsEndpoint: useFipsEndpoint,
|
||
|
|
pathStyleEndpoint: options.forcePathStyle,
|
||
|
|
tlsCompatible: request.protocol === "https:",
|
||
|
|
useArnRegion,
|
||
|
|
clientPartition: partition,
|
||
|
|
clientSigningRegion: signingRegion,
|
||
|
|
clientRegion: clientRegion,
|
||
|
|
isCustomEndpoint: options.isCustomEndpoint,
|
||
|
|
disableMultiregionAccessPoints: await options.disableMultiregionAccessPoints(),
|
||
|
|
});
|
||
|
|
if (modifiedSigningRegion && modifiedSigningRegion !== signingRegion) {
|
||
|
|
context["signing_region"] = modifiedSigningRegion;
|
||
|
|
}
|
||
|
|
if (signingService && signingService !== "s3") {
|
||
|
|
context["signing_service"] = signingService;
|
||
|
|
}
|
||
|
|
request.hostname = hostname;
|
||
|
|
replaceBucketInPath = bucketEndpoint;
|
||
|
|
}
|
||
|
|
else {
|
||
|
|
const clientRegion = await options.region();
|
||
|
|
const dualstackEndpoint = await options.useDualstackEndpoint();
|
||
|
|
const fipsEndpoint = await options.useFipsEndpoint();
|
||
|
|
const { hostname, bucketEndpoint } = bucketHostname({
|
||
|
|
bucketName,
|
||
|
|
clientRegion,
|
||
|
|
baseHostname: request.hostname,
|
||
|
|
accelerateEndpoint: options.useAccelerateEndpoint,
|
||
|
|
dualstackEndpoint,
|
||
|
|
fipsEndpoint,
|
||
|
|
pathStyleEndpoint: options.forcePathStyle,
|
||
|
|
tlsCompatible: request.protocol === "https:",
|
||
|
|
isCustomEndpoint: options.isCustomEndpoint,
|
||
|
|
});
|
||
|
|
request.hostname = hostname;
|
||
|
|
replaceBucketInPath = bucketEndpoint;
|
||
|
|
}
|
||
|
|
if (replaceBucketInPath) {
|
||
|
|
request.path = request.path.replace(/^(\/)?[^\/]+/, "");
|
||
|
|
if (request.path === "") {
|
||
|
|
request.path = "/";
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return next({ ...args, request });
|
||
|
|
};
|
||
|
|
export const bucketEndpointMiddlewareOptions = {
|
||
|
|
tags: ["BUCKET_ENDPOINT"],
|
||
|
|
name: "bucketEndpointMiddleware",
|
||
|
|
relation: "before",
|
||
|
|
toMiddleware: "hostHeaderMiddleware",
|
||
|
|
override: true,
|
||
|
|
};
|
||
|
|
export const getBucketEndpointPlugin = (options) => ({
|
||
|
|
applyToStack: (clientStack) => {
|
||
|
|
clientStack.addRelativeTo(bucketEndpointMiddleware(options), bucketEndpointMiddlewareOptions);
|
||
|
|
},
|
||
|
|
});
|