|
|
|
|
@ -3,9 +3,14 @@ package com.github.catvod.net.interceptor; |
|
|
|
|
import androidx.annotation.NonNull; |
|
|
|
|
import androidx.annotation.Nullable; |
|
|
|
|
|
|
|
|
|
import com.github.catvod.utils.Json; |
|
|
|
|
import com.google.common.net.HttpHeaders; |
|
|
|
|
import com.google.gson.JsonElement; |
|
|
|
|
import com.google.gson.JsonObject; |
|
|
|
|
|
|
|
|
|
import java.io.IOException; |
|
|
|
|
import java.util.List; |
|
|
|
|
import java.util.Map; |
|
|
|
|
import java.util.concurrent.ConcurrentHashMap; |
|
|
|
|
import java.util.zip.Inflater; |
|
|
|
|
import java.util.zip.InflaterInputStream; |
|
|
|
|
@ -21,15 +26,29 @@ import okio.Okio; |
|
|
|
|
public class ResponseInterceptor implements Interceptor { |
|
|
|
|
|
|
|
|
|
private final ConcurrentHashMap<String, String> redirectMap; |
|
|
|
|
private final ConcurrentHashMap<String, JsonObject> headerMap; |
|
|
|
|
|
|
|
|
|
public ResponseInterceptor() { |
|
|
|
|
headerMap = new ConcurrentHashMap<>(); |
|
|
|
|
redirectMap = 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()); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public void clear() { |
|
|
|
|
headerMap.clear(); |
|
|
|
|
redirectMap.clear(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@NonNull |
|
|
|
|
@Override |
|
|
|
|
public Response intercept(@NonNull Chain chain) throws IOException { |
|
|
|
|
Request request = chain.request(); |
|
|
|
|
Request request = check(chain.request()); |
|
|
|
|
Response response = chain.proceed(request); |
|
|
|
|
if ("deflate".equals(response.header(HttpHeaders.CONTENT_ENCODING))) return deflate(response); |
|
|
|
|
if (response.code() == 406 && redirectMap.containsKey(request.url().toString())) return redirect(request, response); |
|
|
|
|
@ -37,6 +56,14 @@ public class ResponseInterceptor implements Interceptor { |
|
|
|
|
return response; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private Request check(Request request) { |
|
|
|
|
String host = request.url().host(); |
|
|
|
|
Request.Builder builder = request.newBuilder(); |
|
|
|
|
if (!headerMap.containsKey(host)) return request; |
|
|
|
|
for (Map.Entry<String, JsonElement> entry : headerMap.get(host).entrySet()) builder.header(entry.getKey(), entry.getValue().getAsString()); |
|
|
|
|
return builder.build(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private Response redirect(Request request, Response response) { |
|
|
|
|
return new Response.Builder().request(request).protocol(response.protocol()).code(302).message("Found").header(HttpHeaders.LOCATION, redirectMap.get(request.url().toString())).build(); |
|
|
|
|
} |
|
|
|
|
|