@@ -172,13 +172,6 @@ class ApiGatewaySim {
172
172
console . log ( message ) ;
173
173
}
174
174
175
- private getQueryParams ( request : Request ) {
176
- const url = require ( 'url' ) ;
177
- const url_parts = url . parse ( request . url , true ) ;
178
- const query = url_parts . query ;
179
- return query ;
180
- }
181
-
182
175
private getPassThroughTemplateContent ( ) {
183
176
const file = __dirname + '/templates/pass-through.vtl' ;
184
177
return fs . readFileSync ( file , 'utf8' ) ;
@@ -290,13 +283,37 @@ class ApiGatewaySim {
290
283
}
291
284
}
292
285
286
+ private setHeaders ( bodyTemplate : BodyTemplate , request : Request ) {
287
+ const keys = Object . keys ( request . headers ) ;
288
+ if ( ! bodyTemplate . headers ) {
289
+ bodyTemplate . headers = { } ;
290
+ }
291
+ for ( const key of keys ) {
292
+ if ( Array . isArray ( request . headers [ key ] ) ) {
293
+ bodyTemplate . headers [ key ] =
294
+ request . headers [ key ] [ request . headers [ key ] . length - 1 ] ;
295
+ bodyTemplate . multiValueHeaders [ key ] = request . headers [ key ] ;
296
+ } else {
297
+ bodyTemplate . headers [ key ] = request . headers [ key ] ;
298
+ bodyTemplate . multiValueHeaders [ key ] = [ request . headers [ key ] ] ;
299
+ }
300
+ }
301
+ }
302
+
303
+ private setQueryParams ( bodyTemplate : BodyTemplate , request : Request ) {
304
+ const url = require ( 'url' ) ;
305
+ const url_parts = url . parse ( request . url , true ) ;
306
+ const query = url_parts . query ;
307
+ bodyTemplate . queryParams = query ;
308
+ }
309
+
293
310
private parseEvent ( method : Method , request : Request ) {
294
311
const bodyTemplate = new BodyTemplate ( ) ;
295
312
bodyTemplate . context = this . getContextJson ( ) ;
296
313
this . setContextDefaults ( bodyTemplate . context , request ) ;
297
- bodyTemplate . headers = request . headers ;
314
+ this . setHeaders ( bodyTemplate , request ) ;
298
315
bodyTemplate . pathParams = this . getBodyTemplatePathParams ( request ) ;
299
- bodyTemplate . queryParams = this . getQueryParams ( request ) ;
316
+ this . setQueryParams ( bodyTemplate , request ) ;
300
317
bodyTemplate . method = request . method ;
301
318
bodyTemplate . payload = this . getBodyTemplatePayload ( method , request ) ;
302
319
bodyTemplate . stageVariables = this . getStageVariables ( ) ;
@@ -434,11 +451,30 @@ class ApiGatewaySim {
434
451
return Object . keys ( object ) . length === 0 && object . constructor === Object ;
435
452
}
436
453
437
- private getProxyQueryString ( request : Request ) {
454
+ private setProxyQueryString ( event : any , request : Request ) {
438
455
if ( this . isObjectEmpty ( request . query ) ) {
439
- return null ;
456
+ event . queryStringParameters = null ;
457
+ event . multiValueQueryStringParameters = null ;
458
+ return ;
459
+ }
460
+ if ( ! event . queryStringParameters ) {
461
+ event . queryStringParameters = { } ;
462
+ }
463
+ if ( ! event . multiValueQueryStringParameters ) {
464
+ event . multiValueQueryStringParameters = { } ;
465
+ }
466
+ const keys = Object . keys ( request . query ) ;
467
+ const queries = request . query ;
468
+ for ( const key of keys ) {
469
+ if ( Array . isArray ( queries [ key ] ) ) {
470
+ event . queryStringParameters [ key ] =
471
+ queries [ key ] [ queries [ key ] . length - 1 ] ;
472
+ event . multiValueQueryStringParameters [ key ] = queries [ key ] ;
473
+ } else {
474
+ event . queryStringParameters [ key ] = queries [ key ] ;
475
+ event . multiValueQueryStringParameters [ key ] = [ queries [ key ] ] ;
476
+ }
440
477
}
441
- return request . query ;
442
478
}
443
479
444
480
private processProxyData (
@@ -458,9 +494,7 @@ class ApiGatewaySim {
458
494
request . originalUrl
459
495
) ;
460
496
requestObject . eventJson . headers = this . getRawHeaders ( request ) ;
461
- requestObject . eventJson . queryStringParameters = this . getProxyQueryString (
462
- request
463
- ) ;
497
+ this . setProxyQueryString ( requestObject . eventJson , request ) ;
464
498
requestObject . eventJson . httpMethod = request . method ;
465
499
this . removeNonProxyFields ( requestObject . eventJson ) ;
466
500
this . setProxyStageVariables ( path , requestObject . eventJson , request ) ;
@@ -567,6 +601,7 @@ class ApiGatewaySim {
567
601
body : true ,
568
602
statusCode : true ,
569
603
headers : true ,
604
+ isBase64Encoded : true ,
570
605
multiValueHeaders : true
571
606
} ;
572
607
for ( const property in message ) {
@@ -614,6 +649,16 @@ class ApiGatewaySim {
614
649
}
615
650
}
616
651
652
+ private setBase64Encoded ( method : Method , message : any ) {
653
+ if (
654
+ method . integration &&
655
+ method . integration . contentHandling === 'CONVERT_TO_BINARY'
656
+ ) {
657
+ return Buffer . from ( message . body , 'base64' ) ;
658
+ }
659
+ return message . body ;
660
+ }
661
+
617
662
private sendAwsProxyResponse (
618
663
httpResponse : Response ,
619
664
method : Method ,
@@ -640,6 +685,9 @@ class ApiGatewaySim {
640
685
} else {
641
686
this . setMessageStatusCode ( httpResponse , message ) ;
642
687
this . setMessageHeaders ( httpResponse , message ) ;
688
+ if ( message . isBase64Encoded ) {
689
+ parseBody = this . setBase64Encoded ( method , message ) ;
690
+ }
643
691
this . sendDefaultResponse ( httpResponse , method , parseBody ) ;
644
692
}
645
693
} catch ( error ) {
0 commit comments