On Thu, 2023-02-23 at 02:11 +0530, sreenivas somavarapu wrote:
> Hi Oleg,
> 
> Real problem was in our customized AbstractClassicEntityProducer
> class produce method, buffer flush was missing which was causing the
> issue (*Connection
> Closed* in case of GET requests and *Connection forcibly closed* in
> case of
> POST requests). If we don't add a request method check for skipping
> adding
> of entity to request, httpclient produces ContentLength header with 0
> (In
> *RequestContent.java* process method there is a check for entity and
> if
> entity present it adds ContentLength header by default). Currently I
> see
> the only way to avoid not adding ContentLength header is to not set
> an
> entity to request in specific conditions (i.e., GET requests etc.,).
> Is
> there any other way we can make httpclient skip adding ContentLength
> header
> with 0?
> 
> Here is sample code with below modifications to actual code being
> used
> - ContentType, ProtocolVersion and inputstream (i.e., Content) we get
> as
> input from servlet
> -  AbstractClassicEntityProducer has been customized to generate
> content
> length as well and is not using any executor instead produceData API
> is
> predefined in that custom class
> 
> *Code*
>         HttpHost host = new HttpHost("host", "/printenv.pl", 80);
>         InputStream content = new BufferedInputStream(<Stream from
> servlet>);
>         AsyncRequestProducer request =
> AsyncRequestBuilder.get().setHttpHost(host).setEntity(
>                 new AbstractClassicEntityProducer(1024,
> ContentType.TEXT_XML, Executors.newSingleThreadExecutor()) {
>                     @Override
>                     protected void produceData(ContentType ct,
> OutputStream
> os) throws IOException {
>                         if (content != null) {
>                             byte[] b = new byte[1024];
>                             int bytesRead = 0;
>                             while (content.read(b) != -1) {
>                                 os.write(b, bytesRead, b.length);
>                                 bytesRead += b.length;
>                             }
>                         }
>                     }
>                 }).build();
> 

This is where your code is wrong: if the request is not supposed to
have an entity it should not have a entity producer, _at all_.

Oleg


---------------------------------------------------------------------
To unsubscribe, e-mail: httpclient-users-unsubscr...@hc.apache.org
For additional commands, e-mail: httpclient-users-h...@hc.apache.org

Reply via email to