On Thu, 2023-02-23 at 17:38 +0530, sreenivas somavarapu wrote:
> Hi Oleg,
> 
> Agreed. Is there a way to achieve that instead of adding method
> condition
> check explicitly (In this case sample code is not initiator of
> request,
> instead that sample code is acting as proxy)? Also is there a way to
> suppress that ContentLength header with 0 value generation alone by
> httpclient?
> 

The problem is not HttpClient APIs but rather Servlet APIs which
provide no reliable way of distinguishing requests with without a
request entity from requests with zero length request body.

Oleg



> Earlier in 4.x we had HttpEntityEnclosingRequestBase based on which
> we
> could determine what method accepts body and what method doesn't, but
> with
> 5.x (Both Synchronous and Asynchronous) I am unable to find any way.
> 
> Regards,
> Sreenivas
> 
> On Thu, Feb 23, 2023 at 2:31 AM Oleg Kalnichevski <ol...@apache.org>
> wrote:
> 
> > 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
> > 
> > 
> 


---------------------------------------------------------------------
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