I've tried that solution previously. The result is a missing initial HTTP 
header. The transmission begins at the MIME multipart border.

Pastebin source (https://pastebin.com/2Hzdhpt3) has been updated for further 
error replication.

-----Original Message-----
From: Oleg Kalnichevski [mailto:[email protected]]
Sent: Monday, June 5, 2017 07:14
To: HttpClient User Discussion <[email protected]>
Subject: Re: Cannot transmit a SWA response with a large attachment 
(HttpEntity can't chunk multipart)

On Sun, 2017-06-04 at 15:03 +0000, Dan Wlodarski wrote:
> To whom it may concern:
>
> Issue: HttpClient API does not support chunking multipart
> HttpEntities.
> Clients making SOAP requests to a mock SOAP with attachments (SWA)
> server are failing (specifically, Apache-based Java clients are
> throwing
> org.apache.http.NoHttpResponseExceptions) when the attachment in the
> response is large (>2 MiB). Small attachments are transmitted without
> throwing any exceptions. HTTP Content-Length header is correct.
>
> Use case: Multithreaded SOAP server capable of transmitting SWA
> responses of arbitrary content length
>
> Libraries: HttpCore v4.4.6 + HttpMime v4.5.3
>
> Example server source for error replication is available at:
> https://pastebin.com/2Hzdhpt3
>
> Error replication:
> 1. Build the above source with HttpCore v4.4.6 and HttpMime v4.5.3
> libraries (HttpMime is part of the HttpClient project).
> 2. Run the program with a sufficiently large (>2 MiB) binary file
> named "random.png.gz" with correct pathing and permissions (a readable
> directory sibling of the executable).
> 3. Send the server an arbitrary HTTP POST request via some third-
> party client. Note the failure to receive the large server-generated
> multipart result.
>
> NB: SoapUI can be leveraged as an Apache-based Java client with
> precision logging.
>
> Please advise.
>

Dan,

You are mixing up non-blocking i/o transport and a blocking i/o entity 
implementation. This is generally a bad idea as it cannot be done efficiently 
without full or partial content buffering in memory.

If do not mind buffering the entire entity in memory, you can replace
---
response.setEntity(responseEntity);
---

with

---
final ByteArrayOutputStream out = new ByteArrayOutputStream(); 
responseEntity.writeTo(out); response.setEntity(new 
ByteArrayEntity(out.toByteArray()));
---

and your code will work just fine.

Oleg


> Thanks,
>
> Dan C. Wlodarski
> The Design Knowledge Company
> 3100 Presidential Drive
> Suite 103
> Fairborn, Ohio 45324
>
> Phone: 937-427-4276 x175
> Fax: 937-427-1242
> [email protected]
> www.tdkc.com
>
> P.S. This issue was originally submitted on 30 May, but did not appear
> in the archives. Assumed dropped.
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [email protected]
> For additional commands, e-mail: [email protected]
>

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Attachment: smime.p7s
Description: S/MIME cryptographic signature

Reply via email to