Skip to content

Commit 1e68cc4

Browse files
committed
Clean code from GitpodServerLauncher and update JetBrains backend-plugin to work when user has proxies
1 parent aafcaf1 commit 1e68cc4

File tree

3 files changed

+59
-81
lines changed

3 files changed

+59
-81
lines changed

components/gitpod-protocol/java/src/main/java/io/gitpod/gitpodprotocol/api/GitpodServerLauncher.java

Lines changed: 46 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
import java.net.Proxy;
2323
import java.net.SocketAddress;
2424
import java.net.URI;
25-
import java.util.Arrays;
2625
import java.util.Collections;
2726
import java.util.List;
2827
import java.util.Map;
@@ -50,16 +49,6 @@ private GitpodServerLauncher(
5049
this.client = client;
5150
}
5251

53-
public GitpodServerConnection listen(
54-
String apiUrl,
55-
String origin,
56-
String userAgent,
57-
String clientVersion,
58-
String token
59-
) throws Exception {
60-
return listen(apiUrl, origin, userAgent, clientVersion, token, Collections.emptyList(), null);
61-
}
62-
6352
public GitpodServerConnection listen(
6453
String apiUrl,
6554
String origin,
@@ -70,77 +59,55 @@ public GitpodServerConnection listen(
7059
SSLContext sslContext
7160
) throws Exception {
7261
String gitpodHost = URI.create(apiUrl).getHost();
73-
HttpClient httpClient;
74-
if (sslContext == null && proxies.size() == 0) {
75-
GitpodServerConnectionImpl connection = new GitpodServerConnectionImpl(gitpodHost);
76-
connection.setSession(ContainerProvider.getWebSocketContainer().connectToServer(new Endpoint() {
77-
@Override
78-
public void onOpen(Session session, EndpointConfig config) {
79-
session.addMessageHandler(new WebSocketMessageHandler(messageReader, jsonHandler, remoteEndpoint));
80-
messageWriter.setSession(session);
81-
client.notifyConnect();
82-
}
62+
WebSocketContainer webSocketContainer = ContainerProvider.getWebSocketContainer();
63+
GitpodServerConnectionImpl connection = new GitpodServerConnectionImpl(gitpodHost);
8364

84-
@Override
85-
public void onClose(Session session, CloseReason closeReason) {
86-
connection.complete(closeReason);
87-
}
65+
if (!proxies.isEmpty()) {
66+
HttpClient httpClient;
67+
68+
if (sslContext == null) {
69+
httpClient = new HttpClient();
70+
} else {
71+
SslContextFactory ssl = new SslContextFactory.Client();
72+
ssl.setSslContext(sslContext);
73+
httpClient = new HttpClient(ssl);
74+
}
8875

89-
@Override
90-
public void onError(Session session, Throwable thr) {
91-
GitpodServerConnectionImpl.LOG.log(Level.WARNING, gitpodHost + ": connection error:", thr);
92-
connection.completeExceptionally(thr);
76+
for (Proxy proxy : proxies) {
77+
if (proxy.type().equals(Proxy.Type.DIRECT)) {
78+
continue;
9379
}
94-
}, ClientEndpointConfig.Builder.create().configurator(new ClientEndpointConfig.Configurator() {
95-
@Override
96-
public void beforeRequest(final Map<String, List<String>> headers) {
97-
headers.put("Origin", Arrays.asList(origin));
98-
headers.put("Authorization", Arrays.asList("Bearer " + token));
99-
headers.put("User-Agent", Arrays.asList(userAgent));
100-
headers.put("X-Client-Version", Arrays.asList(clientVersion));
80+
SocketAddress proxyAddress = proxy.address();
81+
if (!(proxyAddress instanceof InetSocketAddress)) {
82+
GitpodServerConnectionImpl.LOG.log(Level.WARNING, gitpodHost + ": unexpected proxy:", proxy);
83+
continue;
84+
}
85+
String hostName = ((InetSocketAddress) proxyAddress).getHostString();
86+
int port = ((InetSocketAddress) proxyAddress).getPort();
87+
if (proxy.type().equals(Proxy.Type.HTTP)) {
88+
httpClient.getProxyConfiguration().getProxies().add(new HttpProxy(hostName, port));
89+
} else if (proxy.type().equals(Proxy.Type.SOCKS)) {
90+
httpClient.getProxyConfiguration().getProxies().add(new Socks4Proxy(hostName, port));
10191
}
102-
}).build(), URI.create(apiUrl)));
103-
return connection;
104-
}
105-
if (sslContext == null) {
106-
httpClient = new HttpClient();
107-
} else {
108-
SslContextFactory ssl = new SslContextFactory.Client();
109-
ssl.setSslContext(sslContext);
110-
httpClient = new HttpClient(ssl);
111-
}
112-
for (Proxy proxy : proxies) {
113-
if (proxy.type().equals(Proxy.Type.DIRECT)) {
114-
continue;
115-
}
116-
SocketAddress proxyAddress = proxy.address();
117-
if (!(proxyAddress instanceof InetSocketAddress)) {
118-
GitpodServerConnectionImpl.LOG.log(Level.WARNING, gitpodHost + ": unexpected proxy:", proxy);
119-
continue;
120-
}
121-
String hostName = ((InetSocketAddress) proxyAddress).getHostString();
122-
int port = ((InetSocketAddress) proxyAddress).getPort();
123-
if (proxy.type().equals(Proxy.Type.HTTP)) {
124-
httpClient.getProxyConfiguration().getProxies().add(new HttpProxy(hostName, port));
125-
} else if (proxy.type().equals(Proxy.Type.SOCKS)) {
126-
httpClient.getProxyConfiguration().getProxies().add(new Socks4Proxy(hostName, port));
12792
}
128-
}
129-
ClientContainer container = new ClientContainer(httpClient);
130-
// allow clientContainer to own httpClient (for start/stop lifecycle)
131-
container.getClient().addManaged(httpClient);
132-
container.start();
13393

134-
GitpodServerConnectionImpl connection = new GitpodServerConnectionImpl(gitpodHost);
135-
connection.whenComplete((input, exception) -> {
136-
try {
137-
container.stop();
138-
} catch (Throwable t) {
139-
GitpodServerConnectionImpl.LOG.log(Level.WARNING, gitpodHost + ": failed to stop websocket container:", t);
140-
}
141-
});
94+
ClientContainer container = new ClientContainer(httpClient);
95+
// allow clientContainer to own httpClient (for start/stop lifecycle)
96+
container.getClient().addManaged(httpClient);
97+
container.start();
98+
99+
connection.whenComplete((input, exception) -> {
100+
try {
101+
container.stop();
102+
} catch (Throwable t) {
103+
GitpodServerConnectionImpl.LOG.log(Level.WARNING, gitpodHost + ": failed to stop websocket container:", t);
104+
}
105+
});
106+
107+
webSocketContainer = container;
108+
}
142109

143-
connection.setSession(container.connectToServer(new Endpoint() {
110+
connection.setSession(webSocketContainer.connectToServer(new Endpoint() {
144111
@Override
145112
public void onOpen(Session session, EndpointConfig config) {
146113
session.addMessageHandler(new WebSocketMessageHandler(messageReader, jsonHandler, remoteEndpoint));
@@ -161,10 +128,10 @@ public void onError(Session session, Throwable thr) {
161128
}, ClientEndpointConfig.Builder.create().configurator(new ClientEndpointConfig.Configurator() {
162129
@Override
163130
public void beforeRequest(final Map<String, List<String>> headers) {
164-
headers.put("Origin", Arrays.asList(origin));
165-
headers.put("Authorization", Arrays.asList("Bearer " + token));
166-
headers.put("User-Agent", Arrays.asList(userAgent));
167-
headers.put("X-Client-Version", Arrays.asList(clientVersion));
131+
headers.put("Origin", Collections.singletonList(origin));
132+
headers.put("Authorization", Collections.singletonList("Bearer " + token));
133+
headers.put("User-Agent", Collections.singletonList(userAgent));
134+
headers.put("X-Client-Version", Collections.singletonList(clientVersion));
168135
}
169136
}).build(), URI.create(apiUrl)));
170137
return connection;

components/gitpod-protocol/java/src/main/java/io/gitpod/gitpodprotocol/testclient/TestClient.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,16 @@
1010
import io.gitpod.gitpodprotocol.api.entities.SendHeartBeatOptions;
1111
import io.gitpod.gitpodprotocol.api.entities.User;
1212

13+
import java.util.Collections;
14+
1315
public class TestClient {
1416
public static void main(String[] args) throws Exception {
1517
String uri = "wss://gitpod.io/api/v1";
1618
String token = "CHANGE-ME";
1719
String origin = "https://CHANGE-ME.gitpod.io/";
1820

1921
GitpodClient client = new GitpodClient();
20-
GitpodServerLauncher.create(client).listen(uri, origin, token, "Test", "Test");
22+
GitpodServerLauncher.create(client).listen(uri, origin, token, "Test", "Test", Collections.emptyList(), null);
2123
GitpodServer gitpodServer = client.getServer();
2224
User user = gitpodServer.getLoggedInUser().join();
2325
System.out.println("logged in user:" + user);

components/ide/jetbrains/backend-plugin/src/main/kotlin/io/gitpod/jetbrains/remote/GitpodManager.kt

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ import com.intellij.openapi.extensions.PluginId
1616
import com.intellij.openapi.util.LowMemoryWatcher
1717
import com.intellij.remoteDev.util.onTerminationOrNow
1818
import com.intellij.util.application
19+
import com.intellij.util.net.ssl.CertificateManager
20+
import com.intellij.util.proxy.CommonProxy
1921
import com.jetbrains.rd.util.lifetime.Lifetime
2022
import git4idea.config.GitVcsApplicationSettings
2123
import io.gitpod.gitpodprotocol.api.GitpodClient
@@ -42,6 +44,7 @@ import kotlinx.coroutines.isActive
4244
import kotlinx.coroutines.launch
4345
import org.jetbrains.ide.BuiltInServerManager
4446
import java.net.URI
47+
import java.net.URL
4548
import java.net.http.HttpClient
4649
import java.net.http.HttpRequest
4750
import java.net.http.HttpResponse
@@ -271,14 +274,20 @@ class GitpodManager : Disposable {
271274
val connect = {
272275
val originalClassLoader = Thread.currentThread().contextClassLoader
273276
try {
277+
val proxies = CommonProxy.getInstance().select(URL(info.gitpodHost))
278+
val sslContext = CertificateManager.getInstance().sslContext
279+
274280
// see https://intellij-support.jetbrains.com/hc/en-us/community/posts/360003146180/comments/360000376240
275281
Thread.currentThread().contextClassLoader = HeartbeatService::class.java.classLoader
282+
276283
launcher.listen(
277284
info.gitpodApi.endpoint,
278285
info.gitpodHost,
279286
plugin.pluginId.idString,
280287
plugin.version,
281-
tokenResponse.token
288+
tokenResponse.token,
289+
proxies,
290+
sslContext
282291
)
283292
} finally {
284293
Thread.currentThread().contextClassLoader = originalClassLoader

0 commit comments

Comments
 (0)