1616 */
1717package org .jivesoftware .smack .websocket .okhttp ;
1818
19+ import java .net .InetSocketAddress ;
20+ import java .net .Proxy ;
1921import java .util .logging .Level ;
2022
2123import javax .net .ssl .SSLSession ;
2224
2325import org .jivesoftware .smack .c2s .internal .ModularXmppClientToServerConnectionInternal ;
26+ import org .jivesoftware .smack .proxy .ProxyInfo ;
2427import org .jivesoftware .smack .websocket .impl .AbstractWebSocket ;
2528import org .jivesoftware .smack .websocket .rce .WebSocketRemoteConnectionEndpoint ;
2629
30+ import okhttp3 .Authenticator ;
31+ import okhttp3 .Credentials ;
2732import okhttp3 .OkHttpClient ;
2833import okhttp3 .Request ;
2934import 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