@@ -7,6 +7,10 @@ import { CredentialsShim } from '../auth/deprecated/loginManager'
77import { AwsContext } from './awsContext'
88import {
99 AwsCredentialIdentityProvider ,
10+ BuildHandlerArguments ,
11+ DeserializeHandlerArguments ,
12+ DeserializeHandlerOutput ,
13+ FinalizeHandlerArguments ,
1014 Logger ,
1115 RetryStrategyV2 ,
1216 TokenIdentity ,
@@ -213,26 +217,34 @@ export function recordErrorTelemetry(err: Error, serviceName?: string) {
213217}
214218
215219export const defaultDeserializeMiddleware : DeserializeMiddleware < any , any > =
216- ( next : DeserializeHandler < any , any > , context : HandlerExecutionContext ) => async ( args : any ) =>
220+ ( next : DeserializeHandler < any , any > , context : HandlerExecutionContext ) =>
221+ async ( args : DeserializeHandlerArguments < any > ) =>
217222 onDeserialize ( next , context , args )
218223
219224export const finalizeLoggingMiddleware : FinalizeRequestMiddleware < any , any > =
220- ( next : FinalizeHandler < any , any > ) => async ( args : any ) =>
225+ ( next : FinalizeHandler < any , any > ) => async ( args : FinalizeHandlerArguments < any > ) =>
221226 logOnFinalize ( next , args )
222227
223228function getEndpointMiddleware ( settings : DevSettings = DevSettings . instance ) : BuildMiddleware < any , any > {
224- return ( next : BuildHandler < any , any > , context : HandlerExecutionContext ) => async ( args : any ) =>
225- overwriteEndpoint ( next , context , settings , args )
229+ return ( next : BuildHandler < any , any > , context : HandlerExecutionContext ) =>
230+ async ( args : BuildHandlerArguments < any > ) =>
231+ overwriteEndpoint ( next , context , settings , args )
226232}
227233
228- const keepAliveMiddleware : BuildMiddleware < any , any > = ( next : BuildHandler < any , any > ) => async ( args : any ) =>
229- addKeepAliveHeader ( next , args )
234+ const keepAliveMiddleware : BuildMiddleware < any , any > =
235+ ( next : BuildHandler < any , any > ) => async ( args : BuildHandlerArguments < any > ) =>
236+ addKeepAliveHeader ( next , args )
230237
231- export async function onDeserialize ( next : DeserializeHandler < any , any > , context : HandlerExecutionContext , args : any ) {
232- if ( ! HttpResponse . isInstance ( args . request ) ) {
238+ export async function onDeserialize (
239+ next : DeserializeHandler < any , any > ,
240+ context : HandlerExecutionContext ,
241+ args : DeserializeHandlerArguments < any >
242+ ) : Promise < DeserializeHandlerOutput < any > > {
243+ const request = args . request
244+ if ( ! HttpRequest . isInstance ( request ) ) {
233245 return next ( args )
234246 }
235- const { hostname, path } = args . request
247+ const { hostname, path } = request
236248 const serviceId = getServiceId ( context as object )
237249 const logTail = `(${ hostname } ${ path } )`
238250 try {
@@ -247,15 +259,15 @@ export async function onDeserialize(next: DeserializeHandler<any, any>, context:
247259 const err = { ...e , name : e . name , mesage : e . message }
248260 delete err [ 'stack' ]
249261 recordErrorTelemetry ( err , serviceId )
250- getLogger ( ) . error ( 'API Response %s: %O' , logTail , err )
262+ logErrorWithHeaders ( request , err , logTail )
251263 }
252264 throw e
253265 }
254266}
255267
256- export async function logOnFinalize ( next : FinalizeHandler < any , any > , args : any ) {
268+ export async function logOnFinalize ( next : FinalizeHandler < any , any > , args : FinalizeHandlerArguments < any > ) {
257269 const request = args . request
258- if ( HttpRequest . isInstance ( args . request ) ) {
270+ if ( HttpRequest . isInstance ( request ) ) {
259271 const { hostname, path } = request
260272 const input = partialClone ( args . input , 3 , [ 'clientSecret' , 'accessToken' , 'refreshToken' ] , '[omitted]' )
261273 getLogger ( ) . debug ( `API Request (%s %s): %O` , hostname , path , input )
@@ -267,7 +279,7 @@ export function overwriteEndpoint(
267279 next : BuildHandler < any , any > ,
268280 context : HandlerExecutionContext ,
269281 settings : DevSettings ,
270- args : any
282+ args : BuildHandlerArguments < any >
271283) {
272284 const request = args . request
273285 if ( HttpRequest . isInstance ( request ) ) {
@@ -289,10 +301,25 @@ export function overwriteEndpoint(
289301 * @param args
290302 * @returns
291303 */
292- export function addKeepAliveHeader ( next : BuildHandler < any , any > , args : any ) {
304+ export function addKeepAliveHeader ( next : BuildHandler < any , any > , args : BuildHandlerArguments < any > ) {
293305 const request = args . request
294306 if ( HttpRequest . isInstance ( request ) ) {
295307 request . headers [ 'Connection' ] = 'keep-alive'
296308 }
297309 return next ( args )
298310}
311+
312+ export function logErrorWithHeaders ( response : HttpRequest , err : Omit < Error , 'stack' > , logTail ?: string ) {
313+ const logHeaderNames = [
314+ 'x-amzn-requestid' ,
315+ 'x-amzn-trace-id' ,
316+ 'x-amzn-served-from' ,
317+ 'x-cache' ,
318+ 'x-amz-cf-id' ,
319+ 'x-amz-cf-pop' ,
320+ ]
321+ const filteredHeaders = Object . fromEntries (
322+ Object . entries ( response . headers ) . filter ( ( [ k , v ] ) => logHeaderNames . includes ( k ) )
323+ )
324+ getLogger ( ) . error ( 'API request failed %s\n headers: %O\n %O' , logTail , filteredHeaders , err )
325+ }
0 commit comments