Hello,
I have been trying to get Jersey's async mechanism to return a
ChunkedOuput<MultiPart> and then consume it using the client with a
ChunkedInput<MultiPart> but have been unsuccessful in receiving
the stream as a MultiPart instance.
I need Multipart as I have a mix of content types - structured text, binary etc.
I was able to read the stream as a String and can see the entire
multipart content (in pieces) , so I know the expected content is being
streamed back.
This is the error I am getting in the client when attempting to
read the chunks as org.glassfish.jersey.media.multipart.MultiPart - (see
below for the content when read into a string)
Exception in thread "main" javax.ws.rs.BadRequestException: HTTP 400 Bad Request
at org.glassfish.jersey.media.multipart.internal.MultiPartReaderClientSide.readFrom(MultiPartReaderClientSide.java:184)
at org.glassfish.jersey.media.multipart.internal.MultiPartReaderClientSide.readFrom(MultiPartReaderClientSide.java:91)
at
org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$TerminalReaderInterceptor.invokeReadFrom(ReaderInterceptorExecutor.java:257)
at
org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$TerminalReaderInterceptor.aroundReadFrom(ReaderInterceptorExecutor.java:229)
at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor.proceed(ReaderInterceptorExecutor.java:149)
at org.glassfish.jersey.message.internal.MessageBodyFactory.readFrom(MessageBodyFactory.java:1124)
at org.glassfish.jersey.client.ChunkedInput.read(ChunkedInput.java:315)
at com.lobotec.zipota.cloud.client.ZipotaCloudClient.<init>(ZipotaCloudClient.java:54)
at com.lobotec.zipota.cloud.client.ZipotaCloudClient.main(ZipotaCloudClient.java:61)
Caused by: org.jvnet.mimepull.MIMEParsingException: Missing start boundary
at org.jvnet.mimepull.MIMEParser.skipPreamble(MIMEParser.java:308)
at org.jvnet.mimepull.MIMEParser.access$300(MIMEParser.java:62)
at org.jvnet.mimepull.MIMEParser$MIMEEventIterator.next(MIMEParser.java:138)
at org.jvnet.mimepull.MIMEParser$MIMEEventIterator.next(MIMEParser.java:123)
at org.jvnet.mimepull.MIMEMessage.makeProgress(MIMEMessage.java:193)
at org.jvnet.mimepull.MIMEMessage.parseAll(MIMEMessage.java:176)
at org.jvnet.mimepull.MIMEMessage.getAttachments(MIMEMessage.java:101)
at
org.glassfish.jersey.media.multipart.internal.MultiPartReaderClientSide.readMultiPart(MultiPartReaderClientSide.java:225)
at org.glassfish.jersey.media.multipart.internal.MultiPartReaderClientSide.readFrom(MultiPartReaderClientSide.java:179)
Client Code example
-----------------------
Response response = client.target("
http://localhost/testapp/ws").path("mp").request().get();
ChunkedInput<MultiPart> chunkedInput = response.readEntity(new GenericType<ChunkedInput<MultiPart>>() {});
MultiPart chunk;
while ((chunk = chunkedInput.read()) != null) {
System.out.println("Next chunk received: " + chunk);
}
--------------------------------------------------------------------------------------------------------------------
When read as a String I do not get any error and see the following printed (intentionally truncated for relevance)
Next chunk received: --Boundary_2_1367384293_1396897508873
Next chunk received: Content-Type: application/json
Next chunk received: {"name":"Document-1396897508872","attachments":["invoice.pdf"]}
Next chunk received: --Boundary_2_1367384293_1396897508873
Next chunk received: Content-Type: application/octet-stream
Next chunk received: %PDF-1.6
%????
Next chunk received: 32 0 obj
<</Filter/FlateDecode/First 4/Length 172/N 1/Type/ObjStm>>stream
: : :
{PDF binary content }
Next chunk received: 6910
Next chunk received: %%EOF
Next chunk received: --Boundary_2_1367384293_1396897508873--
Client Code example
-----------------------
Response response = client.target("
http://localhost/testapp/ws").path("mp").request().get();
ChunkedInput<String> chunkedInput = response.readEntity(new GenericType<ChunkedInput<String>>() {});
String chunk;
while ((chunk = chunkedInput.read()) != null) {
System.out.println("Next chunk received: " + chunk);
}
Has anyone had success with this. I am using Jersey 2.7 with Java 7.
Appreciate any help.
Thanks,
Anil.
PS: Sorry for the long post, I could not avoid it without leaving out relevant information.