Add headers config

pull/586/head
FongMi 10 months ago
parent eebd09cfd8
commit 11aaaa166a
  1. 5
      app/src/main/java/com/fongmi/android/tv/api/config/LiveConfig.java
  2. 5
      app/src/main/java/com/fongmi/android/tv/api/config/VodConfig.java
  3. 8
      catvod/src/main/java/com/github/catvod/net/OkDns.java
  4. 26
      catvod/src/main/java/com/github/catvod/net/OkHttp.java
  5. 2
      catvod/src/main/java/com/github/catvod/net/OkProxySelector.java
  6. 44
      catvod/src/main/java/com/github/catvod/net/interceptor/RequestInterceptor.java
  7. 7
      catvod/src/main/java/com/github/catvod/net/interceptor/ResponseInterceptor.java

@ -199,6 +199,7 @@ public class LiveConfig {
private void initOther(JsonObject object) {
if (home == null) setHome(lives.isEmpty() ? new Live() : lives.get(0), true);
setRules(Rule.arrayFrom(object.getAsJsonArray("rules")));
setHeaders(Json.safeListElement(object, "headers"));
setHosts(Json.safeListString(object, "hosts"));
setProxy(Json.safeListString(object, "proxy"));
setAds(Json.safeListString(object, "ads"));
@ -268,6 +269,10 @@ public class LiveConfig {
this.rules = rules;
}
public void setHeaders(List<JsonElement> items) {
OkHttp.requestInterceptor().setHeaders(items);
}
public void setHosts(List<String> hosts) {
OkHttp.dns().addAll(hosts);
}

@ -202,6 +202,7 @@ public class VodConfig {
if (parse == null) setParse(parses.isEmpty() ? new Parse() : parses.get(0));
setRules(Rule.arrayFrom(object.getAsJsonArray("rules")));
setDoh(Doh.arrayFrom(object.getAsJsonArray("doh")));
setHeaders(Json.safeListElement(object, "headers"));
setFlags(Json.safeListString(object, "flags"));
setHosts(Json.safeListString(object, "hosts"));
setProxy(Json.safeListString(object, "proxy"));
@ -254,6 +255,10 @@ public class VodConfig {
return items;
}
public void setHeaders(List<JsonElement> items) {
OkHttp.requestInterceptor().setHeaders(items);
}
public List<String> getFlags() {
return flags == null ? Collections.emptyList() : flags;
}

@ -6,26 +6,26 @@ import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
import okhttp3.Dns;
import okhttp3.dnsoverhttps.DnsOverHttps;
public class OkDns implements Dns {
private final HashMap<String, List<InetAddress>> map;
private final ConcurrentHashMap<String, List<InetAddress>> map;
private DnsOverHttps doh;
public OkDns() {
this.map = new HashMap<>();
this.map = new ConcurrentHashMap<>();
}
public void setDoh(DnsOverHttps doh) {
this.doh = doh;
}
public void addAll(List<String> hosts) {
public synchronized void addAll(List<String> hosts) {
for (String host : hosts) {
if (!host.contains("=")) continue;
String[] splits = host.split("=");

@ -38,6 +38,8 @@ public class OkHttp {
private static final int CACHE = 100 * 1024 * 1024;
private static final ProxySelector defaultSelector;
private ResponseInterceptor responseInterceptor;
private RequestInterceptor requestInterceptor;
private OkProxySelector selector;
private OkHttpClient client;
private OkDns dns;
@ -62,11 +64,6 @@ public class OkHttp {
client = null;
}
public static OkDns dns() {
if (get().dns != null) return get().dns;
return get().dns = new OkDns();
}
public void setProxy(String proxy) {
ProxySelector.setDefault(TextUtils.isEmpty(proxy) ? defaultSelector : selector());
if (!TextUtils.isEmpty(proxy)) selector().setProxy(proxy);
@ -74,6 +71,21 @@ public class OkHttp {
client = null;
}
public static OkDns dns() {
if (get().dns != null) return get().dns;
return get().dns = new OkDns();
}
public static ResponseInterceptor responseInterceptor() {
if (get().responseInterceptor != null) return get().responseInterceptor;
return get().responseInterceptor = new ResponseInterceptor();
}
public static RequestInterceptor requestInterceptor() {
if (get().requestInterceptor != null) return get().requestInterceptor;
return get().requestInterceptor = new RequestInterceptor();
}
public static OkProxySelector selector() {
if (get().selector != null) return get().selector;
return get().selector = new OkProxySelector();
@ -152,9 +164,9 @@ public class OkHttp {
private static OkHttpClient.Builder getBuilder() {
HttpLoggingInterceptor logging = new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient.Builder builder = new OkHttpClient.Builder().cookieJar(OkCookieJar.get()).addInterceptor(new RequestInterceptor()).addNetworkInterceptor(new 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()).addNetworkInterceptor(responseInterceptor()).connectTimeout(TIMEOUT, TimeUnit.MILLISECONDS).readTimeout(TIMEOUT, TimeUnit.MILLISECONDS).writeTimeout(TIMEOUT, TimeUnit.MILLISECONDS).dns(dns()).hostnameVerifier((hostname, session) -> true).sslSocketFactory(getSSLContext().getSocketFactory(), trustAllCertificates());
builder.proxySelector(get().proxy ? selector() : defaultSelector);
//builder.addNetworkInterceptor(logging);
builder.addNetworkInterceptor(logging);
return builder;
}

@ -25,7 +25,7 @@ public class OkProxySelector extends ProxySelector {
this.hosts = new ArrayList<>();
}
public void addAll(List<String> hosts) {
public synchronized void addAll(List<String> hosts) {
this.hosts.addAll(hosts);
}

@ -2,14 +2,17 @@ package com.github.catvod.net.interceptor;
import androidx.annotation.NonNull;
import com.github.catvod.Proxy;
import com.github.catvod.net.OkCookieJar;
import com.github.catvod.utils.Json;
import com.github.catvod.utils.Util;
import com.google.common.net.HttpHeaders;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import okhttp3.HttpUrl;
import okhttp3.Interceptor;
@ -18,35 +21,48 @@ import okhttp3.Response;
public class RequestInterceptor implements Interceptor {
private final Map<String, String> userMap;
private final Map<String, String> authMap;
private final ConcurrentHashMap<String, String> userMap;
private final ConcurrentHashMap<String, String> authMap;
private final ConcurrentHashMap<String, JsonObject> headerMap;
public RequestInterceptor() {
this.userMap = new HashMap<>();
this.authMap = new HashMap<>();
this.userMap = new ConcurrentHashMap<>();
this.authMap = new ConcurrentHashMap<>();
this.headerMap = new ConcurrentHashMap<>();
}
public synchronized void setHeaders(List<JsonElement> items) {
for (JsonElement item : items) {
JsonObject object = Json.safeObject(item);
headerMap.put(object.get("host").getAsString(), object.get("header").getAsJsonObject());
}
}
@NonNull
@Override
public Response intercept(@NonNull Chain chain) throws IOException {
Request request = chain.request();
String url = request.url().toString();
OkCookieJar.sync(url, request.header(HttpHeaders.COOKIE));
boolean local = url.contains(":" + Proxy.getPort() + "/");
HttpUrl url = request.url();
Request.Builder builder = request.newBuilder();
if (url.contains("+") && local) builder.url(url.replace("+", "%2B"));
if (url.contains("gitcode.net")) builder.header(HttpHeaders.USER_AGENT, Util.CHROME);
checkAuthUser(request.url(), builder);
checkHeader(url, builder);
checkAuthUser(url, builder);
OkCookieJar.sync(url.toString(), request.header(HttpHeaders.COOKIE));
return chain.proceed(builder.build());
}
private void checkHeader(HttpUrl url, Request.Builder builder) {
if (!headerMap.containsKey(url.host())) return;
for (Map.Entry<String, JsonElement> entry : headerMap.get(url.host()).entrySet()) {
builder.header(entry.getKey(), entry.getValue().getAsString());
}
}
private void checkAuthUser(HttpUrl url, Request.Builder builder) {
String user = url.uri().getUserInfo();
String auth = url.queryParameter("auth");
String query = url.querySize() == 0 ? "?" : "&";
if (user != null) userMap.put(url.host(), user);
if (auth != null) authMap.put(url.host(), auth);
if (authMap.containsKey(url.host()) && auth == null) builder.url(url + query + "auth=" + authMap.get(url.host()));
if (userMap.containsKey(url.host())) builder.header(HttpHeaders.AUTHORIZATION, Util.basic(userMap.get(url.host())));
if (authMap.containsKey(url.host()) && auth == null) builder.url(url.newBuilder().addQueryParameter("auth", authMap.get(url.host())).build());
}
}

@ -8,8 +8,7 @@ import com.google.common.net.HttpHeaders;
import java.io.IOException;
import java.net.URI;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.zip.Inflater;
import java.util.zip.InflaterInputStream;
@ -23,10 +22,10 @@ import okio.Okio;
public class ResponseInterceptor implements Interceptor {
private final Map<String, String> redirect;
private final ConcurrentHashMap<String, String> redirect;
public ResponseInterceptor() {
this.redirect = new HashMap<>();
this.redirect = new ConcurrentHashMap<>();
}
@NonNull

Loading…
Cancel
Save