On 11/21/2013 4:06 PM, Oleg Kalnichevski wrote:
On Thu, 2013-11-21 at 15:58 +0530, Dhruvakumar P G wrote:
On 11/21/2013 2:18 PM, Oleg Kalnichevski wrote:
On Wed, 2013-11-20 at 19:30 +0530, Dhruvakumar P G wrote:
Hello,

I have upgraded HttpClient library from 4.0.1 to 4.3.1 and using it in
my web application for communicating to twitter REST API service. If I
don't set the http proxy in web container(Glassfish2.1) and try
connecting to twitter from my home network, HttpClient is able to make
https requests to twitter service.
But if I set the http proxy in Glassfish, and try connecting to twitter
from corporate network(I must set the proxy given by company to talk to
internet), HttpClient is not able to make https requests to twitter service.
I have been trying out different ways but none of them works :
1. If I set the proxy in Request configuration :
requestConfigBuilder.setProxy(proxy). It
throws*org.apache.http.conn.HttpConnectionHostException : Connection
timedout*
2. If I set the proxy in Http client object :
httpClientBuilder.setProxy(proxy). It throws
*org.apache.http.conn.UnsupportedSchemeException :  http protocol is not
supported*
3. Setting the proxy the following way also didn't work :
                   DefaultProxyRoutePlanner routePlanner = new
DefaultProxyRoutePlanner(proxy);
httpClientBuilder.setRoutePlanner(routePlanner)

What am I missing here ? Is there any other way that I can try out to
setup proxy ?

Try this

---
CloseableHttpClient client = HttpClients.custom()
          .setRoutePlanner(new
SystemDefaultRoutePlanner(ProxySelector.getDefault()))
          .build();
---

Oleg
Hi,

Thanks for your suggestion.
I did more research on the issue, played with the Apache's sample java
program reference
<http://hc.apache.org/httpcomponents-client-ga/httpclient/examples/org/apache/http/examples/client/ClientExecuteProxy.java>.
Snippet of my program looks like this :
I have defined a TrustManager which accepts any certificates,
SocketFactoryRegistry
X509TrustManager tm = new X509TrustManager() {
                  @Override
                  public void checkClientTrusted(X509Certificate[]
chain,String authType) {
                      }
                  @Override
                  public void checkServerTrusted(X509Certificate[]
chain,String authType) {
                      }
                  @Override
                  public X509Certificate[] getAcceptedIssuers() {
                          return null;
                      }
    };
Defined SocketFactoryRegistry which I pass to
PoolingHttpClientConnectionManager's constructor :
      SSLConnectionSocketFactory socketFactory = null;
          try {
              SSLContext sslContext =
SSLContext.getInstance(SSLConnectionSocketFactory.TLS);
              sslContext.init(null, new TrustManager[]{tm}, null);
              socketFactory = new SSLConnectionSocketFactory(sslContext);
          } catch(NoSuchAlgorithmException | KeyManagementException n) {
          }
          if(socketFactory == null){
              socketFactory = SSLConnectionSocketFactory.getSocketFactory();
          }
          socketFactoryRegistry =
RegistryBuilder.<ConnectionSocketFactory>create()
              .register("https", socketFactory)
              .build();
          target = new HttpHost("issues.apache.org", 443, "https");
*   connManager = new
PoolingHttpClientConnectionManager(socketFactoryRegistry);*
*httpclientBuilder.setConnectionManager(connManager);*
*httpclientBuilder.setDefaultRequestConfig(RequestConfig.custom().setProxy(proxy).build());*

The above code throws *I/O exception
(org.apache.http.conn.UnsupportedSchemeException) caught when processing
request: http protocol is not supported*

If I don't pass socketFactoryRegistry to
PoolingHttpClientConnectionManager's constructor and instantiate
connection manager object:
*connManager = new PoolingHttpClientConnectionManager();*
This will work without any issues and sample program is able to
communicate with apache host.

if I pass socketFactoryRegistry to connection manager constructor, why
does my program fail to connect to hotst - issues.apache.org ?
Why does it fail even though trust manager  trusts/accepts all
certificates ?


Thanks & Regards,
Dhruva
This happens because you forget to register a connection socket factory
for the 'http' scheme.

Oleg

Is it required to register a connection socket factory for the 'http' scheme, even though I use 'https' scheme to talk to host *: new HttpHost("issues.apache.org", 443, "https")* ?

Thanks,
Dhruva

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


Reply via email to