docusign / docusign-esign-java-client

The Official Docusign Java Client Library used to interact with the eSignature REST API. Send, sign, and approve documents using this client.
https://javadoc.io/doc/com.docusign/docusign-esign-java/latest/index.html
MIT License
105 stars 96 forks source link

Chunked File Upload fails #89

Closed osyniakov closed 5 years ago

osyniakov commented 5 years ago

Problem: Call of EnvelopesApi.updateChunkedUpload(String accountId, String chunkedUploadId) fails with HTTP code 411.

Which most probably happens because body for "PUT" request is empty and ApiClient sets "Content-Length" header = "0". Please see com.docusign.esign.client.ApiClient.java, line 989:

if (body == null) { builder = builder.header("Content-Length", "0"); }

Checked with "docusign-esign-java" version 2.7.0

Complete stacktrace:

com.docusign.esign.client.ApiException: Error while requesting server, received a non successful HTTP code 411 with response Body: '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
<HTML><HEAD><TITLE>Length Required</TITLE>
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD>
<BODY><h2>Length Required</h2>
<hr><p>HTTP Error 411. The request must be chunked or have a content length.</p>
</BODY></HTML>

Code snippet:

        EnvelopesApi envelopesApi = new EnvelopesApi(apiClient);

        byte[] src = ...;

        ChunkedUploadRequest chunkedUploadRequest1 = new ChunkedUploadRequest();
        chunkedUploadRequest1.data(Base64.getEncoder().encodeToString(Arrays.copyOfRange(src, 0, src.length / 2)));
        ChunkedUploadResponse chunkedUploadResponse1 = envelopesApi.createChunkedUpload(accountId, chunkedUploadRequest1);

        final String chunkedUploadId = chunkedUploadResponse1.getChunkedUploadId();

        ChunkedUploadRequest chunkedUploadRequest2 = new ChunkedUploadRequest();
        chunkedUploadRequest2.data(Base64.getEncoder().encodeToString(Arrays.copyOfRange(src, src.length / 2, src.length)));
        envelopesApi.updateChunkedUploadPart(accountId, chunkedUploadId, "1", chunkedUploadRequest2);

        ChunkedUploadResponse updateChunkedUploadResponse = envelopesApi.updateChunkedUpload(accountId, chunkedUploadId);
mmallis87 commented 5 years ago

Hi, We have fixed the issues with new eSignature API version and new SDK release candidate. Please have a look at v2.8.0-RC1 of the Maven/Gradle package.

You can now use updateChunkedUpload. We have a 2.8.0-RC1 branch. Please have a look at the test case as well.

Let us know if this resolves the issue.

osyniakov commented 5 years ago

The issue is fixed. It works as expected now.