Skip to content

Commit 3cb20fd

Browse files
committed
OkHttpWebSocket: add proxy support
1 parent 25655f8 commit 3cb20fd

File tree

1 file changed

+42
-0
lines changed

1 file changed

+42
-0
lines changed

smack-websocket-okhttp/src/main/java/org/jivesoftware/smack/websocket/okhttp/OkHttpWebSocket.java

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,19 @@
1616
*/
1717
package org.jivesoftware.smack.websocket.okhttp;
1818

19+
import java.net.InetSocketAddress;
20+
import java.net.Proxy;
1921
import java.util.logging.Level;
2022

2123
import javax.net.ssl.SSLSession;
2224

2325
import org.jivesoftware.smack.c2s.internal.ModularXmppClientToServerConnectionInternal;
26+
import org.jivesoftware.smack.proxy.ProxyInfo;
2427
import org.jivesoftware.smack.websocket.impl.AbstractWebSocket;
2528
import org.jivesoftware.smack.websocket.rce.WebSocketRemoteConnectionEndpoint;
2629

30+
import okhttp3.Authenticator;
31+
import okhttp3.Credentials;
2732
import okhttp3.OkHttpClient;
2833
import okhttp3.Request;
2934
import okhttp3.Response;
@@ -53,6 +58,8 @@ public final class OkHttpWebSocket extends AbstractWebSocket {
5358
if (customHostnameVerifier != null) {
5459
okHttpClientBuilder.hostnameVerifier(customHostnameVerifier);
5560
}
61+
62+
applyProxySettings(okHttpClientBuilder, connectionInternal.connection.getConfiguration().getProxyInfo());
5663
}
5764
var okHttpClient = okHttpClientBuilder.build();
5865

@@ -65,6 +72,41 @@ public final class OkHttpWebSocket extends AbstractWebSocket {
6572
okHttpWebSocket = okHttpClient.newWebSocket(request, listener);
6673
}
6774

75+
private void applyProxySettings(OkHttpClient.Builder okHttpClientBuilder, ProxyInfo proxyInfo) {
76+
if (proxyInfo == null
77+
|| proxyInfo.getProxyType() != ProxyInfo.ProxyType.HTTP
78+
|| proxyInfo.getProxyAddress() == null
79+
|| proxyInfo.getProxyPort() == 0) {
80+
return;
81+
}
82+
83+
var proxy = new Proxy(Proxy.Type.HTTP,
84+
new InetSocketAddress(proxyInfo.getProxyAddress(), proxyInfo.getProxyPort()));
85+
okHttpClientBuilder.proxy(proxy);
86+
87+
if (proxyInfo.getProxyUsername() != null) {
88+
Authenticator proxyAuthenticator = (route, response) ->
89+
{
90+
// If the proxy header is already set, the credentials are probably wrong.
91+
// So do nothing!
92+
if (response.request().header("Proxy-Authorization") != null) {
93+
return null;
94+
}
95+
96+
// Generate Basic Auth credentials
97+
String credentials = Credentials.basic(proxyInfo.getProxyUsername(),
98+
proxyInfo.getProxyPassword());
99+
100+
// Add the 'Proxy-Authorization' header to the request
101+
return response.request()
102+
.newBuilder()
103+
.header("Proxy-Authorization", credentials)
104+
.build();
105+
};
106+
okHttpClientBuilder.proxyAuthenticator(proxyAuthenticator);
107+
}
108+
}
109+
68110
private final WebSocketListener listener = new WebSocketListener() {
69111

70112
@Override

0 commit comments

Comments
 (0)