Skip to content

Commit b48318a

Browse files
XQuery: Multipart messages of mixed content-type. Fixes BaseXdb#1203
1 parent c663a0c commit b48318a

File tree

6 files changed

+181
-138
lines changed

6 files changed

+181
-138
lines changed

basex-api/src/test/java/org/basex/http/FnHttpTest.java

+83-52
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,7 @@ public void parseRequest() throws IOException, QueryException {
225225

226226
assertEquals(2, r.attributes.size());
227227
assertEquals(2, r.headers.size());
228-
assertFalse(r.bodyContent.isEmpty());
228+
assertFalse(r.payload.isEmpty());
229229
assertEquals(1, r.payloadAtts.size());
230230
}
231231

@@ -264,17 +264,17 @@ public void parseMultipartReq() throws IOException, QueryException {
264264
final Iterator<Part> i = r.parts.iterator();
265265
Part part = i.next();
266266
assertEquals(2, part.headers.size());
267-
assertEquals(1, part.bodyContent.size());
267+
assertEquals(1, part.bodyContents.size());
268268
assertEquals(1, part.bodyAtts.size());
269269

270270
part = i.next();
271271
assertEquals(1, part.headers.size());
272-
assertEquals(1, part.bodyContent.size());
272+
assertEquals(1, part.bodyContents.size());
273273
assertEquals(1, part.bodyAtts.size());
274274

275275
part = i.next();
276276
assertEquals(0, part.headers.size());
277-
assertEquals(1, part.bodyContent.size());
277+
assertEquals(1, part.bodyContents.size());
278278
assertEquals(1, part.bodyAtts.size());
279279
}
280280

@@ -318,17 +318,17 @@ public void parseMultipartReqBodies() throws IOException, QueryException {
318318
final Iterator<Part> i = r.parts.iterator();
319319
Part part = i.next();
320320
assertEquals(2, part.headers.size());
321-
assertEquals(1, part.bodyContent.size());
321+
assertEquals(1, part.bodyContents.size());
322322
assertEquals(1, part.bodyAtts.size());
323323

324324
part = i.next();
325325
assertEquals(1, part.headers.size());
326-
assertEquals(1, part.bodyContent.size());
326+
assertEquals(1, part.bodyContents.size());
327327
assertEquals(1, part.bodyAtts.size());
328328

329329
part = i.next();
330330
assertEquals(0, part.headers.size());
331-
assertEquals(1, part.bodyContent.size());
331+
assertEquals(1, part.bodyContents.size());
332332
assertEquals(1, part.bodyAtts.size());
333333
}
334334

@@ -475,26 +475,26 @@ public void writeMultipartMessage() throws IOException {
475475
p1.headers.put("Content-Type", "text/plain; charset=us-ascii");
476476
p1.bodyAtts.put("media-type", "text/plain");
477477
final String plain = "...plain text....";
478-
p1.bodyContent.add(Str.get(plain + '\n'));
478+
p1.bodyContents.add(Str.get(plain + '\n'));
479479

480480
final Part p2 = new Part();
481481
p2.headers.put("Content-Type", "text/richtext");
482482
p2.bodyAtts.put("media-type", "text/richtext");
483483
final String rich = ".... richtext version...";
484-
p2.bodyContent.add(Str.get(rich));
484+
p2.bodyContents.add(Str.get(rich));
485485

486486
final Part p3 = new Part();
487487
p3.headers.put("Content-Type", "text/x-whatever");
488488
p3.bodyAtts.put("media-type", "text/x-whatever");
489489
final String fancy = ".... fanciest formatted version...";
490-
p3.bodyContent.add(Str.get(fancy));
490+
p3.bodyContents.add(Str.get(fancy));
491491

492492
req.parts.add(p1);
493493
req.parts.add(p2);
494494
req.parts.add(p3);
495495

496-
final FakeHttpConnection fakeConn = new FakeHttpConnection(new URL("http://www.test.com"));
497-
HttpClient.setRequestContent(fakeConn.getOutputStream(), req);
496+
final FakeHttpConnection conn = new FakeHttpConnection(new URL("http://www.test.com"));
497+
HttpClient.writePayload(conn.getOutputStream(), req);
498498
final String expResult = "--boundary42" + CRLF
499499
+ "Content-Type: text/plain; charset=us-ascii" + CRLF + CRLF
500500
+ plain + Prop.NL + CRLF
@@ -505,7 +505,38 @@ public void writeMultipartMessage() throws IOException {
505505
+ "--boundary42--" + CRLF;
506506

507507
// Compare results
508-
assertEquals(expResult, fakeConn.getOutputStream().toString());
508+
assertEquals(expResult, conn.getOutputStream().toString());
509+
}
510+
511+
512+
/**
513+
* Tests method setRequestContent of HttpClient.
514+
* @throws IOException I/O Exception
515+
*/
516+
@Test
517+
public void writeMultipartMessage2() throws IOException {
518+
final HttpRequest req = new HttpRequest();
519+
req.isMultipart = true;
520+
req.payloadAtts.put("media-type", "multipart/mixed");
521+
req.payloadAtts.put("boundary", "boundary");
522+
final Part p1 = new Part();
523+
p1.headers.put("Content-Type", "application/octet-stream");
524+
p1.bodyAtts.put("media-type", "application/octet-stream");
525+
p1.bodyContents.add(new B64(new byte[] { -1 }));
526+
527+
req.parts.add(p1);
528+
529+
final FakeHttpConnection conn = new FakeHttpConnection(new URL("http://www.test.com"));
530+
HttpClient.writePayload(conn.getOutputStream(), req);
531+
final String expResult = "--boundary" + CRLF
532+
+ "Content-Type: application/octet-stream" + CRLF
533+
+ "Content-Transfer-Encoding: base64" + CRLF
534+
+ CRLF
535+
+ "/w==" + Prop.NL + CRLF
536+
+ "--boundary--" + CRLF;
537+
538+
// Compare results
539+
assertEquals(expResult, conn.getOutputStream().toString());
509540
}
510541

511542
/**
@@ -517,40 +548,40 @@ public void writeMultipartMessage() throws IOException {
517548
public void writeMessage() throws IOException {
518549
// Case 1: No method, media-type='text/xml'
519550
final HttpRequest req1 = new HttpRequest();
520-
final FakeHttpConnection fakeConn1 = new FakeHttpConnection(new URL("http://www.test.com"));
551+
final FakeHttpConnection conn1 = new FakeHttpConnection(new URL("http://www.test.com"));
521552
req1.payloadAtts.put(SerializerOptions.MEDIA_TYPE.name(), "text/xml");
522553
// Node child
523554
final FElem e1 = new FElem("a").add("a");
524-
req1.bodyContent.add(e1);
555+
req1.payload.add(e1);
525556
// String item child
526-
req1.bodyContent.add(Str.get("<b>b</b>"));
527-
HttpClient.setRequestContent(fakeConn1.getOutputStream(), req1);
528-
assertEquals("<a>a</a>&lt;b&gt;b&lt;/b&gt;", fakeConn1.out.toString(Strings.UTF8));
557+
req1.payload.add(Str.get("<b>b</b>"));
558+
HttpClient.writePayload(conn1.getOutputStream(), req1);
559+
assertEquals("<a>a</a>&lt;b&gt;b&lt;/b&gt;", conn1.out.toString(Strings.UTF8));
529560

530561
// Case 2: No method, media-type='text/plain'
531562
final HttpRequest req2 = new HttpRequest();
532-
final FakeHttpConnection fakeConn2 = new FakeHttpConnection(new URL("http://www.test.com"));
563+
final FakeHttpConnection conn2 = new FakeHttpConnection(new URL("http://www.test.com"));
533564
req2.payloadAtts.put(SerializerOptions.MEDIA_TYPE.name(), "text/plain");
534565
// Node child
535566
final FElem e2 = new FElem("a").add("a");
536-
req2.bodyContent.add(e2);
567+
req2.payload.add(e2);
537568
// String item child
538-
req2.bodyContent.add(Str.get("<b>b</b>"));
539-
HttpClient.setRequestContent(fakeConn2.getOutputStream(), req2);
540-
assertEquals("a<b>b</b>", fakeConn2.out.toString());
569+
req2.payload.add(Str.get("<b>b</b>"));
570+
HttpClient.writePayload(conn2.getOutputStream(), req2);
571+
assertEquals("a<b>b</b>", conn2.out.toString());
541572

542573
// Case 3: method='text', media-type='text/xml'
543574
final HttpRequest req3 = new HttpRequest();
544-
final FakeHttpConnection fakeConn3 = new FakeHttpConnection(new URL("http://www.test.com"));
575+
final FakeHttpConnection conn3 = new FakeHttpConnection(new URL("http://www.test.com"));
545576
req3.payloadAtts.put(SerializerOptions.MEDIA_TYPE.name(), "text/xml");
546577
req3.payloadAtts.put("method", "text");
547578
// Node child
548579
final FElem e3 = new FElem("a").add("a");
549-
req3.bodyContent.add(e3);
580+
req3.payload.add(e3);
550581
// String item child
551-
req3.bodyContent.add(Str.get("<b>b</b>"));
552-
HttpClient.setRequestContent(fakeConn3.getOutputStream(), req3);
553-
assertEquals("a<b>b</b>", fakeConn3.out.toString());
582+
req3.payload.add(Str.get("<b>b</b>"));
583+
HttpClient.writePayload(conn3.getOutputStream(), req3);
584+
assertEquals("a<b>b</b>", conn3.out.toString());
554585
}
555586

556587
/**
@@ -562,19 +593,19 @@ public void writeBase64() throws IOException {
562593
// Case 1: content is xs:base64Binary
563594
final HttpRequest req1 = new HttpRequest();
564595
req1.payloadAtts.put("method", SerialMethod.BASEX.toString());
565-
req1.bodyContent.add(new B64(token("test")));
566-
final FakeHttpConnection fakeConn1 = new FakeHttpConnection(new URL("http://www.test.com"));
567-
HttpClient.setRequestContent(fakeConn1.getOutputStream(), req1);
568-
assertEquals(fakeConn1.out.toString(Strings.UTF8), "test");
596+
req1.payload.add(new B64(token("test")));
597+
final FakeHttpConnection conn1 = new FakeHttpConnection(new URL("http://www.test.com"));
598+
HttpClient.writePayload(conn1.getOutputStream(), req1);
599+
assertEquals(conn1.out.toString(Strings.UTF8), "test");
569600

570601
// Case 2: content is a node
571602
final HttpRequest req2 = new HttpRequest();
572603
req2.payloadAtts.put("method", SerialMethod.BASEX.toString());
573604
final FElem e3 = new FElem("a").add("test");
574-
req2.bodyContent.add(e3);
575-
final FakeHttpConnection fakeConn2 = new FakeHttpConnection(new URL("http://www.test.com"));
576-
HttpClient.setRequestContent(fakeConn2.getOutputStream(), req2);
577-
assertEquals("<a>test</a>", fakeConn2.out.toString());
605+
req2.payload.add(e3);
606+
final FakeHttpConnection conn2 = new FakeHttpConnection(new URL("http://www.test.com"));
607+
HttpClient.writePayload(conn2.getOutputStream(), req2);
608+
assertEquals("<a>test</a>", conn2.out.toString());
578609
}
579610

580611
/**
@@ -586,19 +617,19 @@ public void writeHex() throws IOException {
586617
// Case 1: content is xs:hexBinary
587618
final HttpRequest req1 = new HttpRequest();
588619
req1.payloadAtts.put("method", SerialMethod.BASEX.toString());
589-
req1.bodyContent.add(new Hex(token("test")));
590-
final FakeHttpConnection fakeConn1 = new FakeHttpConnection(new URL("http://www.test.com"));
591-
HttpClient.setRequestContent(fakeConn1.getOutputStream(), req1);
592-
assertEquals(fakeConn1.out.toString(Strings.UTF8), "test");
620+
req1.payload.add(new Hex(token("test")));
621+
final FakeHttpConnection conn1 = new FakeHttpConnection(new URL("http://www.test.com"));
622+
HttpClient.writePayload(conn1.getOutputStream(), req1);
623+
assertEquals(conn1.out.toString(Strings.UTF8), "test");
593624

594625
// Case 2: content is a node
595626
final HttpRequest req2 = new HttpRequest();
596627
req2.payloadAtts.put("method", SerialMethod.BASEX.toString());
597628
final FElem e3 = new FElem("a").add("test");
598-
req2.bodyContent.add(e3);
599-
final FakeHttpConnection fakeConn2 = new FakeHttpConnection(new URL("http://www.test.com"));
600-
HttpClient.setRequestContent(fakeConn2.getOutputStream(), req2);
601-
assertEquals("<a>test</a>", fakeConn2.out.toString());
629+
req2.payload.add(e3);
630+
final FakeHttpConnection conn2 = new FakeHttpConnection(new URL("http://www.test.com"));
631+
HttpClient.writePayload(conn2.getOutputStream(), req2);
632+
assertEquals("<a>test</a>", conn2.out.toString());
602633
}
603634

604635
/**
@@ -616,13 +647,13 @@ public void writeFromResource() throws IOException {
616647
req.payloadAtts.put("src", file.url());
617648
req.payloadAtts.put("method", "binary");
618649
// HTTP connection
619-
final FakeHttpConnection fakeConn = new FakeHttpConnection(new URL("http://www.test.com"));
620-
HttpClient.setRequestContent(fakeConn.getOutputStream(), req);
650+
final FakeHttpConnection conn = new FakeHttpConnection(new URL("http://www.test.com"));
651+
HttpClient.writePayload(conn.getOutputStream(), req);
621652

622653
// Delete file
623654
file.delete();
624655

625-
assertEquals(fakeConn.out.toString(Strings.UTF8), "test");
656+
assertEquals(conn.out.toString(Strings.UTF8), "test");
626657
}
627658

628659
/**
@@ -706,9 +737,9 @@ public void multipartResponse() throws Exception {
706737
+ "<http:body media-type='text/x-whatever'/>"
707738
+ "</http:multipart>" + "</http:response> ";
708739
expected.add(new DBNode(new IOContent(response)).children().next());
709-
expected.add(Str.get("...plain text....\n\n"));
710-
expected.add(Str.get(".... richtext...\n"));
711-
expected.add(Str.get(".... fanciest formatted version \n...\n"));
740+
expected.add(Str.get("...plain text....\n"));
741+
expected.add(Str.get(".... richtext..."));
742+
expected.add(Str.get(".... fanciest formatted version \n..."));
712743
compare(expected.value(), returned);
713744
}
714745

@@ -784,9 +815,9 @@ public void multipartRespPreamble() throws Exception {
784815
+ "</http:multipart>" + "</http:response>";
785816
expected.add(new DBNode(new IOContent(response)).children().next());
786817
expected.add(Str.get("This is implicitly typed plain ASCII text.\n"
787-
+ "It does NOT end with a linebreak.\n"));
818+
+ "It does NOT end with a linebreak."));
788819
expected.add(Str.get("This is explicitly typed plain ASCII text.\n"
789-
+ "It DOES end with a linebreak.\n\n"));
820+
+ "It DOES end with a linebreak.\n"));
790821

791822
compare(expected.value(), returned);
792823
}

0 commit comments

Comments
 (0)