diff --git a/clients/client-s3/src/commands/CreateBucketCommand.ts b/clients/client-s3/src/commands/CreateBucketCommand.ts index c53fb445720d..0354e6d65b4c 100644 --- a/clients/client-s3/src/commands/CreateBucketCommand.ts +++ b/clients/client-s3/src/commands/CreateBucketCommand.ts @@ -202,6 +202,7 @@ export class CreateBucketCommand extends $Command< public static getEndpointParameterInstructions(): EndpointParameterInstructions { return { + DisableAccessPoints: { type: "staticContextParams", value: true }, Bucket: { type: "contextParams", name: "Bucket" }, ForcePathStyle: { type: "clientContextParams", name: "forcePathStyle" }, UseArnRegion: { type: "clientContextParams", name: "useArnRegion" }, diff --git a/clients/client-s3/src/commands/WriteGetObjectResponseCommand.ts b/clients/client-s3/src/commands/WriteGetObjectResponseCommand.ts index 79dfbb0b58fb..6a5d76dcf5c4 100644 --- a/clients/client-s3/src/commands/WriteGetObjectResponseCommand.ts +++ b/clients/client-s3/src/commands/WriteGetObjectResponseCommand.ts @@ -1,6 +1,5 @@ // smithy-typescript generated code import { EndpointParameterInstructions, getEndpointPlugin } from "@aws-sdk/middleware-endpoint"; -import { getWriteGetObjectResponseEndpointPlugin } from "@aws-sdk/middleware-sdk-s3"; import { getSerdePlugin } from "@aws-sdk/middleware-serde"; import { HttpRequest as __HttpRequest, HttpResponse as __HttpResponse } from "@aws-sdk/protocol-http"; import { Command as $Command } from "@aws-sdk/smithy-client"; @@ -82,6 +81,7 @@ export class WriteGetObjectResponseCommand extends $Command< public static getEndpointParameterInstructions(): EndpointParameterInstructions { return { + UseObjectLambdaEndpoint: { type: "staticContextParams", value: true }, ForcePathStyle: { type: "clientContextParams", name: "forcePathStyle" }, UseArnRegion: { type: "clientContextParams", name: "useArnRegion" }, DisableMultiRegionAccessPoints: { type: "clientContextParams", name: "disableMultiregionAccessPoints" }, @@ -112,7 +112,6 @@ export class WriteGetObjectResponseCommand extends $Command< this.middlewareStack.use( getEndpointPlugin(configuration, WriteGetObjectResponseCommand.getEndpointParameterInstructions()) ); - this.middlewareStack.use(getWriteGetObjectResponseEndpointPlugin(configuration)); const stack = clientStack.concat(this.middlewareStack); diff --git a/clients/client-s3/test/S3.spec.ts b/clients/client-s3/test/S3.spec.ts index f76b9f1a9666..bd94bd873f1f 100644 --- a/clients/client-s3/test/S3.spec.ts +++ b/clients/client-s3/test/S3.spec.ts @@ -136,7 +136,6 @@ describe("Endpoints from ARN", () => { expect(result.request.headers["authorization"]).contains( `Credential=${credentials.accessKeyId}/${date}/${region}/s3-object-lambda/aws4_request` ); - expect(result.request.headers["transfer-encoding"]).to.equal("chunked"); }); }); }); diff --git a/codegen/smithy-aws-typescript-codegen/src/main/java/software/amazon/smithy/aws/typescript/codegen/AddS3Config.java b/codegen/smithy-aws-typescript-codegen/src/main/java/software/amazon/smithy/aws/typescript/codegen/AddS3Config.java index 57928c4a618a..4999b006f91f 100644 --- a/codegen/smithy-aws-typescript-codegen/src/main/java/software/amazon/smithy/aws/typescript/codegen/AddS3Config.java +++ b/codegen/smithy-aws-typescript-codegen/src/main/java/software/amazon/smithy/aws/typescript/codegen/AddS3Config.java @@ -180,12 +180,6 @@ public List getClientPlugins() { (m, s, o) -> EXCEPTIONS_OF_200_OPERATIONS.contains(o.getId().getName(s)) && isS3(s)) .build(), - RuntimeClientPlugin.builder() - .withConventions(AwsDependency.S3_MIDDLEWARE.dependency, - "WriteGetObjectResponseEndpoint", HAS_MIDDLEWARE) - .operationPredicate((m, s, o) -> isS3(s) - && o.getId().getName(s).equals("WriteGetObjectResponse")) - .build(), RuntimeClientPlugin.builder() .withConventions(AwsDependency.ADD_EXPECT_CONTINUE.dependency, "AddExpectContinue", HAS_MIDDLEWARE) diff --git a/packages/middleware-sdk-s3/package.json b/packages/middleware-sdk-s3/package.json index bb4f1745d992..5c484268b774 100644 --- a/packages/middleware-sdk-s3/package.json +++ b/packages/middleware-sdk-s3/package.json @@ -20,7 +20,6 @@ }, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/middleware-bucket-endpoint": "*", "@aws-sdk/protocol-http": "*", "@aws-sdk/types": "*", "@aws-sdk/util-arn-parser": "*", diff --git a/packages/middleware-sdk-s3/src/index.ts b/packages/middleware-sdk-s3/src/index.ts index 95e25976746b..8a46831c2846 100644 --- a/packages/middleware-sdk-s3/src/index.ts +++ b/packages/middleware-sdk-s3/src/index.ts @@ -2,4 +2,3 @@ export * from "./check-content-length-header"; export * from "./configuration"; export * from "./throw-200-exceptions"; export * from "./validate-bucket-name"; -export * from "./write-get-object-response-endpoint"; diff --git a/packages/middleware-sdk-s3/src/write-get-object-response-endpoint.spec.ts b/packages/middleware-sdk-s3/src/write-get-object-response-endpoint.spec.ts deleted file mode 100644 index eff627e457fc..000000000000 --- a/packages/middleware-sdk-s3/src/write-get-object-response-endpoint.spec.ts +++ /dev/null @@ -1,127 +0,0 @@ -import { HttpRequest } from "@aws-sdk/protocol-http"; - -import { writeGetObjectResponseEndpointMiddleware } from "./write-get-object-response-endpoint"; - -describe("writeGetObjectResponseEndpointMiddlewareOptions", () => { - const mockNextHandler = jest.fn(); - const mockRegionProvider = jest.fn(); - const mockConfig = { - region: mockRegionProvider, - isCustomEndpoint: false, - disableHostPrefix: false, - runtime: "node", - }; - - beforeEach(() => { - jest.clearAllMocks(); - }); - - it.each(["s3.amazonaws.com", "s3-external-1.amazonaws.com"])( - "should not update endpoint for global endpoints %s", - async (hostname) => { - const context = {} as any; - const handler = writeGetObjectResponseEndpointMiddleware(mockConfig)(mockNextHandler, context); - await handler({ - request: new HttpRequest({ hostname }), - input: { - RequestRoute: "route", - }, - }); - expect(mockNextHandler.mock.calls.length).toBe(1); - expect(mockNextHandler.mock.calls[0][0].request.hostname).toEqual(hostname); - expect(context).toEqual({}); - mockNextHandler.mockClear(); - } - ); - - it.each([ - ["us-west-2", "s3.us-west-2.amazonaws.com", "route1", "route1.s3-object-lambda.us-west-2.amazonaws.com"], - ["us-east-1", "s3.us-east-1.amazonaws.com", "route2", "route2.s3-object-lambda.us-east-1.amazonaws.com"], - [ - "cn-northeast-1", - "s3.cn-northeast-1.amazonaws.com.cn", - "route", - "route.s3-object-lambda.cn-northeast-1.amazonaws.com.cn", - ], - ])("should update endpoint for regional endpoints", async (region, originalEndpoint, requestRoute, expected) => { - const context = {} as any; - mockRegionProvider.mockResolvedValueOnce(region); - const handler = writeGetObjectResponseEndpointMiddleware(mockConfig)(mockNextHandler, context); - await handler({ - request: new HttpRequest({ hostname: originalEndpoint }), - input: { - RequestRoute: requestRoute, - }, - }); - expect(mockNextHandler.mock.calls.length).toBe(1); - expect(mockNextHandler.mock.calls[0][0].request.hostname).toBe(expected); - expect(context).toMatchObject({ signing_service: "s3-object-lambda" }); - expect(mockNextHandler.mock.calls[0][0].request.headers["transfer-encoding"]).toBe("chunked"); - mockNextHandler.mockClear(); - }); - - it("should update endpoint for custom endpoints", async () => { - const context = {} as any; - const handler = writeGetObjectResponseEndpointMiddleware({ ...mockConfig, isCustomEndpoint: true })( - mockNextHandler, - context - ); - await handler({ - request: new HttpRequest({ hostname: "my-endpoint.com" }), - input: { - RequestRoute: "route", - }, - }); - expect(mockNextHandler.mock.calls.length).toBe(1); - expect(mockNextHandler.mock.calls[0][0].request.hostname).toBe("route.my-endpoint.com"); - expect(mockNextHandler.mock.calls[0][0].request.headers["transfer-encoding"]).toBe("chunked"); - expect(context).toMatchObject({ signing_service: "s3-object-lambda" }); - mockNextHandler.mockClear(); - }); - - it("should not prepend requestRoute parameter if disableHostPrefix is set", async () => { - mockRegionProvider.mockResolvedValueOnce("us-west-2"); - const handler = writeGetObjectResponseEndpointMiddleware({ ...mockConfig, disableHostPrefix: true })( - mockNextHandler, - {} as any - ); - await handler({ - request: new HttpRequest({ hostname: "s3.us-west-2.amazonaws.com" }), - input: { - RequestRoute: "route", - }, - }); - expect(mockNextHandler.mock.calls.length).toBe(1); - expect(mockNextHandler.mock.calls[0][0].request.hostname).toBe("s3-object-lambda.us-west-2.amazonaws.com"); - }); - - it("should not set chunked encoding if content-length is already set", async () => { - const context = {} as any; - const handler = writeGetObjectResponseEndpointMiddleware({ ...mockConfig })(mockNextHandler, context); - const headers = { "content-length": "123" }; - await handler({ - request: new HttpRequest({ hostname: "s3.us-west-2.amazonaws.com", headers }), - input: { - RequestRoute: "route", - }, - }); - expect(mockNextHandler.mock.calls.length).toBe(1); - expect(mockNextHandler.mock.calls[0][0].request.headers).toEqual(headers); - }); - - it("should not set the chunked encoding for non Node.js runtime", async () => { - const context = {} as any; - const handler = writeGetObjectResponseEndpointMiddleware({ ...mockConfig, runtime: "browser" })( - mockNextHandler, - context - ); - await handler({ - request: new HttpRequest({ hostname: "s3.us-west-2.amazonaws.com" }), - input: { - RequestRoute: "route", - }, - }); - expect(mockNextHandler.mock.calls.length).toBe(1); - expect(mockNextHandler.mock.calls[0][0].request.headers["transfer-encoding"]).not.toBeDefined(); - }); -}); diff --git a/packages/middleware-sdk-s3/src/write-get-object-response-endpoint.ts b/packages/middleware-sdk-s3/src/write-get-object-response-endpoint.ts deleted file mode 100644 index 800fe62d197d..000000000000 --- a/packages/middleware-sdk-s3/src/write-get-object-response-endpoint.ts +++ /dev/null @@ -1,83 +0,0 @@ -import { getSuffixForArnEndpoint } from "@aws-sdk/middleware-bucket-endpoint"; -import { HttpRequest } from "@aws-sdk/protocol-http"; -import { - BuildHandler, - BuildHandlerArguments, - BuildHandlerOutput, - BuildMiddleware, - HandlerExecutionContext, - MetadataBearer, - Pluggable, - Provider, - RelativeMiddlewareOptions, -} from "@aws-sdk/types"; - -type PreviouslyResolved = { - region: Provider; - isCustomEndpoint?: boolean; - disableHostPrefix: boolean; - runtime: string; -}; - -type Input = { - RequestRoute: string | undefined; -}; - -/** - * @internal - */ -export const writeGetObjectResponseEndpointMiddleware = - (config: PreviouslyResolved): BuildMiddleware => - ( - next: BuildHandler, - context: HandlerExecutionContext - ): BuildHandler => - async (args: BuildHandlerArguments): Promise> => { - const { region: regionProvider, isCustomEndpoint, disableHostPrefix } = config; - const region = await regionProvider(); - const { request, input } = args; - if (!HttpRequest.isInstance(request)) return next({ ...args }); - let hostname = request.hostname; - if (hostname.endsWith("s3.amazonaws.com") || hostname.endsWith("s3-external-1.amazonaws.com")) { - return next({ ...args }); - } - if (!isCustomEndpoint) { - const [, suffix] = getSuffixForArnEndpoint(request.hostname); - hostname = `s3-object-lambda.${region}.${suffix}`; - } - if (!disableHostPrefix && input.RequestRoute) { - hostname = `${input.RequestRoute}.${hostname}`; - } - request.hostname = hostname; - context["signing_service"] = "s3-object-lambda"; - - // Set the chunked transfer encoding when content-length cannot be inferred - // Only set in node because this header is forbidden in browser. - if (config.runtime === "node" && !request.headers["content-length"]) { - request.headers["transfer-encoding"] = "chunked"; - } - return next({ ...args }); - }; - -/** - * @internal - */ -export const writeGetObjectResponseEndpointMiddlewareOptions: RelativeMiddlewareOptions = { - relation: "after", - toMiddleware: "contentLengthMiddleware", - tags: ["WRITE_GET_OBJECT_RESPONSE", "S3", "ENDPOINT"], - name: "writeGetObjectResponseEndpointMiddleware", - override: true, -}; - -/** - * @internal - */ -export const getWriteGetObjectResponseEndpointPlugin = (config: PreviouslyResolved): Pluggable => ({ - applyToStack: (clientStack) => { - clientStack.addRelativeTo( - writeGetObjectResponseEndpointMiddleware(config), - writeGetObjectResponseEndpointMiddlewareOptions - ); - }, -});