From 2c364750ef2ca8d217c2be6fbba0d812158a9a06 Mon Sep 17 00:00:00 2001 From: FongMi Date: Sat, 23 Sep 2023 17:13:27 +0800 Subject: [PATCH] Support single proxy - part 4 --- .../java/com/github/catvod/net/OkHttp.java | 63 +++++++++---------- .../com/fongmi/quickjs/utils/Connect.java | 4 +- 2 files changed, 31 insertions(+), 36 deletions(-) diff --git a/catvod/src/main/java/com/github/catvod/net/OkHttp.java b/catvod/src/main/java/com/github/catvod/net/OkHttp.java index b1676e88e..ba8b77751 100644 --- a/catvod/src/main/java/com/github/catvod/net/OkHttp.java +++ b/catvod/src/main/java/com/github/catvod/net/OkHttp.java @@ -37,9 +37,7 @@ public class OkHttp { private DnsOverHttps dns; private OkHttpClient client; - private OkHttpClient noRedirect; private OkHttpClient clientProxy; - private OkHttpClient noRedirectProxy; private static class Loader { static volatile OkHttp INSTANCE = new OkHttp(); @@ -49,60 +47,55 @@ public class OkHttp { return Loader.INSTANCE; } + public static Dns dns() { + return get().dns != null ? get().dns : Dns.SYSTEM; + } + + public static Uri proxy() { + return Uri.parse(Prefers.getString("proxy")); + } + public void setDoh(Doh doh) { OkHttpClient dohClient = new OkHttpClient.Builder().cache(new Cache(Path.doh(), CACHE)).hostnameVerifier(SSLCompat.VERIFIER).sslSocketFactory(new SSLCompat(), SSLCompat.TM).build(); dns = doh.getUrl().isEmpty() ? null : new DnsOverHttps.Builder().client(dohClient).url(HttpUrl.get(doh.getUrl())).bootstrapDnsHosts(doh.getHosts()).build(); - noRedirectProxy = null; clientProxy = null; - noRedirect = null; client = null; } public void setProxy() { Authenticator.setDefault(null); - noRedirectProxy = null; clientProxy = null; } - public static OkHttpClient client(boolean proxy, boolean redirect) { - if (proxy) return redirect ? clientProxy() : noRedirectProxy(); - else return redirect ? client() : noRedirect(); - } - public static OkHttpClient client() { if (get().client != null) return get().client; - return get().client = client(TIMEOUT); - } - - public static OkHttpClient noRedirect() { - if (get().noRedirect != null) return get().noRedirect; - return get().noRedirect = client().newBuilder().followRedirects(false).followSslRedirects(false).build(); + return get().client = getBuilder().build(); } public static OkHttpClient clientProxy() { if (get().clientProxy != null) return get().clientProxy; - return get().clientProxy = clientProxy(TIMEOUT); + return get().clientProxy = getBuilder(proxy()).build(); } - public static OkHttpClient noRedirectProxy() { - if (get().noRedirectProxy != null) return get().noRedirectProxy; - return get().noRedirectProxy = clientProxy().newBuilder().followRedirects(false).followSslRedirects(false).build(); + public static OkHttpClient client(int timeout) { + return client().newBuilder().connectTimeout(timeout, TimeUnit.MILLISECONDS).readTimeout(timeout, TimeUnit.MILLISECONDS).writeTimeout(timeout, TimeUnit.MILLISECONDS).build(); } - public static Dns dns() { - return get().dns != null ? get().dns : Dns.SYSTEM; + public static OkHttpClient clientProxy(int timeout) { + return clientProxy().newBuilder().connectTimeout(timeout, TimeUnit.MILLISECONDS).readTimeout(timeout, TimeUnit.MILLISECONDS).writeTimeout(timeout, TimeUnit.MILLISECONDS).build(); } - public static Uri proxy() { - return Uri.parse(Prefers.getString("proxy")); + public static OkHttpClient noRedirect(int timeout) { + return client().newBuilder().connectTimeout(timeout, TimeUnit.MILLISECONDS).readTimeout(timeout, TimeUnit.MILLISECONDS).writeTimeout(timeout, TimeUnit.MILLISECONDS).followRedirects(false).followSslRedirects(false).build(); } - public static OkHttpClient client(int timeout) { - return new OkHttpClient.Builder().addInterceptor(new DeflateInterceptor()).connectTimeout(timeout, TimeUnit.MILLISECONDS).readTimeout(timeout, TimeUnit.MILLISECONDS).writeTimeout(timeout, TimeUnit.MILLISECONDS).dns(dns()).hostnameVerifier(SSLCompat.VERIFIER).sslSocketFactory(new SSLCompat(), SSLCompat.TM).build(); + public static OkHttpClient noRedirectProxy(int timeout) { + return clientProxy().newBuilder().connectTimeout(timeout, TimeUnit.MILLISECONDS).readTimeout(timeout, TimeUnit.MILLISECONDS).writeTimeout(timeout, TimeUnit.MILLISECONDS).followRedirects(false).followSslRedirects(false).build(); } - public static OkHttpClient clientProxy(int timeout) { - return getProxyBuilder(proxy(), timeout).build(); + public static OkHttpClient client(boolean proxy, boolean redirect, int timeout) { + if (proxy) return redirect ? clientProxy(timeout) : noRedirectProxy(timeout); + else return redirect ? client(timeout) : noRedirect(timeout); } public static Call newCall(String url) { @@ -147,13 +140,17 @@ public class OkHttp { return builder.build(); } - private static OkHttpClient.Builder getProxyBuilder(Uri uri, int timeout) { + private static OkHttpClient.Builder getBuilder() { + return new OkHttpClient.Builder().addInterceptor(new DeflateInterceptor()).connectTimeout(TIMEOUT, TimeUnit.MILLISECONDS).readTimeout(TIMEOUT, TimeUnit.MILLISECONDS).writeTimeout(TIMEOUT, TimeUnit.MILLISECONDS).dns(dns()).hostnameVerifier(SSLCompat.VERIFIER).sslSocketFactory(new SSLCompat(), SSLCompat.TM); + } + + private static OkHttpClient.Builder getBuilder(Uri uri) { String userInfo = uri.getUserInfo(); - OkHttpClient.Builder builder = client(timeout).newBuilder(); + OkHttpClient.Builder builder = client().newBuilder(); if (userInfo != null && userInfo.contains(":")) setAuthenticator(builder, userInfo); - if (uri.getScheme() != null && uri.getHost() != null && uri.getPort() > 0) return builder; - if (Util.scheme(uri).startsWith("http")) builder.proxy(new Proxy(Proxy.Type.HTTP, InetSocketAddress.createUnresolved(uri.getHost(), uri.getPort()))); - if (Util.scheme(uri).startsWith("socks")) builder.proxy(new Proxy(Proxy.Type.SOCKS, InetSocketAddress.createUnresolved(uri.getHost(), uri.getPort()))); + if (uri.getScheme() == null || uri.getHost() == null || uri.getPort() <= 0) return builder; + if (uri.getScheme().startsWith("http")) builder.proxy(new Proxy(Proxy.Type.HTTP, InetSocketAddress.createUnresolved(uri.getHost(), uri.getPort()))); + if (uri.getScheme().startsWith("socks")) builder.proxy(new Proxy(Proxy.Type.SOCKS, InetSocketAddress.createUnresolved(uri.getHost(), uri.getPort()))); return builder; } diff --git a/quickjs/src/main/java/com/fongmi/quickjs/utils/Connect.java b/quickjs/src/main/java/com/fongmi/quickjs/utils/Connect.java index 2f21b94f6..bf640151c 100644 --- a/quickjs/src/main/java/com/fongmi/quickjs/utils/Connect.java +++ b/quickjs/src/main/java/com/fongmi/quickjs/utils/Connect.java @@ -10,7 +10,6 @@ import com.whl.quickjs.wrapper.QuickJSContext; import java.util.List; import java.util.Map; -import java.util.concurrent.TimeUnit; import okhttp3.Call; import okhttp3.FormBody; @@ -24,8 +23,7 @@ import okhttp3.Response; public class Connect { public static Call to(String url, Req req, boolean proxy) { - OkHttpClient client = OkHttp.client(proxy, req.isRedirect()); - client = client.newBuilder().connectTimeout(req.getTimeout(), TimeUnit.MILLISECONDS).readTimeout(req.getTimeout(), TimeUnit.MILLISECONDS).writeTimeout(req.getTimeout(), TimeUnit.MILLISECONDS).build(); + OkHttpClient client = OkHttp.client(proxy, req.isRedirect(), req.getTimeout()); return client.newCall(getRequest(url, req, Headers.of(req.getHeader()))); }