From a7849055e604fefe14ba976477b4c5ef6f2e6381 Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Mon, 8 Feb 2016 21:26:36 +0300 Subject: [PATCH 1/2] proxy support --- .../client/HttpConnectionProvider.java | 12 ++++++++++ .../io/socket/engineio/client/Socket.java | 15 ++++++++++++ .../io/socket/engineio/client/Transport.java | 15 ++++++++++++ .../client/transports/PollingXHR.java | 14 +++++++++-- .../engineio/client/transports/WebSocket.java | 23 +++++++++++++++---- 5 files changed, 72 insertions(+), 7 deletions(-) create mode 100644 src/main/java/io/socket/engineio/client/HttpConnectionProvider.java diff --git a/src/main/java/io/socket/engineio/client/HttpConnectionProvider.java b/src/main/java/io/socket/engineio/client/HttpConnectionProvider.java new file mode 100644 index 0000000..78c6857 --- /dev/null +++ b/src/main/java/io/socket/engineio/client/HttpConnectionProvider.java @@ -0,0 +1,12 @@ +package io.socket.engineio.client; + +import java.io.IOException; +import java.net.HttpURLConnection; +import java.net.URL; + +/** + * @author Eugene.Kudelevsky + */ +public interface HttpConnectionProvider { + HttpURLConnection openConnection(URL url) throws IOException; +} diff --git a/src/main/java/io/socket/engineio/client/Socket.java b/src/main/java/io/socket/engineio/client/Socket.java index 91fb75c..16e56dd 100644 --- a/src/main/java/io/socket/engineio/client/Socket.java +++ b/src/main/java/io/socket/engineio/client/Socket.java @@ -128,6 +128,11 @@ public class Socket extends Emitter { private Future pingIntervalTimer; private SSLContext sslContext; private HostnameVerifier hostnameVerifier; + public String proxyHost; + public int proxyPort = -1; + public String proxyLogin; + public String proxyPassword; + private HttpConnectionProvider httpConnectionProvider; private ReadyState readyState; private ScheduledExecutorService heartbeatScheduler; @@ -205,6 +210,11 @@ public class Socket extends Emitter { this.policyPort = opts.policyPort != 0 ? opts.policyPort : 843; this.rememberUpgrade = opts.rememberUpgrade; this.hostnameVerifier = opts.hostnameVerifier != null ? opts.hostnameVerifier : defaultHostnameVerifier; + this.proxyHost = opts.proxyHost; + this.proxyPort = opts.proxyPort; + this.proxyLogin = opts.proxyLogin; + this.proxyPassword = opts.proxyPassword; + this.httpConnectionProvider = opts.httpConnectionProvider; } public static void setDefaultSSLContext(SSLContext sslContext) { @@ -271,6 +281,11 @@ public class Socket extends Emitter { opts.policyPort = this.policyPort; opts.socket = this; opts.hostnameVerifier = this.hostnameVerifier; + opts.proxyHost = this.proxyHost; + opts.proxyPort = this.proxyPort; + opts.proxyLogin = this.proxyLogin; + opts.proxyPassword = this.proxyPassword; + opts.httpConnectionProvider = this.httpConnectionProvider; Transport transport; if (WebSocket.NAME.equals(name)) { diff --git a/src/main/java/io/socket/engineio/client/Transport.java b/src/main/java/io/socket/engineio/client/Transport.java index ca79ea9..b588f9b 100644 --- a/src/main/java/io/socket/engineio/client/Transport.java +++ b/src/main/java/io/socket/engineio/client/Transport.java @@ -43,6 +43,11 @@ public abstract class Transport extends Emitter { protected SSLContext sslContext; protected Socket socket; protected HostnameVerifier hostnameVerifier; + protected String proxyHost; + protected int proxyPort; + protected String proxyLogin; + protected String proxyPassword; + protected HttpConnectionProvider httpConnectionProvider; protected ReadyState readyState; @@ -57,6 +62,11 @@ public abstract class Transport extends Emitter { this.sslContext = opts.sslContext; this.socket = opts.socket; this.hostnameVerifier = opts.hostnameVerifier; + this.proxyHost = opts.proxyHost; + this.proxyPort = opts.proxyPort; + this.proxyLogin = opts.proxyLogin; + this.proxyPassword = opts.proxyPassword; + this.httpConnectionProvider = opts.httpConnectionProvider; } protected Transport onError(String msg, Exception desc) { @@ -152,5 +162,10 @@ public abstract class Transport extends Emitter { public SSLContext sslContext; public HostnameVerifier hostnameVerifier; protected Socket socket; + public String proxyHost; + public int proxyPort = -1; + public String proxyLogin; + public String proxyPassword; + public HttpConnectionProvider httpConnectionProvider; } } diff --git a/src/main/java/io/socket/engineio/client/transports/PollingXHR.java b/src/main/java/io/socket/engineio/client/transports/PollingXHR.java index 864b114..acbed3f 100644 --- a/src/main/java/io/socket/engineio/client/transports/PollingXHR.java +++ b/src/main/java/io/socket/engineio/client/transports/PollingXHR.java @@ -2,8 +2,9 @@ package io.socket.engineio.client.transports; import io.socket.emitter.Emitter; -import io.socket.thread.EventThread; +import io.socket.engineio.client.HttpConnectionProvider; import io.socket.engineio.client.Transport; +import io.socket.thread.EventThread; import javax.net.ssl.HostnameVerifier; import javax.net.ssl.HttpsURLConnection; @@ -37,6 +38,7 @@ public class PollingXHR extends Polling { opts.uri = this.uri(); opts.sslContext = this.sslContext; opts.hostnameVerifier = this.hostnameVerifier; + opts.httpConnectionProvider = this.httpConnectionProvider; Request req = new Request(opts); @@ -149,6 +151,7 @@ public class PollingXHR extends Polling { private SSLContext sslContext; private HttpURLConnection xhr; private HostnameVerifier hostnameVerifier; + private HttpConnectionProvider httpConnectionProvider; public Request(Options opts) { this.method = opts.method != null ? opts.method : "GET"; @@ -156,6 +159,7 @@ public class PollingXHR extends Polling { this.data = opts.data; this.sslContext = opts.sslContext; this.hostnameVerifier = opts.hostnameVerifier; + this.httpConnectionProvider = opts.httpConnectionProvider; } public void create() { @@ -163,7 +167,12 @@ public class PollingXHR extends Polling { try { logger.fine(String.format("xhr open %s: %s", this.method, this.uri)); URL url = new URL(this.uri); - xhr = (HttpURLConnection)url.openConnection(); + if (httpConnectionProvider != null) { + xhr = httpConnectionProvider.openConnection(url); + } + if (xhr == null) { + xhr = (HttpURLConnection) url.openConnection(); + } xhr.setRequestMethod(this.method); } catch (IOException e) { this.onError(e); @@ -322,6 +331,7 @@ public class PollingXHR extends Polling { public byte[] data; public SSLContext sslContext; public HostnameVerifier hostnameVerifier; + public HttpConnectionProvider httpConnectionProvider; } } } diff --git a/src/main/java/io/socket/engineio/client/transports/WebSocket.java b/src/main/java/io/socket/engineio/client/transports/WebSocket.java index 79c7979..e774679 100644 --- a/src/main/java/io/socket/engineio/client/transports/WebSocket.java +++ b/src/main/java/io/socket/engineio/client/transports/WebSocket.java @@ -8,17 +8,15 @@ import io.socket.parseqs.ParseQS; import io.socket.thread.EventThread; import io.socket.utf8.UTF8Exception; import io.socket.yeast.Yeast; -import okhttp3.OkHttpClient; -import okhttp3.Request; -import okhttp3.RequestBody; -import okhttp3.Response; -import okhttp3.ResponseBody; +import okhttp3.*; import okhttp3.ws.WebSocketCall; import okhttp3.ws.WebSocketListener; import okio.Buffer; import javax.net.ssl.SSLSocketFactory; import java.io.IOException; +import java.net.InetSocketAddress; +import java.net.Proxy; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -61,6 +59,21 @@ public class WebSocket extends Transport { if (this.hostnameVerifier != null) { clientBuilder.hostnameVerifier(this.hostnameVerifier); } + if (proxyHost != null && !proxyHost.isEmpty() && proxyPort >= 0) { + clientBuilder.proxy(new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyHost, proxyPort))); + } + if (proxyLogin != null && !proxyLogin.isEmpty()) { + final String credentials = Credentials.basic(proxyLogin, proxyPassword); + + clientBuilder.proxyAuthenticator(new Authenticator() { + @Override + public Request authenticate(Route route, Response response) throws IOException { + return response.request().newBuilder() + .header("Proxy-Authorization", credentials) + .build(); + } + }); + } Request.Builder builder = new Request.Builder().url(uri()); for (Map.Entry> entry : headers.entrySet()) { for (String v : entry.getValue()) { From d4cc84d08e10f2211d169be6dab3c1fd121fe27e Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Tue, 17 May 2016 16:41:41 +0300 Subject: [PATCH 2/2] Simplify API: remove HttpConnectionProvider --- .../client/HttpConnectionProvider.java | 12 ------------ .../java/io/socket/engineio/client/Socket.java | 13 ++++--------- .../io/socket/engineio/client/Transport.java | 13 ++++--------- .../engineio/client/transports/PollingXHR.java | 18 +++++++----------- .../engineio/client/transports/WebSocket.java | 6 ++---- 5 files changed, 17 insertions(+), 45 deletions(-) delete mode 100644 src/main/java/io/socket/engineio/client/HttpConnectionProvider.java diff --git a/src/main/java/io/socket/engineio/client/HttpConnectionProvider.java b/src/main/java/io/socket/engineio/client/HttpConnectionProvider.java deleted file mode 100644 index 78c6857..0000000 --- a/src/main/java/io/socket/engineio/client/HttpConnectionProvider.java +++ /dev/null @@ -1,12 +0,0 @@ -package io.socket.engineio.client; - -import java.io.IOException; -import java.net.HttpURLConnection; -import java.net.URL; - -/** - * @author Eugene.Kudelevsky - */ -public interface HttpConnectionProvider { - HttpURLConnection openConnection(URL url) throws IOException; -} diff --git a/src/main/java/io/socket/engineio/client/Socket.java b/src/main/java/io/socket/engineio/client/Socket.java index 16e56dd..207ddfe 100644 --- a/src/main/java/io/socket/engineio/client/Socket.java +++ b/src/main/java/io/socket/engineio/client/Socket.java @@ -12,6 +12,7 @@ import org.json.JSONException; import javax.net.ssl.HostnameVerifier; import javax.net.ssl.SSLContext; +import java.net.Proxy; import java.net.URI; import java.net.URISyntaxException; import java.util.*; @@ -128,11 +129,9 @@ public class Socket extends Emitter { private Future pingIntervalTimer; private SSLContext sslContext; private HostnameVerifier hostnameVerifier; - public String proxyHost; - public int proxyPort = -1; + public Proxy proxy; public String proxyLogin; public String proxyPassword; - private HttpConnectionProvider httpConnectionProvider; private ReadyState readyState; private ScheduledExecutorService heartbeatScheduler; @@ -210,11 +209,9 @@ public class Socket extends Emitter { this.policyPort = opts.policyPort != 0 ? opts.policyPort : 843; this.rememberUpgrade = opts.rememberUpgrade; this.hostnameVerifier = opts.hostnameVerifier != null ? opts.hostnameVerifier : defaultHostnameVerifier; - this.proxyHost = opts.proxyHost; - this.proxyPort = opts.proxyPort; + this.proxy = opts.proxy; this.proxyLogin = opts.proxyLogin; this.proxyPassword = opts.proxyPassword; - this.httpConnectionProvider = opts.httpConnectionProvider; } public static void setDefaultSSLContext(SSLContext sslContext) { @@ -281,11 +278,9 @@ public class Socket extends Emitter { opts.policyPort = this.policyPort; opts.socket = this; opts.hostnameVerifier = this.hostnameVerifier; - opts.proxyHost = this.proxyHost; - opts.proxyPort = this.proxyPort; + opts.proxy = this.proxy; opts.proxyLogin = this.proxyLogin; opts.proxyPassword = this.proxyPassword; - opts.httpConnectionProvider = this.httpConnectionProvider; Transport transport; if (WebSocket.NAME.equals(name)) { diff --git a/src/main/java/io/socket/engineio/client/Transport.java b/src/main/java/io/socket/engineio/client/Transport.java index b588f9b..d11cd05 100644 --- a/src/main/java/io/socket/engineio/client/Transport.java +++ b/src/main/java/io/socket/engineio/client/Transport.java @@ -9,6 +9,7 @@ import io.socket.utf8.UTF8Exception; import javax.net.ssl.HostnameVerifier; import javax.net.ssl.SSLContext; +import java.net.Proxy; import java.util.Map; public abstract class Transport extends Emitter { @@ -43,11 +44,9 @@ public abstract class Transport extends Emitter { protected SSLContext sslContext; protected Socket socket; protected HostnameVerifier hostnameVerifier; - protected String proxyHost; - protected int proxyPort; + protected Proxy proxy; protected String proxyLogin; protected String proxyPassword; - protected HttpConnectionProvider httpConnectionProvider; protected ReadyState readyState; @@ -62,11 +61,9 @@ public abstract class Transport extends Emitter { this.sslContext = opts.sslContext; this.socket = opts.socket; this.hostnameVerifier = opts.hostnameVerifier; - this.proxyHost = opts.proxyHost; - this.proxyPort = opts.proxyPort; + this.proxy = opts.proxy; this.proxyLogin = opts.proxyLogin; this.proxyPassword = opts.proxyPassword; - this.httpConnectionProvider = opts.httpConnectionProvider; } protected Transport onError(String msg, Exception desc) { @@ -162,10 +159,8 @@ public abstract class Transport extends Emitter { public SSLContext sslContext; public HostnameVerifier hostnameVerifier; protected Socket socket; - public String proxyHost; - public int proxyPort = -1; + public Proxy proxy; public String proxyLogin; public String proxyPassword; - public HttpConnectionProvider httpConnectionProvider; } } diff --git a/src/main/java/io/socket/engineio/client/transports/PollingXHR.java b/src/main/java/io/socket/engineio/client/transports/PollingXHR.java index acbed3f..54f6dcc 100644 --- a/src/main/java/io/socket/engineio/client/transports/PollingXHR.java +++ b/src/main/java/io/socket/engineio/client/transports/PollingXHR.java @@ -2,7 +2,6 @@ package io.socket.engineio.client.transports; import io.socket.emitter.Emitter; -import io.socket.engineio.client.HttpConnectionProvider; import io.socket.engineio.client.Transport; import io.socket.thread.EventThread; @@ -11,6 +10,7 @@ import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLContext; import java.io.*; import java.net.HttpURLConnection; +import java.net.Proxy; import java.net.URL; import java.nio.ByteBuffer; import java.util.*; @@ -38,7 +38,7 @@ public class PollingXHR extends Polling { opts.uri = this.uri(); opts.sslContext = this.sslContext; opts.hostnameVerifier = this.hostnameVerifier; - opts.httpConnectionProvider = this.httpConnectionProvider; + opts.proxy = this.proxy; Request req = new Request(opts); @@ -151,7 +151,7 @@ public class PollingXHR extends Polling { private SSLContext sslContext; private HttpURLConnection xhr; private HostnameVerifier hostnameVerifier; - private HttpConnectionProvider httpConnectionProvider; + private Proxy proxy; public Request(Options opts) { this.method = opts.method != null ? opts.method : "GET"; @@ -159,7 +159,7 @@ public class PollingXHR extends Polling { this.data = opts.data; this.sslContext = opts.sslContext; this.hostnameVerifier = opts.hostnameVerifier; - this.httpConnectionProvider = opts.httpConnectionProvider; + this.proxy = opts.proxy; } public void create() { @@ -167,12 +167,8 @@ public class PollingXHR extends Polling { try { logger.fine(String.format("xhr open %s: %s", this.method, this.uri)); URL url = new URL(this.uri); - if (httpConnectionProvider != null) { - xhr = httpConnectionProvider.openConnection(url); - } - if (xhr == null) { - xhr = (HttpURLConnection) url.openConnection(); - } + xhr = proxy != null ? (HttpURLConnection) url.openConnection(proxy) + : (HttpURLConnection) url.openConnection(); xhr.setRequestMethod(this.method); } catch (IOException e) { this.onError(e); @@ -331,7 +327,7 @@ public class PollingXHR extends Polling { public byte[] data; public SSLContext sslContext; public HostnameVerifier hostnameVerifier; - public HttpConnectionProvider httpConnectionProvider; + public Proxy proxy; } } } diff --git a/src/main/java/io/socket/engineio/client/transports/WebSocket.java b/src/main/java/io/socket/engineio/client/transports/WebSocket.java index e774679..31875fc 100644 --- a/src/main/java/io/socket/engineio/client/transports/WebSocket.java +++ b/src/main/java/io/socket/engineio/client/transports/WebSocket.java @@ -15,8 +15,6 @@ import okio.Buffer; import javax.net.ssl.SSLSocketFactory; import java.io.IOException; -import java.net.InetSocketAddress; -import java.net.Proxy; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -59,8 +57,8 @@ public class WebSocket extends Transport { if (this.hostnameVerifier != null) { clientBuilder.hostnameVerifier(this.hostnameVerifier); } - if (proxyHost != null && !proxyHost.isEmpty() && proxyPort >= 0) { - clientBuilder.proxy(new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyHost, proxyPort))); + if (proxy != null) { + clientBuilder.proxy(proxy); } if (proxyLogin != null && !proxyLogin.isEmpty()) { final String credentials = Credentials.basic(proxyLogin, proxyPassword);