diff --git a/headless-services/spring-boot-language-server/pom.xml b/headless-services/spring-boot-language-server/pom.xml
index 672c0aae6..5b0f394a2 100644
--- a/headless-services/spring-boot-language-server/pom.xml
+++ b/headless-services/spring-boot-language-server/pom.xml
@@ -158,11 +158,6 @@
-
- com.squareup.okhttp3
- okhttp
-
-
org.springframework.boot
diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/RestTemplateFactory.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/RestTemplateFactory.java
index be1ea034f..2fa93f9b7 100644
--- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/RestTemplateFactory.java
+++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/RestTemplateFactory.java
@@ -11,25 +11,27 @@
package org.springframework.ide.vscode.boot.app;
import java.io.IOException;
+import java.net.Authenticator;
import java.net.InetSocketAddress;
import java.net.MalformedURLException;
+import java.net.PasswordAuthentication;
import java.net.Proxy;
+import java.net.ProxySelector;
+import java.net.SocketAddress;
+import java.net.URI;
import java.net.URL;
+import java.net.http.HttpClient;
+import java.net.http.HttpClient.Builder;
+import java.util.Collections;
+import java.util.List;
import java.util.Set;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import org.springframework.http.client.OkHttp3ClientHttpRequestFactory;
+import org.springframework.http.client.JdkClientHttpRequestFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;
-import okhttp3.Authenticator;
-import okhttp3.Credentials;
-import okhttp3.OkHttpClient;
-import okhttp3.Request;
-import okhttp3.Response;
-import okhttp3.Route;
-
@Component
public class RestTemplateFactory {
@@ -42,27 +44,49 @@ public class RestTemplateFactory {
}
public RestTemplate createRestTemplate(String host) {
- String proxyUrl = config.getRawSettings().getString("http", "proxy");
- if (proxyUrl == null || proxyUrl.isBlank()) {
- proxyUrl = getProxyUrlFromEnv();
+ String proxyUrlStr = config.getRawSettings().getString("http", "proxy");
+ if (proxyUrlStr == null || proxyUrlStr.isBlank()) {
+ proxyUrlStr = getProxyUrlFromEnv();
}
- OkHttpClient.Builder clientBuilder = new OkHttpClient.Builder();
- if (proxyUrl != null && !proxyUrl.isBlank()) {
+
+ Builder clientBuilder = HttpClient.newBuilder();
+ if (proxyUrlStr != null && !proxyUrlStr.isBlank()) {
Set exclusions = config.getRawSettings().getStringSet("http", "proxy-exclusions");
if (!"localhost".equals(host) && !"127.0.0.1".equals(host) && !exclusions.contains(host)) {
try {
- URL url = new URL(proxyUrl);
- if (url.getProtocol().startsWith("http")) {
- clientBuilder.proxy(new Proxy(Proxy.Type.HTTP, new InetSocketAddress(url.getHost(), url.getPort() < 0 ? "https".equals(url.getProtocol()) ? 443 : 80 : url.getPort() )));
- } else if (url.getProtocol().startsWith("sock")) {
- clientBuilder.proxy(new Proxy(Proxy.Type.SOCKS, new InetSocketAddress(url.getHost(), url.getPort())));
- }
+ URL proxyUrl = new URL(proxyUrlStr);
+ clientBuilder.proxy(new ProxySelector() {
+
+ @Override
+ public List select(URI uri) {
+ try {
+ URL url = uri.toURL();
+ if (url.getProtocol().startsWith("http")) {
+ return List.of(new Proxy(Proxy.Type.HTTP,
+ new InetSocketAddress(proxyUrl.getHost(),
+ proxyUrl.getPort() < 0
+ ? "https".equals(proxyUrl.getProtocol()) ? 443 : 80
+ : proxyUrl.getPort())));
+ } else if (url.getProtocol().startsWith("sock")) {
+ return List.of(new Proxy(Proxy.Type.SOCKS,
+ new InetSocketAddress(proxyUrl.getHost(), proxyUrl.getPort())));
+ }
+ } catch (MalformedURLException e) {
+ log.error("", e);
+ }
+ return Collections.emptyList();
+ }
+
+ @Override
+ public void connectFailed(URI uri, SocketAddress sa, IOException ioe) {
+ }
+ });
String username = null, password = null;
- if (url.getUserInfo() == null || url.getUserInfo().isBlank()) {
+ if (proxyUrl.getUserInfo() == null || proxyUrl.getUserInfo().isBlank()) {
username = config.getRawSettings().getString("http", "proxy-user");
password = config.getRawSettings().getString("http", "proxy-password");
} else {
- String userInfo = url.getUserInfo();
+ String userInfo = proxyUrl.getUserInfo();
int idx = userInfo.indexOf(':');
if (idx > 0 && idx < userInfo.length()) {
username = userInfo.substring(0, idx);
@@ -72,13 +96,12 @@ public class RestTemplateFactory {
if (username != null && password != null && !username.isEmpty()) {
final String user = username;
final String pass = password;
- clientBuilder.proxyAuthenticator(new Authenticator() {
+ clientBuilder.authenticator(new Authenticator() {
@Override
- public Request authenticate(Route route, Response response) throws IOException {
- String credential = Credentials.basic(user, pass);
- return response.request().newBuilder().header("Proxy-Authorization", credential)
- .build();
+ protected PasswordAuthentication getPasswordAuthentication() {
+ return new PasswordAuthentication(user, pass.toCharArray());
}
+
});
}
} catch (MalformedURLException e) {
@@ -86,7 +109,7 @@ public class RestTemplateFactory {
}
}
}
- return new RestTemplate(new OkHttp3ClientHttpRequestFactory(clientBuilder.build()));
+ return new RestTemplate(new JdkClientHttpRequestFactory(clientBuilder.build()));
}
private static String getProxyUrlFromEnv() {