|
|
|
|
@ -8,6 +8,8 @@ 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.zip.Inflater; |
|
|
|
|
import java.util.zip.InflaterInputStream; |
|
|
|
|
|
|
|
|
|
@ -21,22 +23,33 @@ import okio.Okio; |
|
|
|
|
|
|
|
|
|
public class ResponseInterceptor implements Interceptor { |
|
|
|
|
|
|
|
|
|
private final Map<String, String> redirect; |
|
|
|
|
|
|
|
|
|
public ResponseInterceptor() { |
|
|
|
|
this.redirect = new HashMap<>(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@NonNull |
|
|
|
|
@Override |
|
|
|
|
public Response intercept(@NonNull Chain chain) throws IOException { |
|
|
|
|
Response response = chain.proceed(checkUser(chain)); |
|
|
|
|
String encoding = response.header(HttpHeaders.CONTENT_ENCODING); |
|
|
|
|
if ("deflate".equals(encoding)) return deflate(response); |
|
|
|
|
Request request = chain.request(); |
|
|
|
|
Response response = chain.proceed(checkUser(request)); |
|
|
|
|
if ("deflate".equals(response.header(HttpHeaders.CONTENT_ENCODING))) return deflate(response); |
|
|
|
|
if (response.code() == 302) redirect.put(response.header(HttpHeaders.LOCATION), request.url().toString()); |
|
|
|
|
if (response.code() == 406 && redirect.containsKey(request.url().toString())) return redirect(request, response); |
|
|
|
|
return response; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private Request checkUser(Chain chain) { |
|
|
|
|
Request request = chain.request(); |
|
|
|
|
private Request checkUser(Request request) { |
|
|
|
|
URI uri = request.url().uri(); |
|
|
|
|
if (uri.getUserInfo() == null) return request; |
|
|
|
|
return request.newBuilder().header(HttpHeaders.AUTHORIZATION, Util.basic(uri.getUserInfo())).build(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private Response redirect(Request request, Response response) { |
|
|
|
|
return new Response.Builder().request(request).protocol(response.protocol()).code(302).message("Found").header(HttpHeaders.LOCATION, redirect.get(request.url().toString())).build(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private Response deflate(Response response) { |
|
|
|
|
InflaterInputStream is = new InflaterInputStream(response.body().byteStream(), new Inflater(true)); |
|
|
|
|
return response.newBuilder().headers(response.headers()).body(new ResponseBody() { |
|
|
|
|
|