Configure Proxy Route Planner on Feign
I need to know how to make requests being behind a proxy server using the spring boot REST client. I can do this configuration using apache commons for REST requests like this:
Method that performs POST:
Map <String, Object> map = new TreeMap <String, Object> ();
DynamicProxyRoutePlanner routePlanner = getProxy (param);
CloseableHttpClient closeableHttpClient = HttpClients.custom (). SetRoutePlanner (routePlanner) .build ();
GetProxy method:
private DynamicProxyRoutePlanner getProxy (Map <Integer, Object> param) {
HttpHost proxy = new HttpHost ((String) param.get (PROXY), (Integer) param.get (PROXY_PORT));
DynamicProxyRoutePlanner routePlanner = new DynamicProxyRoutePlanner (proxy);
return routePlanner;
}
DynamicProxyRoutePlanner class:
public class DynamicProxyRoutePlanner implements HttpRoutePlanner {
private DefaultProxyRoutePlanner defaultProxyRoutePlanner = null;
public DynamicProxyRoutePlanner (HttpHost host) {
defaultProxyRoutePlanner = new DefaultProxyRoutePlanner (host);
}
public void setProxy (HttpHost host) {
defaultProxyRoutePlanner = new DefaultProxyRoutePlanner (host);
}
public HttpRoute determineRoute (HttpHost target, HttpRequest request, HttpContext context) throws HttpException {
return defaultProxyRoutePlanner.determineRoute (target, request, context);
}
}
Summing up ...
EDITED --
I created a class
@Configuration
public class FeignConfiguration {
with the methods
@Bean
@ConditionalOnMissingBean (CloseableHttpClient.class)
public CloseableHttpClient httpClient () {
DynamicProxyRoutePlanner routePlanner = getProxy ();
CredentialsProvider credentialsProvider = getCredentials ();
return HttpClients.custom ()
.setDefaultCredentialsProvider (credentialsProvider)
.setRoutePlanner (routePlanner) .build ();
}
private DynamicProxyRoutePlanner getProxy () {
HttpHost proxy = new HttpHost (HOST_PROXY, PORT_PROXY);
return new DynamicProxyRoutePlanner (proxy);
}
public CredentialsProvider getCredentials () {
AuthCache authCache = new BasicAuthCache ();
CredentialsProvider credsProvider = new BasicCredentialsProvider ();
credsProvider.setCredentials (new AuthScope (HOST_PROXY, PORT_PROXY, AuthScope.ANY_HOST, "ntlm"),
new NTCredentials (USER, PASS, "", DOMAIN));
HttpClientContext context = HttpClientContext.create ();
context.setCredentialsProvider (credsProvider);
context.setAuthCache (authCache);
return credsProvider;
}
I have refitted the connection tests but even though Feign does not seem to be trying to use the proxy settings, see the error below:
2018-04-25 09: 59: 10.494 ERROR 25309 --- [nio-9063-exec-2] oaccC [. [. [.] [DispatcherServlet]: Servlet.service () for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is feign.RetryableException: Connection refused (Connection refused) executing POST http://sinaflor-api.des.basis.com.br/api/empreendimentos] with root cause
java.net.ConnectException: Connection refused (Connection refused)
at java.net.PlainSocketImpl.socketConnect (Native Method) ~ [na: 1.8.0_171]
at java.net.AbstractPlainSocketImpl.doConnect (AbstractPlainSocketImpl.java:350) ~ [na: 1.8.0_171]
at java.net.AbstractPlainSocketImpl.connectToAddress (AbstractPlainSocketImpl.java:206) ~ [na: 1.8.0_171]
at java.net.AbstractPlainSocketImpl.connect (AbstractPlainSocketImpl.java:188) ~ [na: 1.8.0_171]
at java.net.SocksSocketImpl.connect (SocksSocketImpl.java:392) ~ [na: 1.8.0_171]
at java.net.Socket.connect (Socket.java:589) ~ [na: 1.8.0_171]
at sun.net.NetworkClient.doConnect (NetworkClient.java:175) ~ [na: 1.8.0_171]
at sun.net.www.http.HttpClient.openServer (HttpClient.java:463) ~ [na: 1.8.0_171]
at sun.net.www.http.HttpClient.openServer (HttpClient.java:558) ~ [na: 1.8.0_171]
at sun.net.www.http.HttpClient. <init> (HttpClient.java:242) ~ [na: 1.8.0_171]
at sun.net.www.http.HttpClient.New (HttpClient.java:339) ~ [na: 1.8.0_171]
at sun.net.www.http.HttpClient.New (HttpClient.java:357) ~ [na: 1.8.0_171]
at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient (HttpURLConnection.java:1220) ~ [na: 1.8.0_171]
at sun.net.www.protocol.http.HttpURLConnection.plainConnect0 (HttpURLConnection.java:1156) ~ [na: 1.8.0_171]
at sun.net.www.protocol.http.HttpURLConnection.plainConnect (HttpURLConnection.java:1050) ~ [na: 1.8.0_171]
at sun.net.www.protocol.http.HttpURLConnection.connect (HttpURLConnection.java:984) ~ [na: 1.8.0_171]
at sun.net.www.protocol.http.HttpURLConnection.getOutputStream0 (HttpURLConnection.java:1334) ~ [na: 1.8.0_171]
at sun.net.www.protocol.http.HttpURLConnection.getOutputStream (HttpURLConnection.java:1309) ~ [na: 1.8.0_171]
at feign.Client $ Default.convertAndSend (Client.java:133) ~ [feign-core-9.3.1.jar: na]
at feign.Client $ Default.execute (Client.java:73) ~ [feign-core-9.3.1.jar: na]
at feign.SynchronousMethodHandler.executeAndDecode (SynchronousMethodHandler.java:97) ~ [feign-core-9.3.1.jar: na]
at feign.SynchronousMethodHandler.invoke (SynchronousMethodHandler.java:76) ~ [feign-core-9.3.1.jar: na]
at feign.ReflectiveFeign $ FeignInvocationHandler.invoke (ReflectiveFeign.java:103) ~ [feign-core-9.3.1.jar: na]
at com.sun.proxy $ Proxy112.send (Unknown Source) ~ [na: na]
I was able to resolve the proxy configuration in feign using okHttpClient like this:
@Configuration
public class FeignConfigurationProxy {
@Value("${url.proxy_host}")
private String HOST_PROXY;
@Value("${url.proxy_port}")
private Integer PORT_PROXY;
private OkHttpClient okHttpClient;
private Proxy proxy;
@PostConstruct
public void init() {
buildProxy();
buildOkHttpClient();
}
@Bean(name = "feign")
public Feign buildClient() {
return Feign.builder().client(new feign.okhttp.OkHttpClient(okHttpClient)).build();
}
@Bean(name = "okhttpclient")
public OkHttpClient okHttpClient() {
return okHttpClient;
}
public void buildOkHttpClient() {
buildProxy();
okHttpClient = new OkHttpClient.Builder().proxy(proxy).build();
}
public void buildProxy() {
proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(HOST_PROXY, PORT_PROXY));
}
}
in pom.xml I added the dependencies:
<dependency>
<groupId> io.github.openfeign </ groupId>
<artifactId> feign-okhttp </ artifactId>
<version> 9.5.0 </ version>
</ dependency>
<dependency>
<groupId> com.squareup.okhttp3 </ groupId>
<artifactId> okhttp </ artifactId>
<version> 3.10.0 </ version>
</ dependency>