users@jersey.java.net

[Jersey] Using Multipart with ChunkedOutput [Tomcat 7.0.50]

From: Anil Pinto <anilrpinto_at_outlook.com>
Date: Mon, 7 Apr 2014 12:19:35 -0700

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.