@@ -309,4 +309,95 @@ public void testParseMultipartArrayDataWorks() {
309309 .expectComplete ()
310310 .verify ();
311311 }
312+
313+ @ Test
314+ public void testParseMultipartFileData_withBase64FileArray_returnsExpectedBody () {
315+ List <Property > properties = new ArrayList <>();
316+ String base64DataUrl = "data:application/pdf;base64,JVBERi0xLjQKMSAwIG9iago=" ;
317+ final Property p1 = new Property (
318+ "fileField" ,
319+ "[{\" name\" : \" test.pdf\" , \" type\" : \" application/pdf\" , \" data\" : \" " + base64DataUrl + "\" }]" );
320+ p1 .setType ("file" );
321+ properties .add (p1 );
322+
323+ final BodyInserter <Object , MockClientHttpRequest > bodyInserter =
324+ (BodyInserter <Object , MockClientHttpRequest >) dataUtils .parseMultipartFileData (properties );
325+ MockClientHttpRequest request = new MockClientHttpRequest (HttpMethod .POST , URI .create ("https://example.com" ));
326+
327+ Mono <Void > result = bodyInserter .insert (request , this .context );
328+ StepVerifier .create (result ).expectComplete ().verify ();
329+ StepVerifier .create (DataBufferUtils .join (request .getBody ()))
330+ .consumeNextWith (dataBuffer -> {
331+ byte [] resultBytes = new byte [dataBuffer .readableByteCount ()];
332+ dataBuffer .read (resultBytes );
333+ DataBufferUtils .release (dataBuffer );
334+ String content = new String (resultBytes , StandardCharsets .UTF_8 );
335+ assertTrue (content .contains (
336+ "Content-Disposition: form-data; name=\" fileField\" ; filename=\" test.pdf\" " ));
337+ assertTrue (content .contains ("Content-Type: application/pdf" ));
338+ })
339+ .expectComplete ()
340+ .verify ();
341+ }
342+
343+ @ Test
344+ public void testParseMultipartFileData_withBinaryFileContainingHtmlEntityBytes_succeeds () {
345+ List <Property > properties = new ArrayList <>();
346+ final Property p1 = new Property (
347+ "fileField" ,
348+ "[{\" name\" : \" test.pdf\" , \" type\" : \" application/pdf\" , "
349+ + "\" data\" : \" binary-prefix\u0026 #xA;binary-suffix\" }]" );
350+ p1 .setType ("file" );
351+ properties .add (p1 );
352+
353+ final BodyInserter <Object , MockClientHttpRequest > bodyInserter =
354+ (BodyInserter <Object , MockClientHttpRequest >) dataUtils .parseMultipartFileData (properties );
355+ MockClientHttpRequest request = new MockClientHttpRequest (HttpMethod .POST , URI .create ("https://example.com" ));
356+
357+ Mono <Void > result = bodyInserter .insert (request , this .context );
358+ StepVerifier .create (result ).expectComplete ().verify ();
359+ StepVerifier .create (DataBufferUtils .join (request .getBody ()))
360+ .consumeNextWith (dataBuffer -> {
361+ byte [] resultBytes = new byte [dataBuffer .readableByteCount ()];
362+ dataBuffer .read (resultBytes );
363+ DataBufferUtils .release (dataBuffer );
364+ String content = new String (resultBytes , StandardCharsets .UTF_8 );
365+ assertTrue (content .contains (
366+ "Content-Disposition: form-data; name=\" fileField\" ; filename=\" test.pdf\" " ));
367+ assertTrue (content .contains ("Content-Type: application/pdf" ));
368+ assertTrue (content .contains ("
" ));
369+ })
370+ .expectComplete ()
371+ .verify ();
372+ }
373+
374+ @ Test
375+ public void testParseMultipartFileData_withLeadingWhitespaceJsonArray_routesAsMultipart () {
376+ List <Property > properties = new ArrayList <>();
377+ String base64DataUrl = "data:application/pdf;base64,JVBERi0xLjQKMSAwIG9iago=" ;
378+ final Property p1 = new Property (
379+ "fileField" ,
380+ " \n [{\" name\" : \" test.pdf\" , \" type\" : \" application/pdf\" , \" data\" : \" " + base64DataUrl + "\" }]" );
381+ p1 .setType ("file" );
382+ properties .add (p1 );
383+
384+ final BodyInserter <Object , MockClientHttpRequest > bodyInserter =
385+ (BodyInserter <Object , MockClientHttpRequest >) dataUtils .parseMultipartFileData (properties );
386+ MockClientHttpRequest request = new MockClientHttpRequest (HttpMethod .POST , URI .create ("https://example.com" ));
387+
388+ Mono <Void > result = bodyInserter .insert (request , this .context );
389+ StepVerifier .create (result ).expectComplete ().verify ();
390+ StepVerifier .create (DataBufferUtils .join (request .getBody ()))
391+ .consumeNextWith (dataBuffer -> {
392+ byte [] resultBytes = new byte [dataBuffer .readableByteCount ()];
393+ dataBuffer .read (resultBytes );
394+ DataBufferUtils .release (dataBuffer );
395+ String content = new String (resultBytes , StandardCharsets .UTF_8 );
396+ assertTrue (content .contains (
397+ "Content-Disposition: form-data; name=\" fileField\" ; filename=\" test.pdf\" " ));
398+ assertTrue (content .contains ("Content-Type: application/pdf" ));
399+ })
400+ .expectComplete ()
401+ .verify ();
402+ }
312403}
0 commit comments