You are viewing a plain text version of this content. The canonical link for it is here.
Posted to httpclient-users@hc.apache.org by Kishanthan Thangarajah <ks...@gmail.com> on 2012/04/22 12:39:18 UTC

Support for HttpClient4 in Axis2 - Implementing HttpEntity

Hi All,
We are in the process of supporting httpclient4 in axis2 [1] along with
httpclient3 implementation. Since most of the httpclient4 implementations
are new from 3, we have some questions on proceeding with it. With
httpcleint 3, we used RequestEntity class in creating a Request entity
which will be used in wrapping the axis2 message object. Then this will be
used by axis2 http sender in every request. With httpclient4, in getting
the same thing done, we are using HttpEntity.
But with HttpEntity, we have to implement getContent() method in getting
the request entity content. This method returns an InputStream. So what we
did was, return a ByteArrayInputStream of the message in the method impl.
(ie *return new ByteArrayInputStream(message.getBytes()*). But is this the
best way of handling this, method considering performance.?
We figured out this way by referring to some of the available impl of this
method, such as in ByteArrayEntity etc.

Thanks,
Kishanthan.

[1] https://issues.apache.org/jira/browse/AXIS2-4318

Re: Support for HttpClient4 in Axis2 - Implementing HttpEntity

Posted by Kishanthan Thangarajah <ks...@gmail.com>.
Hi Oleg,

On Mon, Apr 23, 2012 at 5:44 PM, Oleg Kalnichevski <ol...@apache.org> wrote:

> On Mon, Apr 23, 2012 at 02:40:08AM +0530, Kishanthan Thangarajah wrote:
> > Hi Oleg,
> >
> > On Sun, Apr 22, 2012 at 5:45 PM, Oleg Kalnichevski <ol...@apache.org>
> wrote:
> >
> > > On Sun, 2012-04-22 at 16:09 +0530, Kishanthan Thangarajah wrote:
> > > > Hi All,
> > > > We are in the process of supporting httpclient4 in axis2 [1] along
> with
> > > > httpclient3 implementation. Since most of the httpclient4
> implementations
> > > > are new from 3, we have some questions on proceeding with it. With
> > > > httpcleint 3, we used RequestEntity class in creating a Request
> entity
> > > > which will be used in wrapping the axis2 message object. Then this
> will
> > > be
> > > > used by axis2 http sender in every request. With httpclient4, in
> getting
> > > > the same thing done, we are using HttpEntity.
> > > > But with HttpEntity, we have to implement getContent() method in
> getting
> > > > the request entity content. This method returns an InputStream. So
> what
> > > we
> > > > did was, return a ByteArrayInputStream of the message in the method
> impl.
> > > > (ie *return new ByteArrayInputStream(message.getBytes()*). But is
> this
> > > the
> > > > best way of handling this, method considering performance.?
> > > > We figured out this way by referring to some of the available impl of
> > > this
> > > > method, such as in ByteArrayEntity etc.
> > > >
> > > > Thanks,
> > > > Kishanthan.
> > > >
> > > > [1] https://issues.apache.org/jira/browse/AXIS2-4318
> > >
> > > Kishanthan
> > >
> > > The HttpEntity interface is used to represent content body of both
> > > incoming and outgoing messages. As far as HTTP request messages on the
> > > client side are concerned only #writeTo method is actually used when
> > > writing the request content out to the underlying connection. One
> should
> > > provide the #getContent method for the sake of completeness but the
> > > implementation of this method will have no impact on performance of the
> > > Axis2 HTTP transport.
> > >
> > > Hope this helps
> > >
> >
> > Thanks for the reply. Yes, it does help. FYI this[1] is the
> > current implementation, where the method getRequestEntityContent() is
> > called in the getContent() method of our HttpEntity impl.
> >
>
> Looks reasonable to me.`
>
>
> > I have some more questions.
> > We used the following code segment in setting a default timeout for
> > connection manager in httpclient3.
> >
> *httpClient.getParams().setConnectionManagerTimeout(**connectionTimeoutValue
> > **). *How can i do the same with httpclient4.?
> > I have gone through the tutorial and found that we can set timeouts for
> > httpclient or httpmethods by setting a parameter as
> >
> *httpClient.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT,
> > connectionTimeoutValue). *But does this set the timeout for connection
> > manager as-well?
> >
>
> Yes, it does. As of version 4.1 HttpClient uses connect timeout value for
> connection lease requests.
>
>
> > In httpclient3, when setting proxy credentials we used
> > *httpClient.getState().setProxyCredentials(AuthScope.ANY,
> > proxyCredentials). *So to do the same in 4, if i call
> > *httpClient.getCredentialsProvider().setCredentials(AuthScope.ANY,
> > proxyCredentials), *will it be ok.?.
>
> It should be OK.
>
>
>  Also can this way be used in setting
> > other credentials (NTCredentials or UsernamePasswordCredentials) as-well
> ?
> >
>
> Yes, it can.
>
>
> > Also i found that most of the parameters are set or get using the
> > respective methods in 3. But the same can be done by calling only the
> > setParameter and providing the correct constants such
> > as CoreConnectionPNames, ClientPNames, etc.
> >
>
> There static convenience methods as well as HTTP parameter beans that can
> be used to get / set HTTP parameters [1]
>

Thanks for those inputs. I think i'm on the write direction and i'm working
forward with the implementation. If i need more information, ill contact
again.


> HttpClient configuration is the single most complained about aspect of the
> 4.x API. I wish we had done it differently. I am considering investing some
> effort into trying to fix the problem in the 4.3 release series.
>

Looking forward for the new release as well.

Kishanthan.

>
> Oleg
>
> [1]
> http://hc.apache.org/httpcomponents-client-ga/tutorial/html/fundamentals.html#d5e339
>
>
> > Thanks,
> > Kishanthan.
> > [1]
> >
> http://svn.apache.org/viewvc/axis/axis2/java/core/branches/AXIS2-4318/modules/transport/http/src/org/apache/axis2/transport/http/AxisRequestEntity.java?revision=1327468&view=markup&pathrev=1327468
> >
> >
> > >
> > > Oleg
> > >
> > >
> > > ---------------------------------------------------------------------
> > > To unsubscribe, e-mail: httpclient-users-unsubscribe@hc.apache.org
> > > For additional commands, e-mail: httpclient-users-help@hc.apache.org
> > >
> > >
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: httpclient-users-unsubscribe@hc.apache.org
> For additional commands, e-mail: httpclient-users-help@hc.apache.org
>
>

Re: Support for HttpClient4 in Axis2 - Implementing HttpEntity

Posted by Oleg Kalnichevski <ol...@apache.org>.
On Mon, Apr 23, 2012 at 02:40:08AM +0530, Kishanthan Thangarajah wrote:
> Hi Oleg,
> 
> On Sun, Apr 22, 2012 at 5:45 PM, Oleg Kalnichevski <ol...@apache.org> wrote:
> 
> > On Sun, 2012-04-22 at 16:09 +0530, Kishanthan Thangarajah wrote:
> > > Hi All,
> > > We are in the process of supporting httpclient4 in axis2 [1] along with
> > > httpclient3 implementation. Since most of the httpclient4 implementations
> > > are new from 3, we have some questions on proceeding with it. With
> > > httpcleint 3, we used RequestEntity class in creating a Request entity
> > > which will be used in wrapping the axis2 message object. Then this will
> > be
> > > used by axis2 http sender in every request. With httpclient4, in getting
> > > the same thing done, we are using HttpEntity.
> > > But with HttpEntity, we have to implement getContent() method in getting
> > > the request entity content. This method returns an InputStream. So what
> > we
> > > did was, return a ByteArrayInputStream of the message in the method impl.
> > > (ie *return new ByteArrayInputStream(message.getBytes()*). But is this
> > the
> > > best way of handling this, method considering performance.?
> > > We figured out this way by referring to some of the available impl of
> > this
> > > method, such as in ByteArrayEntity etc.
> > >
> > > Thanks,
> > > Kishanthan.
> > >
> > > [1] https://issues.apache.org/jira/browse/AXIS2-4318
> >
> > Kishanthan
> >
> > The HttpEntity interface is used to represent content body of both
> > incoming and outgoing messages. As far as HTTP request messages on the
> > client side are concerned only #writeTo method is actually used when
> > writing the request content out to the underlying connection. One should
> > provide the #getContent method for the sake of completeness but the
> > implementation of this method will have no impact on performance of the
> > Axis2 HTTP transport.
> >
> > Hope this helps
> >
> 
> Thanks for the reply. Yes, it does help. FYI this[1] is the
> current implementation, where the method getRequestEntityContent() is
> called in the getContent() method of our HttpEntity impl.
> 

Looks reasonable to me.`


> I have some more questions.
> We used the following code segment in setting a default timeout for
> connection manager in httpclient3.
> *httpClient.getParams().setConnectionManagerTimeout(**connectionTimeoutValue
> **). *How can i do the same with httpclient4.?
> I have gone through the tutorial and found that we can set timeouts for
> httpclient or httpmethods by setting a parameter as
> *httpClient.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT,
> connectionTimeoutValue). *But does this set the timeout for connection
> manager as-well?
> 

Yes, it does. As of version 4.1 HttpClient uses connect timeout value for connection lease requests.


> In httpclient3, when setting proxy credentials we used
> *httpClient.getState().setProxyCredentials(AuthScope.ANY,
> proxyCredentials). *So to do the same in 4, if i call
> *httpClient.getCredentialsProvider().setCredentials(AuthScope.ANY,
> proxyCredentials), *will it be ok.?.

It should be OK.


 Also can this way be used in setting
> other credentials (NTCredentials or UsernamePasswordCredentials) as-well ?
> 

Yes, it can.


> Also i found that most of the parameters are set or get using the
> respective methods in 3. But the same can be done by calling only the
> setParameter and providing the correct constants such
> as CoreConnectionPNames, ClientPNames, etc.
> 

There static convenience methods as well as HTTP parameter beans that can be used to get / set HTTP parameters [1]

HttpClient configuration is the single most complained about aspect of the 4.x API. I wish we had done it differently. I am considering investing some effort into trying to fix the problem in the 4.3 release series.

Oleg

[1] http://hc.apache.org/httpcomponents-client-ga/tutorial/html/fundamentals.html#d5e339


> Thanks,
> Kishanthan.
> [1]
> http://svn.apache.org/viewvc/axis/axis2/java/core/branches/AXIS2-4318/modules/transport/http/src/org/apache/axis2/transport/http/AxisRequestEntity.java?revision=1327468&view=markup&pathrev=1327468
> 
> 
> >
> > Oleg
> >
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: httpclient-users-unsubscribe@hc.apache.org
> > For additional commands, e-mail: httpclient-users-help@hc.apache.org
> >
> >

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


Re: Support for HttpClient4 in Axis2 - Implementing HttpEntity

Posted by Kishanthan Thangarajah <ks...@gmail.com>.
Hi Oleg,

On Sun, Apr 22, 2012 at 5:45 PM, Oleg Kalnichevski <ol...@apache.org> wrote:

> On Sun, 2012-04-22 at 16:09 +0530, Kishanthan Thangarajah wrote:
> > Hi All,
> > We are in the process of supporting httpclient4 in axis2 [1] along with
> > httpclient3 implementation. Since most of the httpclient4 implementations
> > are new from 3, we have some questions on proceeding with it. With
> > httpcleint 3, we used RequestEntity class in creating a Request entity
> > which will be used in wrapping the axis2 message object. Then this will
> be
> > used by axis2 http sender in every request. With httpclient4, in getting
> > the same thing done, we are using HttpEntity.
> > But with HttpEntity, we have to implement getContent() method in getting
> > the request entity content. This method returns an InputStream. So what
> we
> > did was, return a ByteArrayInputStream of the message in the method impl.
> > (ie *return new ByteArrayInputStream(message.getBytes()*). But is this
> the
> > best way of handling this, method considering performance.?
> > We figured out this way by referring to some of the available impl of
> this
> > method, such as in ByteArrayEntity etc.
> >
> > Thanks,
> > Kishanthan.
> >
> > [1] https://issues.apache.org/jira/browse/AXIS2-4318
>
> Kishanthan
>
> The HttpEntity interface is used to represent content body of both
> incoming and outgoing messages. As far as HTTP request messages on the
> client side are concerned only #writeTo method is actually used when
> writing the request content out to the underlying connection. One should
> provide the #getContent method for the sake of completeness but the
> implementation of this method will have no impact on performance of the
> Axis2 HTTP transport.
>
> Hope this helps
>

Thanks for the reply. Yes, it does help. FYI this[1] is the
current implementation, where the method getRequestEntityContent() is
called in the getContent() method of our HttpEntity impl.

I have some more questions.
We used the following code segment in setting a default timeout for
connection manager in httpclient3.
*httpClient.getParams().setConnectionManagerTimeout(**connectionTimeoutValue
**). *How can i do the same with httpclient4.?
I have gone through the tutorial and found that we can set timeouts for
httpclient or httpmethods by setting a parameter as
*httpClient.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT,
connectionTimeoutValue). *But does this set the timeout for connection
manager as-well?

In httpclient3, when setting proxy credentials we used
*httpClient.getState().setProxyCredentials(AuthScope.ANY,
proxyCredentials). *So to do the same in 4, if i call
*httpClient.getCredentialsProvider().setCredentials(AuthScope.ANY,
proxyCredentials), *will it be ok.?. Also can this way be used in setting
other credentials (NTCredentials or UsernamePasswordCredentials) as-well ?

Also i found that most of the parameters are set or get using the
respective methods in 3. But the same can be done by calling only the
setParameter and providing the correct constants such
as CoreConnectionPNames, ClientPNames, etc.

Thanks,
Kishanthan.
[1]
http://svn.apache.org/viewvc/axis/axis2/java/core/branches/AXIS2-4318/modules/transport/http/src/org/apache/axis2/transport/http/AxisRequestEntity.java?revision=1327468&view=markup&pathrev=1327468


>
> Oleg
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: httpclient-users-unsubscribe@hc.apache.org
> For additional commands, e-mail: httpclient-users-help@hc.apache.org
>
>

Re: Support for HttpClient4 in Axis2 - Implementing HttpEntity

Posted by Oleg Kalnichevski <ol...@apache.org>.
On Sun, 2012-04-22 at 16:09 +0530, Kishanthan Thangarajah wrote:
> Hi All,
> We are in the process of supporting httpclient4 in axis2 [1] along with
> httpclient3 implementation. Since most of the httpclient4 implementations
> are new from 3, we have some questions on proceeding with it. With
> httpcleint 3, we used RequestEntity class in creating a Request entity
> which will be used in wrapping the axis2 message object. Then this will be
> used by axis2 http sender in every request. With httpclient4, in getting
> the same thing done, we are using HttpEntity.
> But with HttpEntity, we have to implement getContent() method in getting
> the request entity content. This method returns an InputStream. So what we
> did was, return a ByteArrayInputStream of the message in the method impl.
> (ie *return new ByteArrayInputStream(message.getBytes()*). But is this the
> best way of handling this, method considering performance.?
> We figured out this way by referring to some of the available impl of this
> method, such as in ByteArrayEntity etc.
> 
> Thanks,
> Kishanthan.
> 
> [1] https://issues.apache.org/jira/browse/AXIS2-4318

Kishanthan

The HttpEntity interface is used to represent content body of both
incoming and outgoing messages. As far as HTTP request messages on the
client side are concerned only #writeTo method is actually used when
writing the request content out to the underlying connection. One should
provide the #getContent method for the sake of completeness but the
implementation of this method will have no impact on performance of the
Axis2 HTTP transport.

Hope this helps

Oleg


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