38 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			38 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
export const resolveParamsForS3 = async (endpointParams) => {
 | 
						|
    const bucket = endpointParams?.Bucket || "";
 | 
						|
    if (typeof endpointParams.Bucket === "string") {
 | 
						|
        endpointParams.Bucket = bucket.replace(/#/g, encodeURIComponent("#")).replace(/\?/g, encodeURIComponent("?"));
 | 
						|
    }
 | 
						|
    if (isArnBucketName(bucket)) {
 | 
						|
        if (endpointParams.ForcePathStyle === true) {
 | 
						|
            throw new Error("Path-style addressing cannot be used with ARN buckets");
 | 
						|
        }
 | 
						|
    }
 | 
						|
    else if (!isDnsCompatibleBucketName(bucket) ||
 | 
						|
        (bucket.indexOf(".") !== -1 && !String(endpointParams.Endpoint).startsWith("http:")) ||
 | 
						|
        bucket.toLowerCase() !== bucket ||
 | 
						|
        bucket.length < 3) {
 | 
						|
        endpointParams.ForcePathStyle = true;
 | 
						|
    }
 | 
						|
    if (endpointParams.DisableMultiRegionAccessPoints) {
 | 
						|
        endpointParams.disableMultiRegionAccessPoints = true;
 | 
						|
        endpointParams.DisableMRAP = true;
 | 
						|
    }
 | 
						|
    return endpointParams;
 | 
						|
};
 | 
						|
const DOMAIN_PATTERN = /^[a-z0-9][a-z0-9\.\-]{1,61}[a-z0-9]$/;
 | 
						|
const IP_ADDRESS_PATTERN = /(\d+\.){3}\d+/;
 | 
						|
const DOTS_PATTERN = /\.\./;
 | 
						|
export const DOT_PATTERN = /\./;
 | 
						|
export const S3_HOSTNAME_PATTERN = /^(.+\.)?s3(-fips)?(\.dualstack)?[.-]([a-z0-9-]+)\./;
 | 
						|
export const isDnsCompatibleBucketName = (bucketName) => DOMAIN_PATTERN.test(bucketName) && !IP_ADDRESS_PATTERN.test(bucketName) && !DOTS_PATTERN.test(bucketName);
 | 
						|
export const isArnBucketName = (bucketName) => {
 | 
						|
    const [arn, partition, service, , , bucket] = bucketName.split(":");
 | 
						|
    const isArn = arn === "arn" && bucketName.split(":").length >= 6;
 | 
						|
    const isValidArn = Boolean(isArn && partition && service && bucket);
 | 
						|
    if (isArn && !isValidArn) {
 | 
						|
        throw new Error(`Invalid ARN: ${bucketName} was an invalid ARN.`);
 | 
						|
    }
 | 
						|
    return isValidArn;
 | 
						|
};
 |