On Wed, 2016-04-20 at 15:03 +0000, Sven Zethelius wrote: > I am trying to use a HttpRequestInterceptor to adapt a request sent to a > org.apache.http.impl.nio.client.CloseableHttpAsyncClient. I want to do > request body compression (e.g. Content-Encoding: gzip for HttpRequest, not > Accept-Encoding) following the example here: > https://hc.apache.org/httpcomponents-client-4.2.x/httpclient/examples/org/apache/http/examples/client/ClientGZipContentCompression.java > . The example is for response compression, but it looked like I could do > the same thing to do request compression, and I need to handle response > compression too. > > After much debugging I realized the HttpRequestInterceptor would allow me to > change the headers, but not the HttpEntity that was sent. The entity sent is > always the original one passed into the AsyncHttpClient. On the server, I > see the "Content-Type: gzip" and a "Content-Length" header for the gzipped > length (Content-Length was set by the internal interceptors), but the bytes > sent are the original values from the NByteArrayEntity, which leads to > exceptions since Content-Length doesn't match actual length after GZIP. > > I tracked it down to the constructor for > org.apache.http.nio.protocol.BasicAsyncRequestProducer. The > BasicAsyncRequestProducer is created before the interceptors run. In the > producer constructor, the entity from the request is stored as the producer. > This occurs before the HttpRequestInterceptor has a chance to manipulate the > entity. > > My idea for a patch would be to delay load the producer field until after the > interceptors have run. Looking at the class, that would have to be in > produceContent, before it checks for producer==null. Since the request is > also a member, this would allow the producer to be set based on what's in the > request when we actually produce the output, rather than what was in it when > the whole processing chain started. > > Is patching the BasicAsyncRequestProducer the only way to do this or is there > a simpler way that I am missing? > >
Hi Sven Building a custom request producer is currently the only way to implement content compression. HttpAsyncClient presently does not support transparent content compression. This feature is tentatively planned for 5.0. Oleg --------------------------------------------------------------------- To unsubscribe, e-mail: httpclient-users-unsubscr...@hc.apache.org For additional commands, e-mail: httpclient-users-h...@hc.apache.org