Search code examples
springresttemplateapache-httpcomponentsproxyselector

Using Proxy with HttpComponentsClientHttpRequestFactory and RestTemplate


Can some one guide me how can I configure HttpComponentsClientHttpRequestFactory to use proxy server.

All examples I have seen are using SimpleClientHttpRequestFactory.


Solution

  • If you do not mind using Apache Http Client it is not very complicated and there are 2 possibilities:

    1. If single proxy for all targets is enough for you:

      HttpComponentsClientHttpRequestFactory clientHttpRequestFactory 
          = new HttpComponentsClientHttpRequestFactory(
              HttpClientBuilder.create()
                      .setProxy(new HttpHost("myproxy.com", 80, "http"))
                      .build());
      restTemplate = new RestTemplate(clientHttpRequestFactory);
      
    2. Or if you want to use different proxies for different target URIs, schemas, etc. you can use HttpRoutePlanner with custom ProxySelector:

      HttpRoutePlanner routePlanner = new SystemDefaultRoutePlanner(new MyProxySelector());
      
      HttpComponentsClientHttpRequestFactory clientHttpRequestFactory 
          = new HttpComponentsClientHttpRequestFactory(
              HttpClientBuilder.create()
                  .setRoutePlanner(routePlanner)
                  .build());
      restTemplate = new RestTemplate(clientHttpRequestFactory);
      

      Example proxy selector: MyProxySelector.java:

      package hello;
      
      import java.io.IOException;
      import java.net.InetSocketAddress;
      import java.net.Proxy;
      import java.net.Proxy.Type;
      import java.net.ProxySelector;
      import java.net.SocketAddress;
      import java.net.URI;
      import java.util.ArrayList;
      import java.util.List;
      
      public class MyProxySelector extends ProxySelector {
      
          ProxySelector defaultproxySelector = ProxySelector.getDefault();
      
          ArrayList<Proxy> noProxy = new ArrayList<Proxy>();
          ArrayList<Proxy> secureProxy = new ArrayList<Proxy>();
          ArrayList<Proxy> sociaMediaProxy = new ArrayList<Proxy>();
      
          public MyProxySelector(){
      
              noProxy.add(Proxy.NO_PROXY);
      
              secureProxy.add(new Proxy(Type.HTTP, new InetSocketAddress(
                  "secure.proxy.mycompany.com", 8080)));
      
              sociaMediaProxy.add(new Proxy(Type.HTTP, new InetSocketAddress(
                      "social-media.proxy.mycompany.com", 8080)));
          }
      
          @Override
          public List<Proxy> select(URI uri) {
      
              // No proxy for local company addresses.
              if ( uri.getHost().toLowerCase().endsWith("mycompany.com") ) {
                  return noProxy ;
              }
      
              // Special proxy for social networks.
              String host = uri.getHost().toLowerCase();
              if (    host.endsWith("facebook.com") ||
                      host.endsWith("twitter.com") ||
                      host.endsWith("cfapps.io") ||               
                      host.endsWith("flickr.com") ) 
              {
                  return sociaMediaProxy ;
              }
      
              // for https URIs use secureProxy
              if ( uri.getScheme().toLowerCase().equals("https") ){
                  return secureProxy ;
              }
      
              if (defaultproxySelector != null) {
                  return defaultproxySelector.select(uri);
              }
      
              return noProxy;
          }
      
          @Override
          public void connectFailed(URI arg0, SocketAddress arg1, IOException arg2) {
              // TODO Auto-generated method stub
          }
      }