Skip to content

Commit 084d405

Browse files
committed
fix: move eventstream handler after signing step
1 parent 545ddb4 commit 084d405

File tree

6 files changed

+40
-59
lines changed

6 files changed

+40
-59
lines changed

packages/eventstream-handler-node/src/EventStreamPayloadHandler.ts

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,10 @@ import {
99
Encoder,
1010
Decoder,
1111
HttpRequest,
12-
HandlerExecutionContext
12+
HandlerExecutionContext,
13+
FinalizeHandlerArguments,
14+
FinalizeHandler,
15+
FinalizeHandlerOutput
1316
} from "@aws-sdk/types";
1417
import { EventStreamMarshaller as EventMarshaller } from "@aws-sdk/eventstream-marshaller";
1518
import { Readable, PassThrough, pipeline } from "stream";
@@ -33,10 +36,10 @@ export class EventStreamPayloadHandler implements IEventStreamPayloadHandler {
3336
}
3437

3538
async handle<T extends MetadataBearer>(
36-
next: BuildHandler<any, T>,
37-
args: BuildHandlerArguments<any>,
39+
next: FinalizeHandler<any, T>,
40+
args: FinalizeHandlerArguments<any>,
3841
context: HandlerExecutionContext = {} as any
39-
): Promise<BuildHandlerOutput<T>> {
42+
): Promise<FinalizeHandlerOutput<T>> {
4043
const request = args.request as HttpRequest;
4144
const { body: payload } = request;
4245
if (!(payload instanceof Readable)) {
@@ -46,14 +49,19 @@ export class EventStreamPayloadHandler implements IEventStreamPayloadHandler {
4649
request.body = new PassThrough({
4750
objectMode: true
4851
});
49-
const result = await next(args);
50-
if (!context.signature) {
51-
throw new Error(
52-
"Initial request signature is not available in eventstream handler."
53-
);
52+
let result: FinalizeHandlerOutput<any>;
53+
try {
54+
result = await next(args);
55+
} catch (e) {
56+
request.body.end();
57+
throw e;
5458
}
59+
const match = (request.headers["authorization"] || "").match(
60+
/Signature=([\w]+)$/
61+
);
62+
const priorSignature = (match || [])[1];
5563
const signingStream = new EventSigningStream({
56-
priorSignature: context.signature,
64+
priorSignature,
5765
eventMarshaller: this.eventMarshaller,
5866
eventSigner: await this.eventSigner()
5967
});
Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,26 @@
1-
import { BuildMiddleware, BuildHandlerOptions } from "@aws-sdk/types";
1+
import {
2+
BuildMiddleware,
3+
BuildHandlerOptions,
4+
FinalizeRequestMiddleware,
5+
FinalizeRequestHandlerOptions,
6+
RelativeLocation
7+
} from "@aws-sdk/types";
28
import { EventStreamResolvedConfig } from "./configuration";
39
import { HttpRequest } from "@aws-sdk/protocol-http";
410

511
export const eventStreamHandlingMiddleware = (
612
options: EventStreamResolvedConfig
7-
): BuildMiddleware<any, any> => (next, context) => async args => {
13+
): FinalizeRequestMiddleware<any, any> => (next, context) => async args => {
814
const { request } = args;
915
if (!HttpRequest.isInstance(request)) return next(args);
1016
return options.eventStreamPayloadHandler.handle(next, args, context);
1117
};
1218

13-
export const eventStreamHandlingMiddlewareOptions: BuildHandlerOptions = {
14-
step: "build",
19+
export const eventStreamHandlingMiddlewareOptions: FinalizeRequestHandlerOptions &
20+
RelativeLocation<any, any> = {
21+
step: "finalizeRequest",
1522
tags: ["EVENT_STREAM", "SIGNATURE", "HANDLE"],
16-
name: "eventStreamHandlingMiddleware"
23+
name: "eventStreamHandlingMiddleware",
24+
relation: "after",
25+
toMiddleware: "awsAuthMiddleware"
1726
};
Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
export * from "./configuration";
22
export * from "./handling-middleware";
33
export * from "./headers-middleware";
4-
export * from "./record-signature-middleware";
54
export * from "./pluggin";

packages/middleware-eventstream/src/pluggin.ts

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,26 +8,18 @@ import {
88
eventStreamHeaderMiddleware,
99
eventStreamHeaderMiddlewareOptions
1010
} from "./headers-middleware";
11-
import {
12-
recordSignatureMiddleware,
13-
recordSignatureMiddlewareOptions
14-
} from "./record-signature-middleware";
1511

1612
export const getEventStreamPlugin = (
1713
options: EventStreamResolvedConfig
1814
): Pluggable<any, any> => ({
1915
applyToStack: clientStack => {
20-
clientStack.add(
16+
clientStack.addRelativeTo(
2117
eventStreamHandlingMiddleware(options),
2218
eventStreamHandlingMiddlewareOptions
2319
);
2420
clientStack.add(
2521
eventStreamHeaderMiddleware,
2622
eventStreamHeaderMiddlewareOptions
2723
);
28-
clientStack.addRelativeTo(
29-
recordSignatureMiddleware,
30-
recordSignatureMiddlewareOptions
31-
);
3224
}
3325
});

packages/middleware-eventstream/src/record-signature-middleware.ts

Lines changed: 0 additions & 27 deletions
This file was deleted.

packages/types/src/eventStream.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import { HttpRequest } from "./http";
22
import { MetadataBearer } from "./response";
33
import {
4-
BuildHandler,
5-
BuildHandlerArguments,
6-
BuildHandlerOutput,
7-
HandlerExecutionContext
4+
HandlerExecutionContext,
5+
FinalizeHandler,
6+
FinalizeHandlerArguments,
7+
FinalizeHandlerOutput
88
} from "./middleware";
99
/**
1010
* An event stream message. The headers and body properties will always be
@@ -106,10 +106,10 @@ export interface EventStreamRequestSigner {
106106

107107
export interface EventStreamPayloadHandler {
108108
handle: <Input extends object, Output extends MetadataBearer>(
109-
next: BuildHandler<Input, Output>,
110-
args: BuildHandlerArguments<Input>,
109+
next: FinalizeHandler<Input, Output>,
110+
args: FinalizeHandlerArguments<Input>,
111111
context?: HandlerExecutionContext
112-
) => Promise<BuildHandlerOutput<Output>>;
112+
) => Promise<FinalizeHandlerOutput<Output>>;
113113
}
114114

115115
export interface EventStreamPayloadHandlerProvider {

0 commit comments

Comments
 (0)