Hi,
    As Roland had previously suggested I took latest HTTPClient Version (3.1)
and used it in our desktop app which connects to server with https
(StrictSSLProtocolSocketFactory impl.) through Proxy server... To use proxy
i had to create my own socketfactory which will override createSocket()
method and it will set new Socket with Proxy.NO_PROXY.

heres my socetfactory implementation.

public class AsiteSocketFactory extends StrictSSLProtocolSocketFactory
implements ProtocolSocketFactory {

    public AsiteSocketFactory() throws
java.security.GeneralSecurityException, java.io.IOException{
        super(true);
    }

    public Socket createSocket(String host, int port) throws IOException,
UnknownHostException {
       return new Socket(host,port);
    }

    public Socket createSocket(String host, int port, InetAddress
localAddress, int localPort) throws IOException, UnknownHostException {
        return new Socket(host,port,localAddress,localPort);
    }

    public Socket createSocket(String host, int port, InetAddress
localAddress, int localPort, HttpConnectionParams params)
            throws IOException, UnknownHostException, ConnectException {
        Socket rval;
        if (params == null) {
            throw new IllegalArgumentException("Parameters may not be
null");
        }
        rval = new Socket(Proxy.NO_PROXY);
        SocketAddress localaddr = new
        InetSocketAddress(localAddress, localPort);
        SocketAddress remoteaddr = new InetSocketAddress(host, port);
        rval.bind(localaddr);
        rval.connect(remoteaddr);
        return rval;
    }
}


I also need StrictSSLProtocol impl so i extended that class in factory and
called Super(true) ....

I create HTTPClient object like this... httpClient is a static object...

MultiThreadedHttpConnectionManager connectionManager = new
MultiThreadedHttpConnectionManager();
httpClient = new HttpClient(connectionManager);
Protocol stricthttps = new Protocol("https", new AsiteSocketFactory(), 443);
Protocol.registerProtocol("http", stricthttps);
httpClient.getHostConfiguration().setHost(SystemConstants.connectionHostName,
443, stricthttps);
httpClient.getHostConfiguration().setProxy(proxyHost, proxyPort);

Now when i run this same code on Production Box (https configured) even if i
pass URL in Method (PostMethod postMethod = new PostMethod(requestUrl);)
like "http://bim.xyz.com"; it works fine... I got an http request on server
log with this....

But if i run same thing on another server which is run on http only(internal
testing purpose),  i get
sun.security.provider.certpath.SunCertPathBuilderException: unable to find
valid certification path to requested target

does this mean that server is sending the certificate even if i connect by
URL "http" in PostMethod obect???

Do i need to create httpclient object differently for http requests??? then
I will also have to remove my sockectfactory  from the  Protocol constructor
because it is extending StrictSSLProtSockFactory.....

Please Help..

Thanks
Nitya

Reply via email to