@@ -531,7 +531,7 @@ describe('Payload', () => {
531531 expect ( res . statusCode ) . to . equal ( 415 ) ;
532532 } ) ;
533533
534- it ( 'returns parsed multipart data' , async ( ) => {
534+ it ( 'returns parsed multipart data (route) ' , async ( ) => {
535535
536536 const multipartPayload =
537537 '--AaB03x\r\n' +
@@ -585,6 +585,60 @@ describe('Payload', () => {
585585 expect ( res . result . pics ) . to . exist ( ) ;
586586 } ) ;
587587
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+
588642 it ( 'signals connection close when payload is unconsumed' , async ( ) => {
589643
590644 const payload = Buffer . alloc ( 1024 ) ;
0 commit comments