@@ -531,7 +531,7 @@ describe('Payload', () => {
531
531
expect ( res . statusCode ) . to . equal ( 415 ) ;
532
532
} ) ;
533
533
534
- it ( 'returns parsed multipart data' , async ( ) => {
534
+ it ( 'returns parsed multipart data (route) ' , async ( ) => {
535
535
536
536
const multipartPayload =
537
537
'--AaB03x\r\n' +
@@ -585,6 +585,60 @@ describe('Payload', () => {
585
585
expect ( res . result . pics ) . to . exist ( ) ;
586
586
} ) ;
587
587
588
+ it ( 'returns parsed multipart data (server)' , async ( ) => {
589
+
590
+ const multipartPayload =
591
+ '--AaB03x\r\n' +
592
+ 'content-disposition: form-data; name="x"\r\n' +
593
+ '\r\n' +
594
+ 'First\r\n' +
595
+ '--AaB03x\r\n' +
596
+ 'content-disposition: form-data; name="x"\r\n' +
597
+ '\r\n' +
598
+ 'Second\r\n' +
599
+ '--AaB03x\r\n' +
600
+ 'content-disposition: form-data; name="x"\r\n' +
601
+ '\r\n' +
602
+ 'Third\r\n' +
603
+ '--AaB03x\r\n' +
604
+ 'content-disposition: form-data; name="field1"\r\n' +
605
+ '\r\n' +
606
+ 'Joe Blow\r\nalmost tricked you!\r\n' +
607
+ '--AaB03x\r\n' +
608
+ 'content-disposition: form-data; name="field1"\r\n' +
609
+ '\r\n' +
610
+ 'Repeated name segment\r\n' +
611
+ '--AaB03x\r\n' +
612
+ 'content-disposition: form-data; name="pics"; filename="file1.txt"\r\n' +
613
+ 'Content-Type: text/plain\r\n' +
614
+ '\r\n' +
615
+ '... contents of file1.txt ...\r\r\n' +
616
+ '--AaB03x--\r\n' ;
617
+
618
+ const handler = ( request ) => {
619
+
620
+ const result = { } ;
621
+ const keys = Object . keys ( request . payload ) ;
622
+ for ( let i = 0 ; i < keys . length ; ++ i ) {
623
+ const key = keys [ i ] ;
624
+ const value = request . payload [ key ] ;
625
+ result [ key ] = value . _readableState ? true : value ;
626
+ }
627
+
628
+ return result ;
629
+ } ;
630
+
631
+ const server = Hapi . server ( { routes : { payload : { multipart : true } } } ) ;
632
+ server . route ( { method : 'POST' , path : '/echo' , handler } ) ;
633
+
634
+ const res = await server . inject ( { method : 'POST' , url : '/echo' , payload : multipartPayload , headers : { 'content-type' : 'multipart/form-data; boundary=AaB03x' } } ) ;
635
+ expect ( Object . keys ( res . result ) . length ) . to . equal ( 3 ) ;
636
+ expect ( res . result . field1 ) . to . exist ( ) ;
637
+ expect ( res . result . field1 . length ) . to . equal ( 2 ) ;
638
+ expect ( res . result . field1 [ 1 ] ) . to . equal ( 'Repeated name segment' ) ;
639
+ expect ( res . result . pics ) . to . exist ( ) ;
640
+ } ) ;
641
+
588
642
it ( 'signals connection close when payload is unconsumed' , async ( ) => {
589
643
590
644
const payload = Buffer . alloc ( 1024 ) ;
0 commit comments