|
|
|
|
@ -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<String, String> authCache; |
|
|
|
|
private final Map<String, String> 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(); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|