5959import java .util .concurrent .TimeUnit ;
6060import java .util .regex .Pattern ;
6161import org .eclipse .jetty .client .HttpClient ;
62+ import org .eclipse .jetty .client .api .ContentProvider ;
6263import org .eclipse .jetty .client .api .ContentResponse ;
6364import org .eclipse .jetty .client .api .Request ;
65+ import org .eclipse .jetty .client .util .BytesContentProvider ;
66+ import org .eclipse .jetty .client .util .MultiPartContentProvider ;
6467import org .eclipse .jetty .client .util .StringContentProvider ;
68+ import org .eclipse .jetty .http .HttpFields ;
6569import org .eclipse .jetty .http .HttpHeader ;
6670import org .eclipse .jetty .http .HttpStatus ;
6771import org .junit .BeforeClass ;
@@ -150,7 +154,7 @@ abstract static class TestCase {
150154
151155 abstract String url ();
152156
153- abstract String requestText ();
157+ abstract ContentProvider requestContent ();
154158
155159 abstract int expectedResponseCode ();
156160
@@ -162,7 +166,7 @@ abstract static class TestCase {
162166
163167 abstract Optional <String > expectedOutput ();
164168
165- abstract String httpContentType ();
169+ abstract Optional < String > httpContentType ();
166170
167171 abstract ImmutableMap <String , String > httpHeaders ();
168172
@@ -183,7 +187,11 @@ abstract static class Builder {
183187
184188 abstract Builder setUrl (String x );
185189
186- abstract Builder setRequestText (String x );
190+ abstract Builder setRequestContent (ContentProvider x );
191+
192+ Builder setRequestText (String text ) {
193+ return setRequestContent (new StringContentProvider (text ));
194+ }
187195
188196 abstract Builder setExpectedResponseCode (int x );
189197
@@ -199,6 +207,8 @@ abstract static class Builder {
199207
200208 abstract Builder setHttpContentType (String x );
201209
210+ abstract Builder setHttpContentType (Optional <String > x );
211+
202212 abstract Builder setHttpHeaders (ImmutableMap <String , String > x );
203213
204214 abstract Builder setSnoopFile (File x );
@@ -408,6 +418,25 @@ public void packageless() throws Exception {
408418 ImmutableList .of (TestCase .builder ().setExpectedResponseText ("hello, world\n " ).build ()));
409419 }
410420
421+ @ Test
422+ public void multipart () throws Exception {
423+ MultiPartContentProvider multiPartProvider = new MultiPartContentProvider ();
424+ byte [] bytes = new byte [17 ];
425+ multiPartProvider .addFieldPart ("bytes" , new BytesContentProvider (bytes ), new HttpFields ());
426+ String string = "1234567890" ;
427+ multiPartProvider .addFieldPart ("string" , new StringContentProvider (string ), new HttpFields ());
428+ String expectedResponse = "part bytes type application/octet-stream length 17\n "
429+ + "part string type text/plain;charset=UTF-8 length 10\n " ;
430+ testHttpFunction (
431+ fullTarget ("Multipart" ),
432+ ImmutableList .of (
433+ TestCase .builder ()
434+ .setHttpContentType (Optional .empty ())
435+ .setRequestContent (multiPartProvider )
436+ .setExpectedResponseText (expectedResponse )
437+ .build ()));
438+ }
439+
411440 private File snoopFile () throws IOException {
412441 return temporaryFolder .newFile (testName .getMethodName () + ".txt" );
413442 }
@@ -522,9 +551,10 @@ private void testFunction(
522551 testCase .snoopFile ().ifPresent (File ::delete );
523552 String uri = "http://localhost:" + serverPort + testCase .url ();
524553 Request request = httpClient .POST (uri );
525- request .header (HttpHeader .CONTENT_TYPE , testCase .httpContentType ());
554+ testCase .httpContentType ().ifPresent (
555+ contentType -> request .header (HttpHeader .CONTENT_TYPE , contentType ));
526556 testCase .httpHeaders ().forEach ((header , value ) -> request .header (header , value ));
527- request .content (new StringContentProvider ( testCase .requestText () ));
557+ request .content (testCase .requestContent ( ));
528558 ContentResponse response = request .send ();
529559 expect
530560 .withMessage ("Response to %s is %s %s" , uri , response .getStatus (), response .getReason ())
0 commit comments