users@jersey.java.net

[Jersey] Failing to upload large files with client

From: Tom Litton <tom.litton_at_gmail.com>
Date: Fri, 12 Jun 2015 15:06:19 -0500

I'm trying to upload very large (4GB+) files with the jersey client. For
smaller files it seems to work fine, but with larger ones i get this error:

org.glassfish.jersey.message.internal.HeaderValueException: Unable to parse
"Content-Length" header value: "4632608768"
at
org.glassfish.jersey.message.internal.OutboundMessageContext.exception(OutboundMessageContext.java:230)
at
org.glassfish.jersey.message.internal.OutboundMessageContext.singleHeader(OutboundMessageContext.java:224)
at
org.glassfish.jersey.message.internal.OutboundMessageContext.getLength(OutboundMessageContext.java:432)
at
org.glassfish.jersey.client.HttpUrlConnector._apply(HttpUrlConnector.java:305)
at
org.glassfish.jersey.client.HttpUrlConnector.apply(HttpUrlConnector.java:242)
at org.glassfish.jersey.client.ClientRuntime.invoke(ClientRuntime.java:254)
at
org.glassfish.jersey.client.JerseyInvocation$1.call(JerseyInvocation.java:671)
at
org.glassfish.jersey.client.JerseyInvocation$1.call(JerseyInvocation.java:668)
at org.glassfish.jersey.internal.Errors.process(Errors.java:315)
at org.glassfish.jersey.internal.Errors.process(Errors.java:297)
at org.glassfish.jersey.internal.Errors.process(Errors.java:228)
at
org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:444)
at
org.glassfish.jersey.client.JerseyInvocation.invoke(JerseyInvocation.java:668)
at
org.glassfish.jersey.client.JerseyInvocation$Builder.method(JerseyInvocation.java:428)
at
org.glassfish.jersey.client.JerseyInvocation$Builder.post(JerseyInvocation.java:334)
at
com.clc.os.imagerepository.UploadImage_FT.testUpload(UploadImage_FT.java:46)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at
org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at
org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at
org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at
org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at
org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at
org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at
com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:78)
at
com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:212)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:68)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)
Caused by: javax.ws.rs.ProcessingException:
java.lang.NumberFormatException: For input string: "4632608768"
at
org.glassfish.jersey.message.internal.OutboundMessageContext$7.apply(OutboundMessageContext.java:438)
at
org.glassfish.jersey.message.internal.OutboundMessageContext$7.apply(OutboundMessageContext.java:432)
at
org.glassfish.jersey.message.internal.OutboundMessageContext.singleHeader(OutboundMessageContext.java:222)
... 40 more
Caused by: java.lang.NumberFormatException: For input string: "4632608768"
at
java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:583)
at java.lang.Integer.parseInt(Integer.java:615)
at
org.glassfish.jersey.message.internal.OutboundMessageContext$7.apply(OutboundMessageContext.java:436)
... 42 more


It seems like the content length is parsed as an int instead of a long when
the fixed length streaming mode is set.

My code is:

ClientConfig config = new ClientConfig();
config.property(ClientProperties.REQUEST_ENTITY_PROCESSING,
RequestEntityProcessing.CHUNKED.name());
config.property(HttpUrlConnectorProvider.USE_FIXED_LENGTH_STREAMING, true);

Client jerseyClient = ClientBuilder.newBuilder().withConfig(config).build();

File file = new File("/tmp/CentOS-6.6-x86_64-bin-DVD1.iso");

String cl = String.valueOf(file.length());
System.out.println("File size: " + cl);
InputStream fileInStream = new FileInputStream(file);
jerseyClient.target(url)
        .request(MediaType.APPLICATION_OCTET_STREAM_TYPE)
        .header(HttpHeaders.CONTENT_LENGTH, cl)
        .post(Entity.entity(fileInStream,
MediaType.APPLICATION_OCTET_STREAM_TYPE));


I'm running it against version 2.14 and 2.18, both have the same result.

Is there a workaround for this?

Thanks!


Tom Litton