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 5d255d1f9..278594120 100644 --- a/catvod/src/main/java/com/github/catvod/net/OkHttp.java +++ b/catvod/src/main/java/com/github/catvod/net/OkHttp.java @@ -41,6 +41,7 @@ public class OkHttp { private ResponseInterceptor responseInterceptor; private RequestInterceptor requestInterceptor; + private AuthInterceptor authInterceptor; private OkProxySelector selector; private OkHttpClient client; private OkDns dns; @@ -63,6 +64,7 @@ public class OkHttp { cancelAll(); dns().clear(); selector().clear(); + authInterceptor().clear(); requestInterceptor().clear(); } @@ -94,6 +96,11 @@ public class OkHttp { return get().requestInterceptor = new RequestInterceptor(); } + public static AuthInterceptor authInterceptor() { + if (get().authInterceptor != null) return get().authInterceptor; + return get().authInterceptor = new AuthInterceptor(); + } + public static OkProxySelector selector() { if (get().selector != null) return get().selector; return get().selector = new OkProxySelector(); @@ -188,7 +195,7 @@ public class OkHttp { } private static OkHttpClient.Builder getBuilder() { - OkHttpClient.Builder builder = new OkHttpClient.Builder().cookieJar(OkCookieJar.get()).addInterceptor(requestInterceptor()).addInterceptor(new AuthInterceptor()).addNetworkInterceptor(responseInterceptor()).connectTimeout(TIMEOUT, TimeUnit.MILLISECONDS).readTimeout(TIMEOUT, TimeUnit.MILLISECONDS).writeTimeout(TIMEOUT, TimeUnit.MILLISECONDS).dns(dns()).hostnameVerifier((hostname, session) -> true).sslSocketFactory(getSSLContext().getSocketFactory(), trustAllCertificates()); + OkHttpClient.Builder builder = new OkHttpClient.Builder().cookieJar(OkCookieJar.get()).addInterceptor(requestInterceptor()).addInterceptor(authInterceptor()).addNetworkInterceptor(responseInterceptor()).connectTimeout(TIMEOUT, TimeUnit.MILLISECONDS).readTimeout(TIMEOUT, TimeUnit.MILLISECONDS).writeTimeout(TIMEOUT, TimeUnit.MILLISECONDS).dns(dns()).hostnameVerifier((hostname, session) -> true).sslSocketFactory(getSSLContext().getSocketFactory(), trustAllCertificates()); HttpLoggingInterceptor logging = new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY); builder.proxySelector(get().proxy ? selector() : defaultSelector); //builder.addNetworkInterceptor(logging); diff --git a/catvod/src/main/java/com/github/catvod/net/interceptor/AuthInterceptor.java b/catvod/src/main/java/com/github/catvod/net/interceptor/AuthInterceptor.java index 5368c910c..cfc8368fa 100644 --- a/catvod/src/main/java/com/github/catvod/net/interceptor/AuthInterceptor.java +++ b/catvod/src/main/java/com/github/catvod/net/interceptor/AuthInterceptor.java @@ -7,6 +7,7 @@ import com.github.catvod.utils.Util; import com.google.common.net.HttpHeaders; import java.io.IOException; +import java.net.URI; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -16,39 +17,40 @@ import okhttp3.Response; public class AuthInterceptor implements Interceptor { - private final Map authCache; + private final Map userMap; public AuthInterceptor() { - authCache = new ConcurrentHashMap<>(); + userMap = new ConcurrentHashMap<>(); + } + + public void clear() { + userMap.clear(); } @NonNull @Override public Response intercept(Chain chain) throws IOException { - Request request = chain.request(); + Request request = check(chain.request()); + Response response = chain.proceed(request); + if (response.code() != 401) return response; String host = request.url().host(); String user = request.url().uri().getUserInfo(); + String header = response.header(HttpHeaders.WWW_AUTHENTICATE); + if (user == null && userMap.containsKey(host)) user = userMap.get(host); + if (user == null) return response; + else response.close(); + String auth = digest(header) ? Util.digest(user, header, request) : Util.basic(user); + return chain.proceed(request.newBuilder().header(HttpHeaders.AUTHORIZATION, auth).build()); + } - if (authCache.containsKey(host)) { - return chain.proceed(request.newBuilder().header(HttpHeaders.AUTHORIZATION, authCache.get(host)).build()); - } + private boolean digest(String header) { + return header != null && header.startsWith("Digest"); + } - Response response = chain.proceed(request); - if (response.code() != 401 || user == null) { - return response; - } - - String authValue; - String authHeader = response.header(HttpHeaders.WWW_AUTHENTICATE); - - if (authHeader != null && authHeader.startsWith("Digest")) { - authValue = Util.digest(authHeader, request); - } else { - authValue = Util.basic(user); - } - - response.close(); - authCache.put(host, authValue); - return chain.proceed(request.newBuilder().header(HttpHeaders.AUTHORIZATION, authValue).build()); + private Request check(Request request) { + URI uri = request.url().uri(); + if (uri.getUserInfo() == null) return request; + userMap.put(request.url().host(), uri.getUserInfo()); + return request.newBuilder().header(HttpHeaders.AUTHORIZATION, Util.basic(uri.getUserInfo())).build(); } } diff --git a/catvod/src/main/java/com/github/catvod/utils/Util.java b/catvod/src/main/java/com/github/catvod/utils/Util.java index 5315a8ed9..a6e5e064c 100644 --- a/catvod/src/main/java/com/github/catvod/utils/Util.java +++ b/catvod/src/main/java/com/github/catvod/utils/Util.java @@ -126,9 +126,8 @@ public class Util { } } - public static String digest(String authHeader, Request request) { - Map params = parse(authHeader.substring(7)); - String userInfo = request.url().uri().getUserInfo(); + public static String digest(String userInfo, String header, Request request) { + Map params = parse(header.substring(7)); String[] parts = userInfo.split(":", 2); String nc = "00000001"; String username = parts[0];