@@ -103,6 +103,7 @@ public class StreamReceiverHandlerTest {
103103
104104 private boolean isGetContentLengthLongCalled ;
105105 private String requestCharacterEncoding ;
106+ private String xFilenameHeader ;
106107
107108 @ Before
108109 public void setup () throws Exception {
@@ -178,6 +179,12 @@ public String getHeader(String name) {
178179 if ("content-length" .equals (name .toLowerCase ())) {
179180 return contentLength ;
180181 }
182+ if ("x-filename" .equals (name .toLowerCase ())) {
183+ return xFilenameHeader ;
184+ }
185+ if ("content-type" .equals (name .toLowerCase ())) {
186+ return contentType ;
187+ }
181188 return super .getHeader (name );
182189 }
183190
@@ -468,4 +475,90 @@ public void doHandleMultipartFileUpload_IOExceptionIsThrown_exceptionIsNotRethro
468475 Mockito .verifyNoInteractions (errorHandler );
469476 }
470477
478+ @ Test
479+ public void doHandleXhrFilePost_filenameFromHeader_extractedCorrectly ()
480+ throws IOException {
481+ xFilenameHeader = "test.txt" ;
482+ outputStream = new ByteArrayOutputStream ();
483+
484+ handler .doHandleXhrFilePost (session , request , response , streamReceiver ,
485+ stateNode , 6 );
486+
487+ ArgumentCaptor <StreamVariable .StreamingEndEvent > endEventCaptor = ArgumentCaptor
488+ .forClass (StreamVariable .StreamingEndEvent .class );
489+ Mockito .verify (streamVariable )
490+ .streamingFinished (endEventCaptor .capture ());
491+ Assert .assertEquals ("test.txt" ,
492+ endEventCaptor .getValue ().getFileName ());
493+ }
494+
495+ @ Test
496+ public void doHandleXhrFilePost_encodedFilename_decodedCorrectly ()
497+ throws IOException {
498+ // encodeURIComponent("my file åäö.txt") in JavaScript
499+ xFilenameHeader = "my%20file%20%C3%A5%C3%A4%C3%B6.txt" ;
500+ outputStream = new ByteArrayOutputStream ();
501+
502+ handler .doHandleXhrFilePost (session , request , response , streamReceiver ,
503+ stateNode , 6 );
504+
505+ ArgumentCaptor <StreamVariable .StreamingEndEvent > endEventCaptor = ArgumentCaptor
506+ .forClass (StreamVariable .StreamingEndEvent .class );
507+ Mockito .verify (streamVariable )
508+ .streamingFinished (endEventCaptor .capture ());
509+ Assert .assertEquals ("my file åäö.txt" ,
510+ endEventCaptor .getValue ().getFileName ());
511+ }
512+
513+ @ Test
514+ public void doHandleXhrFilePost_contentTypeFromHeader_extractedCorrectly ()
515+ throws IOException {
516+ xFilenameHeader = "test.txt" ;
517+ contentType = "text/plain" ;
518+ outputStream = new ByteArrayOutputStream ();
519+
520+ handler .doHandleXhrFilePost (session , request , response , streamReceiver ,
521+ stateNode , 6 );
522+
523+ ArgumentCaptor <StreamVariable .StreamingEndEvent > endEventCaptor = ArgumentCaptor
524+ .forClass (StreamVariable .StreamingEndEvent .class );
525+ Mockito .verify (streamVariable )
526+ .streamingFinished (endEventCaptor .capture ());
527+ Assert .assertEquals ("text/plain" ,
528+ endEventCaptor .getValue ().getMimeType ());
529+ }
530+
531+ @ Test
532+ public void doHandleXhrFilePost_missingContentTypeHeader_defaultsToUnknown ()
533+ throws IOException {
534+ xFilenameHeader = "test.txt" ;
535+ contentType = null ;
536+ outputStream = new ByteArrayOutputStream ();
537+
538+ handler .doHandleXhrFilePost (session , request , response , streamReceiver ,
539+ stateNode , 6 );
540+
541+ ArgumentCaptor <StreamVariable .StreamingEndEvent > endEventCaptor = ArgumentCaptor
542+ .forClass (StreamVariable .StreamingEndEvent .class );
543+ Mockito .verify (streamVariable )
544+ .streamingFinished (endEventCaptor .capture ());
545+ Assert .assertEquals ("unknown" , endEventCaptor .getValue ().getMimeType ());
546+ }
547+
548+ @ Test
549+ public void doHandleXhrFilePost_missingFilenameHeader_defaultsToUnknown ()
550+ throws IOException {
551+ xFilenameHeader = null ;
552+ outputStream = new ByteArrayOutputStream ();
553+
554+ handler .doHandleXhrFilePost (session , request , response , streamReceiver ,
555+ stateNode , 6 );
556+
557+ ArgumentCaptor <StreamVariable .StreamingEndEvent > endEventCaptor = ArgumentCaptor
558+ .forClass (StreamVariable .StreamingEndEvent .class );
559+ Mockito .verify (streamVariable )
560+ .streamingFinished (endEventCaptor .capture ());
561+ Assert .assertEquals ("unknown" , endEventCaptor .getValue ().getFileName ());
562+ }
563+
471564}
0 commit comments