On Fri, Mar 27, 2009 at 1:21 AM, Dobri Kitipov <kdobrik.ax...@googlemail.com > wrote:
> Hi all, > I am opening a new mail thread related to the following one "HTTP > connection > leak and other related issues" [1]. > Since this became really long and hairy discussion I decided not to post > there this mail. > > The use case > I want to point out a concrete use case I have. I want to reuse a > HttpClient > among different instances of a clients which are executed in different > threads. Every client can make several invocations. The clients can call > different Web Services (WSs) deployed at different hosts/servers. As a > consequence every client may need to provide different authentication > Credentials and may need to support transport sessions using Cookies. > > Both Credentials and Cookies are part of the HttpState. As a result the > HttpState associated with the HttpClient that is reused cannot be reused > that easily in the scenario described in the above lines. Credentials are > associated with a given host, port, realm and authentication schema > (defines > the AuthScope object used as a key for the credentials Map part of the > HttpState). > > Following is an excerpt from the AbstractHTTPSender#setAuthenticationInfo: > > creds = new UsernamePasswordCredentials(username, password); > agent.getState().setCredentials(new AuthScope(host, port, realm), creds); > > Credentials are kept into a Map and could be indentified uniquely from > client to client (thread to thread), but this Map is exposed to all clients > which reuse the HttpClient which is not a good idea. > > The situation with the other member of the HttpState (i.e. Cookies) is > similar. When we have to *different* instances of a client (configured to > use cookies options.setManageSession(true)) calling one and the same WS's > operation then the effect is that both are sharing one JSESSIONID. > > The proposal > The proposal is based on my question posted at > httpclient-us...@hc.apache.org [2] > The idea is to provide the capability to specify/associate a separate > HttpState with every client and still reuse one and the same HttpClient. > What you just need is to pass it as a parameter to the > HttpClient#executeMethod. > I decided that the HttpState should be kept into the ServiceContext. I did > all changes needed in Axis2 kernel (in fact they are really few) and added > the possibility to use a separate HttpState and invoke > HttpClient#executeMethod passing it as a parameter. The changes keep the > kernel backward compatible. I did and several tests and it looks good. > > Please, give me your comments. Do you like this extension? If so I can > provide you with the changes and finally we can agree on committing them > into the kernel. If I understand correctly you need to use the public int executeMethod(org.apache.commons.httpclient.HostConfiguration hostConfiguration, org.apache.commons.httpclient.HttpMethod httpMethod, org.apache.commons.httpclient.HttpState httpState) instead of two parameter method if the http state is stored at serviceContext. I think you have a valid use case there which can not provide with current configurations. Please create a jira and attach the patch. thanks, Amila. > > Thank you, > Dobri > > [1] http://www.mail-archive.com/axis-dev@ws.apache.org/msg45787.html > [2] > http://www.mail-archive.com/httpclient-us...@hc.apache.org/msg01944.html > -- Amila Suriarachchi WSO2 Inc. blog: http://amilachinthaka.blogspot.com/