带阿里标识的版本
This commit is contained in:
@@ -102,27 +102,18 @@ ext.getIntlVersion = { version ->
|
||||
}
|
||||
}
|
||||
|
||||
afterEvaluate {
|
||||
publishing {
|
||||
publications {
|
||||
mavenReleaseAar(MavenPublication) {
|
||||
from components.normalRelease
|
||||
groupId 'com.aliyun.ams'
|
||||
artifactId 'alicloud-android-httpdns'
|
||||
version "$project.android.defaultConfig.versionName"
|
||||
}
|
||||
mavenIntlReleaseAar(MavenPublication) {
|
||||
from components.intlRelease
|
||||
groupId 'com.aliyun.ams'
|
||||
artifactId 'alicloud-android-httpdns'
|
||||
version getIntlVersion(project.android.defaultConfig.versionName)
|
||||
}
|
||||
}
|
||||
repositories {
|
||||
if (project.android.defaultConfig.versionName.endsWith("-local-SNAPSHOT")) {
|
||||
// only maven local
|
||||
} else if (project.android.defaultConfig.versionName.endsWith("-SNAPSHOT")) {
|
||||
|
||||
task copyDependencies {
|
||||
doLast {
|
||||
def config = configurations.findByName("normalReleaseRuntimeClasspath")
|
||||
if (config != null) {
|
||||
config.resolvedConfiguration.resolvedArtifacts.each { artifact ->
|
||||
def file = artifact.file
|
||||
if (file.name.contains("alicloud-android")) {
|
||||
copy {
|
||||
from file
|
||||
into 'build/outputs/dependencies'
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -58,6 +58,8 @@
|
||||
public <fields>;
|
||||
}
|
||||
|
||||
-keep class com.alibaba.sdk.android.httpdns.network.**{*;}
|
||||
|
||||
-keep interface com.alibaba.sdk.android.httpdns.HttpDnsSettings$NetworkChecker{*;}
|
||||
-keep interface com.alibaba.sdk.android.httpdns.HttpDnsSettings$NetworkDetector{*;}
|
||||
-keep class com.alibaba.sdk.android.httpdns.utils.CommonUtil{
|
||||
|
||||
@@ -12,7 +12,7 @@ import java.util.concurrent.ScheduledExecutorService;
|
||||
public interface ApiForTest {
|
||||
|
||||
/**
|
||||
* 指定初始服务ip
|
||||
* 鎸囧畾鍒濆鏈嶅姟ip
|
||||
* @param region
|
||||
* @param ips
|
||||
* @param ports
|
||||
@@ -22,38 +22,38 @@ public interface ApiForTest {
|
||||
void setInitServer(String region, String[] ips, int[] ports, String[] ipv6s, int[] v6Ports);
|
||||
|
||||
/**
|
||||
* 指定httpdns使用的线程池
|
||||
* 鎸囧畾httpdns浣跨敤鐨勭嚎绋嬫睜
|
||||
* @param scheduledExecutorService
|
||||
*/
|
||||
void setThread(ScheduledExecutorService scheduledExecutorService);
|
||||
|
||||
/**
|
||||
* 指定 测试使用的socket factory
|
||||
* 鎸囧畾 娴嬭瘯浣跨敤鐨剆ocket factory
|
||||
* @param speedTestSocketFactory
|
||||
*/
|
||||
void setSocketFactory(IPRankingTask.SpeedTestSocketFactory speedTestSocketFactory);
|
||||
|
||||
/**
|
||||
* 指定调度接口的调用间歇,避免正常的间歇过长无法测试
|
||||
* 鎸囧畾璋冨害鎺ュ彛鐨勮皟鐢ㄩ棿姝囷紝閬垮厤姝e父鐨勯棿姝囪繃闀挎棤娉曟祴璇?
|
||||
* @param timeInterval
|
||||
*/
|
||||
void setUpdateServerTimeInterval(int timeInterval);
|
||||
|
||||
/**
|
||||
* 指定 sniff模式的 请求间歇
|
||||
* 鎸囧畾 sniff妯″紡鐨?璇锋眰闂存瓏
|
||||
* @param timeInterval
|
||||
*/
|
||||
void setSniffTimeInterval(int timeInterval);
|
||||
|
||||
/**
|
||||
* 获取httpdns的线程池用于控制异常操作
|
||||
* 鑾峰彇httpdns鐨勭嚎绋嬫睜鐢ㄤ簬鎺у埗寮傚父鎿嶄綔
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
ExecutorService getWorker();
|
||||
|
||||
/**
|
||||
* 设置兜底的调度ip
|
||||
* 璁剧疆鍏滃簳鐨勮皟搴p
|
||||
*
|
||||
* @param defaultServerIps
|
||||
* @param ports
|
||||
@@ -61,7 +61,7 @@ public interface ApiForTest {
|
||||
void setDefaultUpdateServer(String[] defaultServerIps, int[] ports);
|
||||
|
||||
/**
|
||||
* 设置ipv6的兜底调度IP
|
||||
* 璁剧疆ipv6鐨勫厹搴曡皟搴P
|
||||
*
|
||||
* @param defaultServerIps
|
||||
* @param ports
|
||||
@@ -69,9 +69,10 @@ public interface ApiForTest {
|
||||
void setDefaultUpdateServerIpv6(String[] defaultServerIps, int[] ports);
|
||||
|
||||
/**
|
||||
* 设置测试用的网络detector
|
||||
* 璁剧疆娴嬭瘯鐢ㄧ殑缃戠粶detector
|
||||
*
|
||||
* @param networkDetector
|
||||
*/
|
||||
void setNetworkDetector(HttpDnsSettings.NetworkDetector networkDetector);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package com.alibaba.sdk.android.httpdns;
|
||||
|
||||
/**
|
||||
* 测试用的初始化接口
|
||||
* 娴嬭瘯鐢ㄧ殑鍒濆鍖栨帴鍙?
|
||||
* @author zonglin.nzl
|
||||
* @date 1/14/22
|
||||
*/
|
||||
@@ -9,3 +9,4 @@ public interface BeforeHttpDnsServiceInit {
|
||||
|
||||
void beforeInit(HttpDnsService service);
|
||||
}
|
||||
|
||||
|
||||
@@ -10,17 +10,17 @@ import com.alibaba.sdk.android.httpdns.network.HttpDnsHttpAdapter;
|
||||
import com.alibaba.sdk.android.httpdns.utils.CommonUtil;
|
||||
|
||||
/**
|
||||
* Httpdns实例管理
|
||||
* Httpdns瀹炰緥绠$悊
|
||||
*/
|
||||
public class HttpDns {
|
||||
|
||||
private static HttpDnsInstanceHolder sHolder = new HttpDnsInstanceHolder(new InstanceCreator());
|
||||
|
||||
/**
|
||||
* 获取HttpDnsService对象
|
||||
* 鑾峰彇HttpDnsService瀵硅薄
|
||||
*
|
||||
* @param applicationContext 当前APP的Context
|
||||
* @param accountID HttpDns控制台分配的AccountID
|
||||
* @param applicationContext 褰撳墠APP鐨凜ontext
|
||||
* @param accountID HttpDns鎺у埗鍙板垎閰嶇殑AccountID
|
||||
* @return
|
||||
*/
|
||||
public synchronized static HttpDnsService getService(final Context applicationContext, final String accountID) {
|
||||
@@ -28,11 +28,11 @@ public class HttpDns {
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取HttpDnsService对象,并启用鉴权功能
|
||||
* 鑾峰彇HttpDnsService瀵硅薄锛屽苟鍚敤閴存潈鍔熻兘
|
||||
*
|
||||
* @param applicationContext 当前APP的Context
|
||||
* @param accountID HttpDns控制台分配的AccountID
|
||||
* @param secretKey 用户鉴权私钥
|
||||
* @param applicationContext 褰撳墠APP鐨凜ontext
|
||||
* @param accountID HttpDns鎺у埗鍙板垎閰嶇殑AccountID
|
||||
* @param secretKey 鐢ㄦ埛閴存潈绉侀挜
|
||||
* @return
|
||||
*/
|
||||
public synchronized static HttpDnsService getService(final Context applicationContext, final String accountID, final String secretKey) {
|
||||
@@ -40,9 +40,9 @@ public class HttpDns {
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取HttpDnsService对象,初始化时不传入任何参数,靠统一接入服务获取相关参数
|
||||
* 鑾峰彇HttpDnsService瀵硅薄锛屽垵濮嬪寲鏃朵笉浼犲叆浠讳綍鍙傛暟锛岄潬缁熶竴鎺ュ叆鏈嶅姟鑾峰彇鐩稿叧鍙傛暟
|
||||
*
|
||||
* @param applicationContext 当前APP的Context
|
||||
* @param applicationContext 褰撳墠APP鐨凜ontext
|
||||
* @return
|
||||
*/
|
||||
public synchronized static HttpDnsService getService(final Context applicationContext) {
|
||||
@@ -50,11 +50,11 @@ public class HttpDns {
|
||||
}
|
||||
|
||||
/**
|
||||
* 启用或者禁用httpdns,理论上这个是内部接口,不给外部使用的
|
||||
* 但是已经对外暴露,所以保留
|
||||
* 鍚敤鎴栬€呯鐢╤ttpdns锛岀悊璁轰笂杩欎釜鏄唴閮ㄦ帴鍙o紝涓嶇粰澶栭儴浣跨敤鐨?
|
||||
* 浣嗘槸宸茬粡瀵瑰鏆撮湶锛屾墍浠ヤ繚鐣?
|
||||
*
|
||||
* @param enabled
|
||||
* @deprecated 启用禁用应该调用实例的方法,而不是控制全部实例的方法
|
||||
* @deprecated 鍚敤绂佺敤搴旇璋冪敤瀹炰緥鐨勬柟娉曪紝鑰屼笉鏄帶鍒跺叏閮ㄥ疄渚嬬殑鏂规硶
|
||||
*/
|
||||
@Deprecated
|
||||
public synchronized static void switchDnsService(boolean enabled) {
|
||||
@@ -62,7 +62,7 @@ public class HttpDns {
|
||||
}
|
||||
|
||||
/**
|
||||
* 重置httpdns,用于一些模拟应用重启的场景
|
||||
* 閲嶇疆httpdns锛岀敤浜庝竴浜涙ā鎷熷簲鐢ㄩ噸鍚殑鍦烘櫙
|
||||
*/
|
||||
public static void resetInstance() {
|
||||
sHolder = new HttpDnsInstanceHolder(new InstanceCreator());
|
||||
@@ -83,3 +83,4 @@ public class HttpDns {
|
||||
return new HttpDnsHttpAdapter(service, options);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -3,8 +3,8 @@ package com.alibaba.sdk.android.httpdns;
|
||||
import java.util.HashMap;
|
||||
|
||||
/**
|
||||
* 增加初始化逻辑的单例
|
||||
* 用于在测试用的httpdns实例中增加测试需要的初始化逻辑
|
||||
* 澧炲姞鍒濆鍖栭€昏緫鐨勫崟渚?
|
||||
* 鐢ㄤ簬鍦ㄦ祴璇曠敤鐨刪ttpdns瀹炰緥涓鍔犳祴璇曢渶瑕佺殑鍒濆鍖栭€昏緫
|
||||
* @author zonglin.nzl
|
||||
* @date 1/14/22
|
||||
*/
|
||||
@@ -32,3 +32,4 @@ public class InitManager {
|
||||
return initThings.remove(accountId);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -12,8 +12,8 @@ import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.ScheduledExecutorService;
|
||||
|
||||
/**
|
||||
* 测试时 使用的httpdns 实例
|
||||
* 增加了一些用于测试的api和机制
|
||||
* 娴嬭瘯鏃?浣跨敤鐨刪ttpdns 瀹炰緥
|
||||
* 澧炲姞浜嗕竴浜涚敤浜庢祴璇曠殑api鍜屾満鍒?
|
||||
* @author zonglin.nzl
|
||||
* @date 2020/10/16
|
||||
*/
|
||||
@@ -25,7 +25,7 @@ public class HttpDnsServiceTestImpl extends HttpDnsServiceImpl implements ApiFor
|
||||
@Override
|
||||
protected void beforeInit() {
|
||||
super.beforeInit();
|
||||
// 通过InitManager 在httpdns初始化之前 进行一些测试需要前置工作
|
||||
// 閫氳繃InitManager 鍦╤ttpdns鍒濆鍖栦箣鍓?杩涜涓€浜涙祴璇曢渶瑕佸墠缃伐浣?
|
||||
BeforeHttpDnsServiceInit init = InitManager.getInstance().getAndRemove(mHttpDnsConfig.getAccountId());
|
||||
|
||||
if (init != null) {
|
||||
@@ -84,3 +84,4 @@ public class HttpDnsServiceTestImpl extends HttpDnsServiceImpl implements ApiFor
|
||||
mHttpDnsConfig.setNetworkDetector(networkDetector);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@ import android.content.Context;
|
||||
import com.alibaba.sdk.android.httpdns.HttpDnsService;
|
||||
|
||||
/**
|
||||
* 改为使用测试实例
|
||||
* 鏀逛负浣跨敤娴嬭瘯瀹炰緥
|
||||
* @author zonglin.nzl
|
||||
* @date 2020/12/4
|
||||
*/
|
||||
@@ -15,3 +15,4 @@ public class InstanceCreator implements HttpDnsCreator {
|
||||
return new HttpDnsServiceTestImpl(context.getApplicationContext(), accountId, secretKey);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -9,7 +9,7 @@ import com.alibaba.sdk.android.httpdns.utils.CommonUtil;
|
||||
import android.content.Context;
|
||||
|
||||
/**
|
||||
* Httpdns实例管理
|
||||
* Httpdns瀹炰緥绠$悊
|
||||
*/
|
||||
public class HttpDns {
|
||||
|
||||
@@ -17,8 +17,8 @@ public class HttpDns {
|
||||
new InstanceCreator());
|
||||
|
||||
/**
|
||||
* 获取HttpDnsService对象
|
||||
* @param accountId HttpDns控制台分配的AccountID
|
||||
* 鑾峰彇HttpDnsService瀵硅薄
|
||||
* @param accountId HttpDns鎺у埗鍙板垎閰嶇殑AccountID
|
||||
* @return
|
||||
*/
|
||||
public synchronized static HttpDnsService getService(final String accountId) {
|
||||
@@ -26,10 +26,10 @@ public class HttpDns {
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取HttpDnsService对象
|
||||
* 该方法已弃用,建议使用{@link HttpDns#getService(String)}方法
|
||||
* @param applicationContext 当前APP的Context
|
||||
* @param accountID HttpDns控制台分配的AccountID
|
||||
* 鑾峰彇HttpDnsService瀵硅薄
|
||||
* 璇ユ柟娉曞凡寮冪敤锛屽缓璁娇鐢▄@link HttpDns#getService(String)}鏂规硶
|
||||
* @param applicationContext 褰撳墠APP鐨凜ontext
|
||||
* @param accountID HttpDns鎺у埗鍙板垎閰嶇殑AccountID
|
||||
* @return
|
||||
*/
|
||||
@Deprecated
|
||||
@@ -39,11 +39,11 @@ public class HttpDns {
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取HttpDnsService对象,并启用鉴权功能
|
||||
* 该方法已弃用,建议使用{@link HttpDns#getService(String)}方法
|
||||
* @param applicationContext 当前APP的Context
|
||||
* @param accountID HttpDns控制台分配的AccountID
|
||||
* @param secretKey 用户鉴权私钥
|
||||
* 鑾峰彇HttpDnsService瀵硅薄锛屽苟鍚敤閴存潈鍔熻兘
|
||||
* 璇ユ柟娉曞凡寮冪敤锛屽缓璁娇鐢▄@link HttpDns#getService(String)}鏂规硶
|
||||
* @param applicationContext 褰撳墠APP鐨凜ontext
|
||||
* @param accountID HttpDns鎺у埗鍙板垎閰嶇殑AccountID
|
||||
* @param secretKey 鐢ㄦ埛閴存潈绉侀挜
|
||||
* @return
|
||||
*/
|
||||
@Deprecated
|
||||
@@ -54,9 +54,9 @@ public class HttpDns {
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取HttpDnsService对象,初始化时不传入任何参数,靠统一接入服务获取相关参数
|
||||
* 该方法已弃用,建议使用{@link HttpDns#getService(String)}方法
|
||||
* @param applicationContext 当前APP的Context
|
||||
* 鑾峰彇HttpDnsService瀵硅薄锛屽垵濮嬪寲鏃朵笉浼犲叆浠讳綍鍙傛暟锛岄潬缁熶竴鎺ュ叆鏈嶅姟鑾峰彇鐩稿叧鍙傛暟
|
||||
* 璇ユ柟娉曞凡寮冪敤锛屽缓璁娇鐢▄@link HttpDns#getService(String)}鏂规硶
|
||||
* @param applicationContext 褰撳墠APP鐨凜ontext
|
||||
* @return
|
||||
*/
|
||||
@Deprecated
|
||||
@@ -66,9 +66,9 @@ public class HttpDns {
|
||||
}
|
||||
|
||||
/**
|
||||
* 初始化方法,该方法主要是保存{@link InitConfig},不会真正进行初始化。真正初始化是在{@link HttpDns#getService(Context, String, String)}中
|
||||
* 这么实现主要是为了兼容{@link InitConfig.Builder#buildFor(String)}方法,新客户使用该方法和旧的方法功能一致
|
||||
* @param accountId HttpDns控制台分配的AccountID
|
||||
* 鍒濆鍖栨柟娉曪紝璇ユ柟娉曚富瑕佹槸淇濆瓨{@link InitConfig}锛屼笉浼氱湡姝h繘琛屽垵濮嬪寲銆傜湡姝e垵濮嬪寲鏄湪{@link HttpDns#getService(Context, String, String)}涓?
|
||||
* 杩欎箞瀹炵幇涓昏鏄负浜嗗吋瀹箋@link InitConfig.Builder#buildFor(String)}鏂规硶锛屾柊瀹㈡埛浣跨敤璇ユ柟娉曞拰鏃х殑鏂规硶鍔熻兘涓€鑷?
|
||||
* @param accountId HttpDns鎺у埗鍙板垎閰嶇殑AccountID
|
||||
* @param config {@link InitConfig}
|
||||
*/
|
||||
public static void init(String accountId, InitConfig config) {
|
||||
@@ -90,14 +90,15 @@ public class HttpDns {
|
||||
}
|
||||
|
||||
/**
|
||||
* 启用或者禁用httpdns,理论上这个是内部接口,不给外部使用的
|
||||
* 但是已经对外暴露,所以保留
|
||||
* 鍚敤鎴栬€呯鐢╤ttpdns锛岀悊璁轰笂杩欎釜鏄唴閮ㄦ帴鍙o紝涓嶇粰澶栭儴浣跨敤鐨?
|
||||
* 浣嗘槸宸茬粡瀵瑰鏆撮湶锛屾墍浠ヤ繚鐣?
|
||||
*
|
||||
* @param enabled
|
||||
* @deprecated 启用禁用应该调用实例的方法,而不是控制全部实例的方法
|
||||
* @deprecated 鍚敤绂佺敤搴旇璋冪敤瀹炰緥鐨勬柟娉曪紝鑰屼笉鏄帶鍒跺叏閮ㄥ疄渚嬬殑鏂规硶
|
||||
*/
|
||||
@Deprecated
|
||||
public synchronized static void switchDnsService(boolean enabled) {
|
||||
// do nothing as deprecated
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -10,3 +10,4 @@ public class InstanceCreator implements HttpDnsCreator {
|
||||
return new IntlImpl(context, accountId, secretKey);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -7,3 +7,4 @@ public class IntlImpl extends HttpDnsServiceImpl {
|
||||
super(context, accountId, secret);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,18 +1,19 @@
|
||||
package com.alibaba.sdk.android.httpdns;
|
||||
|
||||
/**
|
||||
* 修改ttl时长的接口
|
||||
* 用于用户定制ttl,以控制缓存的时长
|
||||
* 淇敼ttl鏃堕暱鐨勬帴鍙?
|
||||
* 鐢ㄤ簬鐢ㄦ埛瀹氬埗ttl锛屼互鎺у埗缂撳瓨鐨勬椂闀?
|
||||
*/
|
||||
public interface CacheTtlChanger {
|
||||
|
||||
/**
|
||||
* 根据 域名 ip类型 和 服务的ttl 返回 定制的ttl
|
||||
* 鏍规嵁 鍩熷悕 ip绫诲瀷 鍜?鏈嶅姟鐨則tl 杩斿洖 瀹氬埗鐨則tl
|
||||
*
|
||||
* @param host 域名
|
||||
* @param type ip类型
|
||||
* @param ttl 服务下发的ttl 单位秒
|
||||
* @return 定制的ttl 单位秒
|
||||
* @param host 鍩熷悕
|
||||
* @param type ip绫诲瀷
|
||||
* @param ttl 鏈嶅姟涓嬪彂鐨則tl 鍗曚綅绉?
|
||||
* @return 瀹氬埗鐨則tl 鍗曚綅绉?
|
||||
*/
|
||||
int changeCacheTtl(String host, RequestIpType type, int ttl);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,13 +1,14 @@
|
||||
package com.alibaba.sdk.android.httpdns;
|
||||
|
||||
/**
|
||||
* 降级判断开关接口
|
||||
* 闄嶇骇鍒ゆ柇寮€鍏虫帴鍙?
|
||||
*/
|
||||
@Deprecated
|
||||
public interface DegradationFilter {
|
||||
/**
|
||||
* 是否应该不使用httpdns
|
||||
* 鏄惁搴旇涓嶄娇鐢╤ttpdns
|
||||
*
|
||||
*/
|
||||
boolean shouldDegradeHttpDNS(String hostName);
|
||||
}
|
||||
|
||||
|
||||
@@ -9,7 +9,7 @@ import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* sdns的解析结果
|
||||
* sdns鐨勮В鏋愮粨鏋?
|
||||
*/
|
||||
public class HTTPDNSResult {
|
||||
String host;
|
||||
@@ -148,3 +148,4 @@ public class HTTPDNSResult {
|
||||
return fromLocalDns;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@ import com.alibaba.sdk.android.httpdns.cache.HostRecord;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 对解析结果进行封装,用于可观测数据的一些解析数据携带,不对外透出
|
||||
* 瀵硅В鏋愮粨鏋滆繘琛屽皝瑁咃紝鐢ㄤ簬鍙娴嬫暟鎹殑涓€浜涜В鏋愭暟鎹惡甯︼紝涓嶅澶栭€忓嚭
|
||||
*/
|
||||
public class HTTPDNSResultWrapper {
|
||||
private final HTTPDNSResult mHTTPDNSResult;
|
||||
@@ -59,3 +59,4 @@ public class HTTPDNSResultWrapper {
|
||||
return mHTTPDNSResult.toString();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -3,3 +3,4 @@ package com.alibaba.sdk.android.httpdns;
|
||||
public interface HttpDnsCallback {
|
||||
void onHttpDnsCompleted(HTTPDNSResult result);
|
||||
}
|
||||
|
||||
|
||||
@@ -5,173 +5,173 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* HttpDns服务接口
|
||||
* HttpDns鏈嶅姟鎺ュ彛
|
||||
*/
|
||||
public interface HttpDnsService {
|
||||
/**
|
||||
* 设置预解析域名列表,默认解析ipv4
|
||||
* 璁剧疆棰勮В鏋愬煙鍚嶅垪琛紝榛樿瑙f瀽ipv4
|
||||
*
|
||||
* @param hostList 预解析的host域名列表
|
||||
* @param hostList 棰勮В鏋愮殑host鍩熷悕鍒楄〃
|
||||
*/
|
||||
void setPreResolveHosts(List<String> hostList);
|
||||
|
||||
/**
|
||||
* 设置预解析域名列表和解析的ip类型
|
||||
* 璁剧疆棰勮В鏋愬煙鍚嶅垪琛ㄥ拰瑙f瀽鐨刬p绫诲瀷
|
||||
*
|
||||
* @param hostList 预解析的host列表
|
||||
* @param requestIpType {@link RequestIpType} 网络栈类型,v4,v6,both,auto(根据当前设备所连的网络自动判断网络栈)
|
||||
* @param hostList 棰勮В鏋愮殑host鍒楄〃
|
||||
* @param requestIpType {@link RequestIpType} 缃戠粶鏍堢被鍨嬶紝v4,v6,both,auto(鏍规嵁褰撳墠璁惧鎵€杩炵殑缃戠粶鑷姩鍒ゆ柇缃戠粶鏍?
|
||||
*/
|
||||
void setPreResolveHosts(List<String> hostList, RequestIpType requestIpType);
|
||||
|
||||
/**
|
||||
* 异步解析接口, 首先查询缓存, 若存在则返回结果, 若不存在返回null 并且进行异步域名解析请求
|
||||
* 寮傛瑙f瀽鎺ュ彛, 棣栧厛鏌ヨ缂撳瓨, 鑻ュ瓨鍦ㄥ垯杩斿洖缁撴灉, 鑻ヤ笉瀛樺湪杩斿洖null 骞朵笖杩涜寮傛鍩熷悕瑙f瀽璇锋眰
|
||||
*
|
||||
* @param host 如www.aliyun.com
|
||||
* @return 返回ip, 如果没得到解析结果, 则返回null
|
||||
* @deprecated 该接口已废弃,后续版本可能会被删除,请使用{@link #getIPv4ForHostAsync(String)}
|
||||
* @param host 濡倃ww.aliyun.com
|
||||
* @return 杩斿洖ip, 濡傛灉娌″緱鍒拌В鏋愮粨鏋? 鍒欒繑鍥瀗ull
|
||||
* @deprecated 璇ユ帴鍙e凡搴熷純锛屽悗缁増鏈彲鑳戒細琚垹闄わ紝璇蜂娇鐢▄@link #getIPv4ForHostAsync(String)}
|
||||
*/
|
||||
@Deprecated
|
||||
String getIpByHostAsync(String host);
|
||||
|
||||
/**
|
||||
* 异步解析接口,只查询v4地址,首先查询缓存, 若存在则返回结果, 若不存在返回null 并且进行异步域名解析请求
|
||||
* 寮傛瑙f瀽鎺ュ彛锛屽彧鏌ヨv4鍦板潃锛岄鍏堟煡璇㈢紦瀛? 鑻ュ瓨鍦ㄥ垯杩斿洖缁撴灉, 鑻ヤ笉瀛樺湪杩斿洖null 骞朵笖杩涜寮傛鍩熷悕瑙f瀽璇锋眰
|
||||
*
|
||||
* @param host 要解析的host域名
|
||||
* @return 返回v4地址
|
||||
* @param host 瑕佽В鏋愮殑host鍩熷悕
|
||||
* @return 杩斿洖v4鍦板潃
|
||||
*/
|
||||
@Deprecated
|
||||
String getIPv4ForHostAsync(String host);
|
||||
|
||||
/**
|
||||
* 异步解析接口, 获取ipv4列表
|
||||
* 寮傛瑙f瀽鎺ュ彛, 鑾峰彇ipv4鍒楄〃
|
||||
*
|
||||
* @param host 要解析的host域名
|
||||
* @return 返回v4地址的String 数组, 如果没得到解析结果, 则String 数组的长度为0
|
||||
* @deprecated 该接口已废弃,后续版本可能会被删除,请使用{@link #getIPv4ListForHostAsync(String)}
|
||||
* @param host 瑕佽В鏋愮殑host鍩熷悕
|
||||
* @return 杩斿洖v4鍦板潃鐨凷tring 鏁扮粍, 濡傛灉娌″緱鍒拌В鏋愮粨鏋? 鍒橲tring 鏁扮粍鐨勯暱搴︿负0
|
||||
* @deprecated 璇ユ帴鍙e凡搴熷純锛屽悗缁増鏈彲鑳戒細琚垹闄わ紝璇蜂娇鐢▄@link #getIPv4ListForHostAsync(String)}
|
||||
*/
|
||||
@Deprecated
|
||||
String[] getIpsByHostAsync(String host);
|
||||
|
||||
/**
|
||||
* 异步解析接口, 获取ipv4列表
|
||||
* 寮傛瑙f瀽鎺ュ彛, 鑾峰彇ipv4鍒楄〃
|
||||
*
|
||||
* @param host 要解析的host域名
|
||||
* @return 返回v4地址列表
|
||||
* @param host 瑕佽В鏋愮殑host鍩熷悕
|
||||
* @return 杩斿洖v4鍦板潃鍒楄〃
|
||||
*/
|
||||
@Deprecated
|
||||
String[] getIPv4ListForHostAsync(String host);
|
||||
|
||||
/**
|
||||
* 异步解析接口,获取单个ipv6, 首先查询缓存, 若存在则返回结果, 若不存在返回null 并且进行异步域名解析请求
|
||||
* 寮傛瑙f瀽鎺ュ彛锛岃幏鍙栧崟涓猧pv6, 棣栧厛鏌ヨ缂撳瓨, 鑻ュ瓨鍦ㄥ垯杩斿洖缁撴灉, 鑻ヤ笉瀛樺湪杩斿洖null 骞朵笖杩涜寮傛鍩熷悕瑙f瀽璇锋眰
|
||||
*
|
||||
* @param host 要解析的host域名
|
||||
* @return 返回v6地址
|
||||
* @deprecated 该接口已废弃,后续版本可能会被删除,请使用{@link #getIPv6ForHostAsync(String)}
|
||||
* @param host 瑕佽В鏋愮殑host鍩熷悕
|
||||
* @return 杩斿洖v6鍦板潃
|
||||
* @deprecated 璇ユ帴鍙e凡搴熷純锛屽悗缁増鏈彲鑳戒細琚垹闄わ紝璇蜂娇鐢▄@link #getIPv6ForHostAsync(String)}
|
||||
*/
|
||||
@Deprecated
|
||||
String getIPv6ByHostAsync(String host);
|
||||
|
||||
/**
|
||||
* 异步解析接口,获取单个ipv6, 首先查询缓存, 若存在则返回结果, 若不存在返回null 并且进行异步域名解析请求
|
||||
* 寮傛瑙f瀽鎺ュ彛锛岃幏鍙栧崟涓猧pv6, 棣栧厛鏌ヨ缂撳瓨, 鑻ュ瓨鍦ㄥ垯杩斿洖缁撴灉, 鑻ヤ笉瀛樺湪杩斿洖null 骞朵笖杩涜寮傛鍩熷悕瑙f瀽璇锋眰
|
||||
*
|
||||
* @param host 要解析的host域名
|
||||
* @return 返回v6地址
|
||||
* @param host 瑕佽В鏋愮殑host鍩熷悕
|
||||
* @return 杩斿洖v6鍦板潃
|
||||
*/
|
||||
@Deprecated
|
||||
String getIPv6ForHostAsync(String host);
|
||||
|
||||
/**
|
||||
* 异步解析接口,获取ipv6列表, 首先查询缓存, 若存在则返回结果, 若不存在返回null 并且进行异步域名解析请求
|
||||
* 寮傛瑙f瀽鎺ュ彛锛岃幏鍙杋pv6鍒楄〃, 棣栧厛鏌ヨ缂撳瓨, 鑻ュ瓨鍦ㄥ垯杩斿洖缁撴灉, 鑻ヤ笉瀛樺湪杩斿洖null 骞朵笖杩涜寮傛鍩熷悕瑙f瀽璇锋眰
|
||||
*
|
||||
* @param host 要解析的host域名
|
||||
* @return 返回v6地址的String 数组, 如果没得到解析结果, 则String 数组的长度为0
|
||||
* @deprecated 该接口已废弃,后续版本可能会被删除,请使用{@link #getIPv6ListForHostASync(String)}
|
||||
* @param host 瑕佽В鏋愮殑host鍩熷悕
|
||||
* @return 杩斿洖v6鍦板潃鐨凷tring 鏁扮粍, 濡傛灉娌″緱鍒拌В鏋愮粨鏋? 鍒橲tring 鏁扮粍鐨勯暱搴︿负0
|
||||
* @deprecated 璇ユ帴鍙e凡搴熷純锛屽悗缁増鏈彲鑳戒細琚垹闄わ紝璇蜂娇鐢▄@link #getIPv6ListForHostASync(String)}
|
||||
*/
|
||||
@Deprecated
|
||||
String[] getIPv6sByHostAsync(String host);
|
||||
|
||||
/**
|
||||
* 异步解析接口,获取ipv6列表, 首先查询缓存, 若存在则返回结果, 若不存在返回null 并且进行异步域名解析请求
|
||||
* 寮傛瑙f瀽鎺ュ彛锛岃幏鍙杋pv6鍒楄〃, 棣栧厛鏌ヨ缂撳瓨, 鑻ュ瓨鍦ㄥ垯杩斿洖缁撴灉, 鑻ヤ笉瀛樺湪杩斿洖null 骞朵笖杩涜寮傛鍩熷悕瑙f瀽璇锋眰
|
||||
*
|
||||
* @param host 要解析的host域名
|
||||
* @return 返回v6地址的String 数组, 如果没得到解析结果, 则String 数组的长度为0
|
||||
* @param host 瑕佽В鏋愮殑host鍩熷悕
|
||||
* @return 杩斿洖v6鍦板潃鐨凷tring 鏁扮粍, 濡傛灉娌″緱鍒拌В鏋愮粨鏋? 鍒橲tring 鏁扮粍鐨勯暱搴︿负0
|
||||
*/
|
||||
@Deprecated
|
||||
String[] getIPv6ListForHostASync(String host);
|
||||
|
||||
/**
|
||||
* 异步解析接口,获取ipv4ipv6列表
|
||||
* 寮傛瑙f瀽鎺ュ彛锛岃幏鍙杋pv4ipv6鍒楄〃
|
||||
*
|
||||
* @param host 要解析的host域名
|
||||
* @param host 瑕佽В鏋愮殑host鍩熷悕
|
||||
* @return {@link HTTPDNSResult}
|
||||
* @deprecated 该接口已废弃,后续版本可能会被删除,请使用{@link #getHttpDnsResultForHostAsync(String)}
|
||||
* @deprecated 璇ユ帴鍙e凡搴熷純锛屽悗缁増鏈彲鑳戒細琚垹闄わ紝璇蜂娇鐢▄@link #getHttpDnsResultForHostAsync(String)}
|
||||
*/
|
||||
@Deprecated
|
||||
HTTPDNSResult getAllByHostAsync(String host);
|
||||
|
||||
/**
|
||||
* 异步解析接口,获取ipv4 + ipv6列表, 首先查询缓存, 若存在则返回结果, 若不存在返回null 并且进行异步域名解析请求
|
||||
* 寮傛瑙f瀽鎺ュ彛锛岃幏鍙杋pv4 + ipv6鍒楄〃, 棣栧厛鏌ヨ缂撳瓨, 鑻ュ瓨鍦ㄥ垯杩斿洖缁撴灉, 鑻ヤ笉瀛樺湪杩斿洖null 骞朵笖杩涜寮傛鍩熷悕瑙f瀽璇锋眰
|
||||
*
|
||||
* @param host 要解析的host域名
|
||||
* @param host 瑕佽В鏋愮殑host鍩熷悕
|
||||
* @return {@link HTTPDNSResult}
|
||||
*/
|
||||
@Deprecated
|
||||
HTTPDNSResult getHttpDnsResultForHostAsync(String host);
|
||||
|
||||
/**
|
||||
* 异步解析接口,获取ipv4 + ipv6列表, 首先查询缓存, 若存在则返回结果, 若不存在返回null 并且进行异步域名解析请求
|
||||
* 支持 指定解析IP类型
|
||||
* 寮傛瑙f瀽鎺ュ彛锛岃幏鍙杋pv4 + ipv6鍒楄〃, 棣栧厛鏌ヨ缂撳瓨, 鑻ュ瓨鍦ㄥ垯杩斿洖缁撴灉, 鑻ヤ笉瀛樺湪杩斿洖null 骞朵笖杩涜寮傛鍩熷悕瑙f瀽璇锋眰
|
||||
* 鏀寔 鎸囧畾瑙f瀽IP绫诲瀷
|
||||
*
|
||||
* @param host 要解析的host域名
|
||||
* @param type {@link RequestIpType} 网络栈类型,v4,v6,both,auto(根据当前设备所连的网络自动判断网络栈)
|
||||
* @param host 瑕佽В鏋愮殑host鍩熷悕
|
||||
* @param type {@link RequestIpType} 缃戠粶鏍堢被鍨嬶紝v4,v6,both,auto(鏍规嵁褰撳墠璁惧鎵€杩炵殑缃戠粶鑷姩鍒ゆ柇缃戠粶鏍?
|
||||
* @return {@link HTTPDNSResult}
|
||||
* @deprecated 该接口已废弃,后续版本可能会被删除,请使用{@link #getHttpDnsResultForHostAsync(String, RequestIpType)}
|
||||
* @deprecated 璇ユ帴鍙e凡搴熷純锛屽悗缁増鏈彲鑳戒細琚垹闄わ紝璇蜂娇鐢▄@link #getHttpDnsResultForHostAsync(String, RequestIpType)}
|
||||
*/
|
||||
@Deprecated
|
||||
HTTPDNSResult getIpsByHostAsync(String host, RequestIpType type);
|
||||
|
||||
/**
|
||||
* 异步解析接口,获取ipv4 + ipv6列表, 首先查询缓存, 若存在则返回结果, 若不存在返回null 并且进行异步域名解析请求
|
||||
* 支持 指定解析IP类型
|
||||
* 寮傛瑙f瀽鎺ュ彛锛岃幏鍙杋pv4 + ipv6鍒楄〃, 棣栧厛鏌ヨ缂撳瓨, 鑻ュ瓨鍦ㄥ垯杩斿洖缁撴灉, 鑻ヤ笉瀛樺湪杩斿洖null 骞朵笖杩涜寮傛鍩熷悕瑙f瀽璇锋眰
|
||||
* 鏀寔 鎸囧畾瑙f瀽IP绫诲瀷
|
||||
*
|
||||
* @param host 要解析的host域名
|
||||
* @param type {@link RequestIpType} 网络栈类型,v4,v6,both,auto(根据当前设备所连的网络自动判断网络栈)
|
||||
* @param host 瑕佽В鏋愮殑host鍩熷悕
|
||||
* @param type {@link RequestIpType} 缃戠粶鏍堢被鍨嬶紝v4,v6,both,auto(鏍规嵁褰撳墠璁惧鎵€杩炵殑缃戠粶鑷姩鍒ゆ柇缃戠粶鏍?
|
||||
* @return {@link HTTPDNSResult}
|
||||
*/
|
||||
@Deprecated
|
||||
HTTPDNSResult getHttpDnsResultForHostAsync(String host, RequestIpType type);
|
||||
|
||||
/***
|
||||
* 校正App签名时间
|
||||
* @param time time为epoch时间戳,1970年1月1日以来的秒数
|
||||
* 鏍℃App绛惧悕鏃堕棿
|
||||
* @param time time涓篹poch鏃堕棿鎴筹紝1970骞?鏈?鏃ヤ互鏉ョ殑绉掓暟
|
||||
*/
|
||||
void setAuthCurrentTime(long time);
|
||||
|
||||
/**
|
||||
* 获取会话id
|
||||
* 鑾峰彇浼氳瘽id
|
||||
*
|
||||
* @return sid
|
||||
*/
|
||||
String getSessionId();
|
||||
|
||||
//以下针对SDNS
|
||||
//浠ヤ笅閽堝SDNS
|
||||
|
||||
/**
|
||||
* 异步解析接口, 获取ipv4 + ipv6 列表,首先查询缓存, 若存在则返回结果, 若不存在返回null 并且进行异步域名解析请求
|
||||
* 支持配置sdns参数
|
||||
* 寮傛瑙f瀽鎺ュ彛, 鑾峰彇ipv4 + ipv6 鍒楄〃,棣栧厛鏌ヨ缂撳瓨, 鑻ュ瓨鍦ㄥ垯杩斿洖缁撴灉, 鑻ヤ笉瀛樺湪杩斿洖null 骞朵笖杩涜寮傛鍩熷悕瑙f瀽璇锋眰
|
||||
* 鏀寔閰嶇疆sdns鍙傛暟
|
||||
*
|
||||
* @param host 要解析的host域名
|
||||
* @param host 瑕佽В鏋愮殑host鍩熷悕
|
||||
* @return {@link HTTPDNSResult}
|
||||
* @deprecated 该接口已废弃,后续版本可能会被删除,请使用{@link #getHttpDnsResultForHostAsync(String, Map, String)}
|
||||
* @deprecated 璇ユ帴鍙e凡搴熷純锛屽悗缁増鏈彲鑳戒細琚垹闄わ紝璇蜂娇鐢▄@link #getHttpDnsResultForHostAsync(String, Map, String)}
|
||||
*/
|
||||
@Deprecated
|
||||
HTTPDNSResult getIpsByHostAsync(String host, Map<String, String> params, String cacheKey);
|
||||
|
||||
/**
|
||||
* 异步解析接口, 获取ipv4 + ipv6列表, 首先查询缓存, 若存在则返回结果, 若不存在返回null 并且进行异步域名解析请求
|
||||
* 支持配置sdns参数
|
||||
* 寮傛瑙f瀽鎺ュ彛, 鑾峰彇ipv4 + ipv6鍒楄〃, 棣栧厛鏌ヨ缂撳瓨, 鑻ュ瓨鍦ㄥ垯杩斿洖缁撴灉, 鑻ヤ笉瀛樺湪杩斿洖null 骞朵笖杩涜寮傛鍩熷悕瑙f瀽璇锋眰
|
||||
* 鏀寔閰嶇疆sdns鍙傛暟
|
||||
*
|
||||
* @param host 要解析的host域名
|
||||
* @param host 瑕佽В鏋愮殑host鍩熷悕
|
||||
* @param params
|
||||
* @param cacheKey
|
||||
* @return {@link HTTPDNSResult}
|
||||
@@ -181,16 +181,16 @@ public interface HttpDnsService {
|
||||
String cacheKey);
|
||||
|
||||
/**
|
||||
* 异步解析接口, 获取ipv4 + ipv6列表, 首先查询缓存, 若存在则返回结果, 若不存在返回null 并且进行异步域名解析请求
|
||||
* 支持配置sdns参数
|
||||
* 支持指定解析类型
|
||||
* 寮傛瑙f瀽鎺ュ彛, 鑾峰彇ipv4 + ipv6鍒楄〃, 棣栧厛鏌ヨ缂撳瓨, 鑻ュ瓨鍦ㄥ垯杩斿洖缁撴灉, 鑻ヤ笉瀛樺湪杩斿洖null 骞朵笖杩涜寮傛鍩熷悕瑙f瀽璇锋眰
|
||||
* 鏀寔閰嶇疆sdns鍙傛暟
|
||||
* 鏀寔鎸囧畾瑙f瀽绫诲瀷
|
||||
*
|
||||
* @param host 要解析的host域名
|
||||
* @param type {@link RequestIpType} 网络栈类型,v4,v6,both,auto(根据当前设备所连的网络自动判断网络栈)
|
||||
* @param host 瑕佽В鏋愮殑host鍩熷悕
|
||||
* @param type {@link RequestIpType} 缃戠粶鏍堢被鍨嬶紝v4,v6,both,auto(鏍规嵁褰撳墠璁惧鎵€杩炵殑缃戠粶鑷姩鍒ゆ柇缃戠粶鏍?
|
||||
* @param params
|
||||
* @param cacheKey
|
||||
* @return {@link HTTPDNSResult}
|
||||
* @deprecated 该接口已废弃,后续版本可能会被删除,请使用{@link #getHttpDnsResultForHostAsync(String, RequestIpType,
|
||||
* @deprecated 璇ユ帴鍙e凡搴熷純锛屽悗缁増鏈彲鑳戒細琚垹闄わ紝璇蜂娇鐢▄@link #getHttpDnsResultForHostAsync(String, RequestIpType,
|
||||
* Map, String)}
|
||||
*/
|
||||
@Deprecated
|
||||
@@ -198,14 +198,14 @@ public interface HttpDnsService {
|
||||
String cacheKey);
|
||||
|
||||
/**
|
||||
* 异步解析接口, 获取ipv4 + ipv6列表, 首先查询缓存, 若存在则返回结果, 若不存在返回null 并且进行异步域名解析请求
|
||||
* 支持配置sdns参数
|
||||
* 支持指定解析类型
|
||||
* 寮傛瑙f瀽鎺ュ彛, 鑾峰彇ipv4 + ipv6鍒楄〃, 棣栧厛鏌ヨ缂撳瓨, 鑻ュ瓨鍦ㄥ垯杩斿洖缁撴灉, 鑻ヤ笉瀛樺湪杩斿洖null 骞朵笖杩涜寮傛鍩熷悕瑙f瀽璇锋眰
|
||||
* 鏀寔閰嶇疆sdns鍙傛暟
|
||||
* 鏀寔鎸囧畾瑙f瀽绫诲瀷
|
||||
*
|
||||
* @param host 要解析的host域名
|
||||
* @param type {@link RequestIpType} 网络栈类型,v4,v6,both,auto(根据当前设备所连的网络自动判断网络栈)
|
||||
* @param params 自定义解析参数
|
||||
* @param cacheKey 缓存的key
|
||||
* @param host 瑕佽В鏋愮殑host鍩熷悕
|
||||
* @param type {@link RequestIpType} 缃戠粶鏍堢被鍨嬶紝v4,v6,both,auto(鏍规嵁褰撳墠璁惧鎵€杩炵殑缃戠粶鑷姩鍒ゆ柇缃戠粶鏍?
|
||||
* @param params 鑷畾涔夎В鏋愬弬鏁?
|
||||
* @param cacheKey 缂撳瓨鐨刱ey
|
||||
* @return {@link HTTPDNSResult}
|
||||
*/
|
||||
@Deprecated
|
||||
@@ -213,103 +213,103 @@ public interface HttpDnsService {
|
||||
String> params, String cacheKey);
|
||||
|
||||
/**
|
||||
* 同步解析接口,支持指定解析类型
|
||||
* 支持配置sdns参数
|
||||
* 需要注意的地方:
|
||||
* 1. 该方法必须在子线程中执行,如果在主线程中调用该方法,方法内部会自动切换成异步执行
|
||||
* 2. 同步接口会阻塞当前子线程,阻塞时长可以通过{@link InitConfig.Builder#setTimeout(int)}设置,
|
||||
* 不过阻塞时长的上限是5s,如果设置的超时时长超过5s则无效
|
||||
* 鍚屾瑙f瀽鎺ュ彛锛屾敮鎸佹寚瀹氳В鏋愮被鍨?
|
||||
* 鏀寔閰嶇疆sdns鍙傛暟
|
||||
* 闇€瑕佹敞鎰忕殑鍦版柟:
|
||||
* 1. 璇ユ柟娉曞繀椤诲湪瀛愮嚎绋嬩腑鎵ц锛屽鏋滃湪涓荤嚎绋嬩腑璋冪敤璇ユ柟娉曪紝鏂规硶鍐呴儴浼氳嚜鍔ㄥ垏鎹㈡垚寮傛鎵ц
|
||||
* 2. 鍚屾鎺ュ彛浼氶樆濉炲綋鍓嶅瓙绾跨▼锛岄樆濉炴椂闀垮彲浠ラ€氳繃{@link InitConfig.Builder#setTimeout(int)}璁剧疆锛?
|
||||
* 涓嶈繃闃诲鏃堕暱鐨勪笂闄愭槸5s锛屽鏋滆缃殑瓒呮椂鏃堕暱瓒呰繃5s鍒欐棤鏁?
|
||||
*
|
||||
* @param host 要解析的host域名列表
|
||||
* @param host 瑕佽В鏋愮殑host鍩熷悕鍒楄〃
|
||||
* @param type {@link RequestIpType}
|
||||
* @param params 自定义解析参数
|
||||
* @param cacheKey 缓存的key
|
||||
* @param params 鑷畾涔夎В鏋愬弬鏁?
|
||||
* @param cacheKey 缂撳瓨鐨刱ey
|
||||
* @return {@link HTTPDNSResult}
|
||||
*/
|
||||
HTTPDNSResult getHttpDnsResultForHostSync(String host, RequestIpType type, Map<String,
|
||||
String> params, String cacheKey);
|
||||
|
||||
/**
|
||||
* 异步解析接口, 获取ipv4 + ipv6列表, 通过回调返回解析结果,首先查询缓存, 若存在则返回结果, 若不存在返回null 并且进行异步域名解析请求
|
||||
* 支持配置sdns参数
|
||||
* 支持指定解析类型
|
||||
* 寮傛瑙f瀽鎺ュ彛, 鑾峰彇ipv4 + ipv6鍒楄〃, 閫氳繃鍥炶皟杩斿洖瑙f瀽缁撴灉锛岄鍏堟煡璇㈢紦瀛? 鑻ュ瓨鍦ㄥ垯杩斿洖缁撴灉, 鑻ヤ笉瀛樺湪杩斿洖null 骞朵笖杩涜寮傛鍩熷悕瑙f瀽璇锋眰
|
||||
* 鏀寔閰嶇疆sdns鍙傛暟
|
||||
* 鏀寔鎸囧畾瑙f瀽绫诲瀷
|
||||
*
|
||||
* @param host 要解析的host域名
|
||||
* @param type {@link RequestIpType} 网络栈类型,v4,v6,both,auto(根据当前设备所连的网络自动判断网络栈)
|
||||
* @param params 自定义解析参数
|
||||
* @param cacheKey 缓存的key
|
||||
* @param host 瑕佽В鏋愮殑host鍩熷悕
|
||||
* @param type {@link RequestIpType} 缃戠粶鏍堢被鍨嬶紝v4,v6,both,auto(鏍规嵁褰撳墠璁惧鎵€杩炵殑缃戠粶鑷姩鍒ゆ柇缃戠粶鏍?
|
||||
* @param params 鑷畾涔夎В鏋愬弬鏁?
|
||||
* @param cacheKey 缂撳瓨鐨刱ey
|
||||
*/
|
||||
void getHttpDnsResultForHostAsync(String host, RequestIpType type, Map<String,
|
||||
String> params, String cacheKey, HttpDnsCallback callback);
|
||||
|
||||
/**
|
||||
* 异步解析接口, 获取ipv4 + ipv6列表, 首先查询缓存, 若存在则返回结果, 若不存在返回null 并且进行异步域名解析请求
|
||||
* 支持配置sdns参数
|
||||
* 支持指定解析类型
|
||||
* 寮傛瑙f瀽鎺ュ彛, 鑾峰彇ipv4 + ipv6鍒楄〃, 棣栧厛鏌ヨ缂撳瓨, 鑻ュ瓨鍦ㄥ垯杩斿洖缁撴灉, 鑻ヤ笉瀛樺湪杩斿洖null 骞朵笖杩涜寮傛鍩熷悕瑙f瀽璇锋眰
|
||||
* 鏀寔閰嶇疆sdns鍙傛暟
|
||||
* 鏀寔鎸囧畾瑙f瀽绫诲瀷
|
||||
*
|
||||
* @param host 要解析的host域名
|
||||
* @param type {@link RequestIpType} 网络栈类型,v4,v6,both,auto(根据当前设备所连的网络自动判断网络栈)
|
||||
* @param params 自定义解析参数
|
||||
* @param cacheKey 缓存的key
|
||||
* @param host 瑕佽В鏋愮殑host鍩熷悕
|
||||
* @param type {@link RequestIpType} 缃戠粶鏍堢被鍨嬶紝v4,v6,both,auto(鏍规嵁褰撳墠璁惧鎵€杩炵殑缃戠粶鑷姩鍒ゆ柇缃戠粶鏍?
|
||||
* @param params 鑷畾涔夎В鏋愬弬鏁?
|
||||
* @param cacheKey 缂撳瓨鐨刱ey
|
||||
*/
|
||||
HTTPDNSResult getHttpDnsResultForHostSyncNonBlocking(String host, RequestIpType type, Map<String,
|
||||
String> params, String cacheKey);
|
||||
|
||||
//以上针对SDNS
|
||||
//浠ヤ笂閽堝SDNS
|
||||
|
||||
/**
|
||||
* 设置region,海外节点
|
||||
* 国内版默认是中国大陆节点,国际版默认是新加坡节点
|
||||
* 璁剧疆region锛屾捣澶栬妭鐐?
|
||||
* 鍥藉唴鐗堥粯璁ゆ槸涓浗澶ч檰鑺傜偣锛屽浗闄呯増榛樿鏄柊鍔犲潯鑺傜偣
|
||||
*
|
||||
* @param region sg(新家坡), hk(中国香港), ""(中国大陆), de(德国), us(美国)
|
||||
* @param region sg(鏂板鍧?, hk(涓浗棣欐腐), ""(涓浗澶ч檰), de(寰峰浗), us(缇庡浗)
|
||||
*/
|
||||
@Deprecated
|
||||
void setRegion(String region);
|
||||
|
||||
/**
|
||||
* 设置region
|
||||
* 国内版默认是中国大陆节点
|
||||
* 璁剧疆region
|
||||
* 鍥藉唴鐗堥粯璁ゆ槸涓浗澶ч檰鑺傜偣
|
||||
*
|
||||
* @param region {@link Region}
|
||||
*/
|
||||
void setRegion(Region region);
|
||||
|
||||
/**
|
||||
* 立即清除域名端侧内存和本地缓存。
|
||||
* 后续调用异步接口,会先返回空,触发域名解析
|
||||
* 绔嬪嵆娓呴櫎鍩熷悕绔晶鍐呭瓨鍜屾湰鍦扮紦瀛樸€?
|
||||
* 鍚庣画璋冪敤寮傛鎺ュ彛锛屼細鍏堣繑鍥炵┖锛岃Е鍙戝煙鍚嶈В鏋?
|
||||
*
|
||||
* @param hosts host域名列表
|
||||
* @param hosts host鍩熷悕鍒楄〃
|
||||
*/
|
||||
void cleanHostCache(ArrayList<String> hosts);
|
||||
|
||||
/**
|
||||
* 同步解析接口,支持指定解析类型
|
||||
* 需要注意的地方:
|
||||
* 1. 该方法必须在子线程中执行,如果在主线程中调用该方法,方法内部会自动切换成异步执行
|
||||
* 2. 同步接口会阻塞当前子线程,阻塞时长可以通过{@link InitConfig.Builder#setTimeout(int)}设置,
|
||||
* 不过阻塞时长的上限是5s,如果设置的超时时长超过5s则无效
|
||||
* 鍚屾瑙f瀽鎺ュ彛锛屾敮鎸佹寚瀹氳В鏋愮被鍨?
|
||||
* 闇€瑕佹敞鎰忕殑鍦版柟:
|
||||
* 1. 璇ユ柟娉曞繀椤诲湪瀛愮嚎绋嬩腑鎵ц锛屽鏋滃湪涓荤嚎绋嬩腑璋冪敤璇ユ柟娉曪紝鏂规硶鍐呴儴浼氳嚜鍔ㄥ垏鎹㈡垚寮傛鎵ц
|
||||
* 2. 鍚屾鎺ュ彛浼氶樆濉炲綋鍓嶅瓙绾跨▼锛岄樆濉炴椂闀垮彲浠ラ€氳繃{@link InitConfig.Builder#setTimeout(int)}璁剧疆锛?
|
||||
* 涓嶈繃闃诲鏃堕暱鐨勪笂闄愭槸5s锛屽鏋滆缃殑瓒呮椂鏃堕暱瓒呰繃5s鍒欐棤鏁?
|
||||
*
|
||||
* @param host 要解析的host域名列表
|
||||
* @param host 瑕佽В鏋愮殑host鍩熷悕鍒楄〃
|
||||
* @param type {@link RequestIpType}
|
||||
* @return {@link HTTPDNSResult}
|
||||
*/
|
||||
HTTPDNSResult getHttpDnsResultForHostSync(String host, RequestIpType type);
|
||||
|
||||
/**
|
||||
* 异步解析接口,根据type获取ip, 通过回调返回解析结果,首先查询缓存, 若存在则返回结果, 若不存在返回null 并且进行异步域名解析请求
|
||||
* 支持 指定解析IP类型
|
||||
* 寮傛瑙f瀽鎺ュ彛锛屾牴鎹畉ype鑾峰彇ip, 閫氳繃鍥炶皟杩斿洖瑙f瀽缁撴灉锛岄鍏堟煡璇㈢紦瀛? 鑻ュ瓨鍦ㄥ垯杩斿洖缁撴灉, 鑻ヤ笉瀛樺湪杩斿洖null 骞朵笖杩涜寮傛鍩熷悕瑙f瀽璇锋眰
|
||||
* 鏀寔 鎸囧畾瑙f瀽IP绫诲瀷
|
||||
*
|
||||
* @param host 要解析的host域名
|
||||
* @param type {@link RequestIpType} 网络栈类型,v4,v6,both,auto(根据当前设备所连的网络自动判断网络栈)
|
||||
* @param host 瑕佽В鏋愮殑host鍩熷悕
|
||||
* @param type {@link RequestIpType} 缃戠粶鏍堢被鍨嬶紝v4,v6,both,auto(鏍规嵁褰撳墠璁惧鎵€杩炵殑缃戠粶鑷姩鍒ゆ柇缃戠粶鏍?
|
||||
*/
|
||||
void getHttpDnsResultForHostAsync(String host, RequestIpType type, HttpDnsCallback callback);
|
||||
|
||||
/**
|
||||
* 异步解析接口,根据type获取ip, 首先查询缓存, 若存在则返回结果, 若不存在返回null 并且进行异步域名解析请求(不会通过回调给调用方)
|
||||
* 支持 指定解析IP类型
|
||||
* 寮傛瑙f瀽鎺ュ彛锛屾牴鎹畉ype鑾峰彇ip, 棣栧厛鏌ヨ缂撳瓨, 鑻ュ瓨鍦ㄥ垯杩斿洖缁撴灉, 鑻ヤ笉瀛樺湪杩斿洖null 骞朵笖杩涜寮傛鍩熷悕瑙f瀽璇锋眰锛堜笉浼氶€氳繃鍥炶皟缁欒皟鐢ㄦ柟锛?
|
||||
* 鏀寔 鎸囧畾瑙f瀽IP绫诲瀷
|
||||
*
|
||||
* @param host 要解析的host域名
|
||||
* @param type {@link RequestIpType} 网络栈类型,v4,v6,both,auto(根据当前设备所连的网络自动判断网络栈)
|
||||
* @param host 瑕佽В鏋愮殑host鍩熷悕
|
||||
* @param type {@link RequestIpType} 缃戠粶鏍堢被鍨嬶紝v4,v6,both,auto(鏍规嵁褰撳墠璁惧鎵€杩炵殑缃戠粶鑷姩鍒ゆ柇缃戠粶鏍?
|
||||
* @return {@link HTTPDNSResult}
|
||||
*/
|
||||
HTTPDNSResult getHttpDnsResultForHostSyncNonBlocking(String host, RequestIpType type);
|
||||
|
||||
@@ -32,16 +32,17 @@ public class HttpDnsSettings {
|
||||
}
|
||||
|
||||
/**
|
||||
* 需要外部注入的一些网络环境判断
|
||||
* 闇€瑕佸閮ㄦ敞鍏ョ殑涓€浜涚綉缁滅幆澧冨垽鏂?
|
||||
*/
|
||||
public interface NetworkChecker {
|
||||
boolean isIpv6Only();
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取网络类型的接口
|
||||
* 鑾峰彇缃戠粶绫诲瀷鐨勬帴鍙?
|
||||
*/
|
||||
public interface NetworkDetector {
|
||||
NetType getNetType(Context context);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package com.alibaba.sdk.android.httpdns;
|
||||
package com.alibaba.sdk.android.httpdns;
|
||||
|
||||
import android.content.Context;
|
||||
import android.text.TextUtils;
|
||||
@@ -69,3 +69,4 @@ public final class HttpDnsV1Client {
|
||||
return HttpDns.buildHttpClientAdapter(service, options);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,12 +1,13 @@
|
||||
package com.alibaba.sdk.android.httpdns;
|
||||
|
||||
/**
|
||||
* 日志接口
|
||||
* 鏃ュ織鎺ュ彛
|
||||
*/
|
||||
public interface ILogger {
|
||||
|
||||
/**
|
||||
* 日志输出
|
||||
* 鏃ュ織杈撳嚭
|
||||
*/
|
||||
void log(String msg);
|
||||
}
|
||||
|
||||
|
||||
@@ -16,9 +16,9 @@ import com.alibaba.sdk.android.httpdns.ranking.IPRankingBean;
|
||||
import com.alibaba.sdk.android.httpdns.utils.Constants;
|
||||
|
||||
/**
|
||||
* 初始化配置
|
||||
* 之前的初始化方式,每个配置都是单独设置的,有可能造成一些时序上的问题
|
||||
* 所以增加统一初始化配置的方法,由内部固定初始化逻辑,避免时序问题
|
||||
* 鍒濆鍖栭厤缃?
|
||||
* 涔嬪墠鐨勫垵濮嬪寲鏂瑰紡锛屾瘡涓厤缃兘鏄崟鐙缃殑锛屾湁鍙兘閫犳垚涓€浜涙椂搴忎笂鐨勯棶棰?
|
||||
* 鎵€浠ュ鍔犵粺涓€鍒濆鍖栭厤缃殑鏂规硶锛岀敱鍐呴儴鍥哄畾鍒濆鍖栭€昏緫锛岄伩鍏嶆椂搴忛棶棰?
|
||||
*/
|
||||
public class InitConfig {
|
||||
|
||||
@@ -209,8 +209,8 @@ public class InitConfig {
|
||||
private String secretKey = null;
|
||||
|
||||
/**
|
||||
* 设置是否允许返回超过ttl 的ip
|
||||
* @param enableExpiredIp 是否允许返回超过ttl 的ip
|
||||
* 璁剧疆鏄惁鍏佽杩斿洖瓒呰繃ttl 鐨刬p
|
||||
* @param enableExpiredIp 鏄惁鍏佽杩斿洖瓒呰繃ttl 鐨刬p
|
||||
* @return {@link Builder}
|
||||
*/
|
||||
public Builder setEnableExpiredIp(boolean enableExpiredIp) {
|
||||
@@ -219,8 +219,8 @@ public class InitConfig {
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置是否允许使用DB缓存,默认不允许
|
||||
* @param enableCacheIp 是否允许使用DB缓存
|
||||
* 璁剧疆鏄惁鍏佽浣跨敤DB缂撳瓨锛岄粯璁や笉鍏佽
|
||||
* @param enableCacheIp 鏄惁鍏佽浣跨敤DB缂撳瓨
|
||||
* @return {@link Builder}
|
||||
*/
|
||||
public Builder setEnableCacheIp(boolean enableCacheIp) {
|
||||
@@ -238,8 +238,8 @@ public class InitConfig {
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置请求超时时间,单位ms,默认为2s
|
||||
* @param timeoutMillis 超时时间,单位ms
|
||||
* 璁剧疆璇锋眰瓒呮椂鏃堕棿,鍗曚綅ms,榛樿涓?s
|
||||
* @param timeoutMillis 瓒呮椂鏃堕棿锛屽崟浣峬s
|
||||
* @return {@link Builder}
|
||||
*/
|
||||
public Builder setTimeoutMillis(int timeoutMillis) {
|
||||
@@ -248,8 +248,8 @@ public class InitConfig {
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置请求超时时间,单位ms,默认为2s
|
||||
* @param timeout 超时时间,单位ms
|
||||
* 璁剧疆璇锋眰瓒呮椂鏃堕棿,鍗曚綅ms,榛樿涓?s
|
||||
* @param timeout 瓒呮椂鏃堕棿锛屽崟浣峬s
|
||||
* @return {@link Builder}
|
||||
*/
|
||||
@Deprecated
|
||||
@@ -259,8 +259,8 @@ public class InitConfig {
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置开启/关闭降级到Local Dns,在httpdns解析失败或者域名被过滤不走httpdns的时候,开启降级会走local dns解析
|
||||
* @param enableDegradation true, 开启 | false, 关闭
|
||||
* 璁剧疆寮€鍚?鍏抽棴闄嶇骇鍒癓ocal Dns锛屽湪httpdns瑙f瀽澶辫触鎴栬€呭煙鍚嶈杩囨护涓嶈蛋httpdns鐨勬椂鍊欙紝寮€鍚檷绾т細璧發ocal dns瑙f瀽
|
||||
* @param enableDegradation true, 寮€鍚?锝?false, 鍏抽棴
|
||||
* @return {@link Builder}
|
||||
*/
|
||||
public Builder setEnableDegradationLocalDns(boolean enableDegradation) {
|
||||
@@ -269,8 +269,8 @@ public class InitConfig {
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置HTTPDNS域名解析请求类型(HTTP/HTTPS),若不调用该接口,默认为HTTP请求
|
||||
* @param enableHttps 是否使用https
|
||||
* 璁剧疆HTTPDNS鍩熷悕瑙f瀽璇锋眰绫诲瀷(HTTP/HTTPS)锛岃嫢涓嶈皟鐢ㄨ鎺ュ彛锛岄粯璁や负HTTP璇锋眰
|
||||
* @param enableHttps 鏄惁浣跨敤https
|
||||
* @return {@link Builder}
|
||||
*/
|
||||
public Builder setEnableHttps(boolean enableHttps) {
|
||||
@@ -279,7 +279,7 @@ public class InitConfig {
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置要探测的域名列表,默认只会对ipv4的地址进行ip优选
|
||||
* 璁剧疆瑕佹帰娴嬬殑鍩熷悕鍒楄〃,榛樿鍙細瀵筰pv4鐨勫湴鍧€杩涜ip浼橀€?
|
||||
* @param ipRankingList {@link IPRankingBean}
|
||||
* @return {@link Builder}
|
||||
*/
|
||||
@@ -303,9 +303,9 @@ public class InitConfig {
|
||||
}
|
||||
|
||||
/**
|
||||
* 配置自定义ttl的逻辑
|
||||
* 閰嶇疆鑷畾涔塼tl鐨勯€昏緫
|
||||
*
|
||||
* @param cacheTtlChanger 修改ttl的接口
|
||||
* @param cacheTtlChanger 淇敼ttl鐨勬帴鍙?
|
||||
*/
|
||||
public Builder configCacheTtlChanger(CacheTtlChanger cacheTtlChanger) {
|
||||
this.cacheTtlChanger = cacheTtlChanger;
|
||||
@@ -313,9 +313,9 @@ public class InitConfig {
|
||||
}
|
||||
|
||||
/**
|
||||
* 配置主站域名列表
|
||||
* 閰嶇疆涓荤珯鍩熷悕鍒楄〃
|
||||
*
|
||||
* @param hostListWithFixedIp 主站域名列表
|
||||
* @param hostListWithFixedIp 涓荤珯鍩熷悕鍒楄〃
|
||||
*/
|
||||
public Builder configHostWithFixedIp(List<String> hostListWithFixedIp) {
|
||||
this.hostListWithFixedIp = hostListWithFixedIp;
|
||||
@@ -323,8 +323,8 @@ public class InitConfig {
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置网络切换时是否自动刷新所有域名解析结果,默认自动刷新
|
||||
* @param enable 是否允许自动刷新域名解析结果
|
||||
* 璁剧疆缃戠粶鍒囨崲鏃舵槸鍚﹁嚜鍔ㄥ埛鏂版墍鏈夊煙鍚嶈В鏋愮粨鏋滐紝榛樿鑷姩鍒锋柊
|
||||
* @param enable 鏄惁鍏佽鑷姩鍒锋柊鍩熷悕瑙f瀽缁撴灉
|
||||
* @return {@link Builder}
|
||||
*/
|
||||
public Builder setPreResolveAfterNetworkChanged(boolean enable) {
|
||||
@@ -333,7 +333,7 @@ public class InitConfig {
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置降级策略, 用户可定制规则降级为原生DNS解析方式
|
||||
* 璁剧疆闄嶇骇绛栫暐, 鐢ㄦ埛鍙畾鍒惰鍒欓檷绾т负鍘熺敓DNS瑙f瀽鏂瑰紡
|
||||
* @param filter {@link DegradationFilter}
|
||||
* @return {@link Builder}
|
||||
*/
|
||||
@@ -344,7 +344,7 @@ public class InitConfig {
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置不使用HttpDns的策略, 用户可定制规则指定不走httpdns的域名
|
||||
* 璁剧疆涓嶄娇鐢℉ttpDns鐨勭瓥鐣? 鐢ㄦ埛鍙畾鍒惰鍒欐寚瀹氫笉璧癶ttpdns鐨勫煙鍚?
|
||||
* @param filter {@link NotUseHttpDnsFilter}
|
||||
* @return {@link Builder}
|
||||
*/
|
||||
@@ -354,8 +354,8 @@ public class InitConfig {
|
||||
}
|
||||
|
||||
/**
|
||||
* 是否开启sdk内部的崩溃保护机制,默认是关闭的
|
||||
* @param enabled 开启/关闭
|
||||
* 鏄惁寮€鍚痵dk鍐呴儴鐨勫穿婧冧繚鎶ゆ満鍒讹紝榛樿鏄叧闂殑
|
||||
* @param enabled 寮€鍚?鍏抽棴
|
||||
* @return {@link Builder}
|
||||
*/
|
||||
public Builder enableCrashDefend(boolean enabled) {
|
||||
@@ -364,8 +364,8 @@ public class InitConfig {
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置sdns全局参数(该全局参数不影响异步解析任务,只用于解析接口调用时进行参数合并)
|
||||
* @param params sdn的全局参数
|
||||
* 璁剧疆sdns鍏ㄥ眬鍙傛暟锛堣鍏ㄥ眬鍙傛暟涓嶅奖鍝嶅紓姝ヨВ鏋愪换鍔★紝鍙敤浜庤В鏋愭帴鍙h皟鐢ㄦ椂杩涜鍙傛暟鍚堝苟锛?
|
||||
* @param params sdn鐨勫叏灞€鍙傛暟
|
||||
* @return {@link Builder}
|
||||
*/
|
||||
public Builder setSdnsGlobalParams(Map<String, String> params) {
|
||||
@@ -402,7 +402,7 @@ public class InitConfig {
|
||||
}
|
||||
|
||||
if (tmpTag.indexOf(tag) != -1) {
|
||||
//去重
|
||||
//鍘婚噸
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -413,7 +413,7 @@ public class InitConfig {
|
||||
}
|
||||
|
||||
int lastCommaIndex = tmpTag.lastIndexOf(",");
|
||||
//最后一位逗号要去掉
|
||||
//鏈€鍚庝竴浣嶉€楀彿瑕佸幓鎺?
|
||||
if (lastCommaIndex == tmpTag.length() - 1) {
|
||||
tmpTag.deleteCharAt(lastCommaIndex);
|
||||
}
|
||||
@@ -427,8 +427,8 @@ public class InitConfig {
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置aes加密密钥
|
||||
* @param aesSecretKey 加密密钥
|
||||
* 璁剧疆aes鍔犲瘑瀵嗛挜
|
||||
* @param aesSecretKey 鍔犲瘑瀵嗛挜
|
||||
* @return {@link Builder}
|
||||
*/
|
||||
public Builder setAesSecretKey(String aesSecretKey) {
|
||||
@@ -437,24 +437,21 @@ public class InitConfig {
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置主服务域名。
|
||||
*/
|
||||
* 璁剧疆涓绘湇鍔″煙鍚嶃€? */
|
||||
public Builder setPrimaryServiceHost(String host) {
|
||||
this.primaryServiceHost = host;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置备服务域名。
|
||||
*/
|
||||
* 璁剧疆澶囨湇鍔″煙鍚嶃€? */
|
||||
public Builder setBackupServiceHost(String host) {
|
||||
this.backupServiceHost = host;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量设置服务域名,支持主备两个。
|
||||
*/
|
||||
* 鎵归噺璁剧疆鏈嶅姟鍩熷悕锛屾敮鎸佷富澶囦袱涓€? */
|
||||
public Builder setServiceHosts(List<String> hosts) {
|
||||
if (hosts != null && hosts.size() > 0) {
|
||||
this.primaryServiceHost = hosts.get(0);
|
||||
@@ -466,16 +463,15 @@ public class InitConfig {
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置服务端口,默认 -1 表示使用协议默认端口。
|
||||
*/
|
||||
* 璁剧疆鏈嶅姟绔彛锛岄粯璁?-1 琛ㄧず浣跨敤鍗忚榛樿绔彛銆? */
|
||||
public Builder setServicePort(int port) {
|
||||
this.servicePort = port;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置context
|
||||
* @param context 上下文
|
||||
* 璁剧疆context
|
||||
* @param context 涓婁笅鏂?
|
||||
* @return {@link Builder}
|
||||
*/
|
||||
public Builder setContext(Context context) {
|
||||
@@ -490,8 +486,8 @@ public class InitConfig {
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置加签密钥
|
||||
* @param secretKey 加签密钥
|
||||
* 璁剧疆鍔犵瀵嗛挜
|
||||
* @param secretKey 鍔犵瀵嗛挜
|
||||
* @return {@link Builder}
|
||||
*/
|
||||
public Builder setSecretKey(String secretKey) {
|
||||
@@ -510,3 +506,4 @@ public class InitConfig {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package com.alibaba.sdk.android.httpdns;
|
||||
|
||||
/**
|
||||
* 网络类型
|
||||
* 缃戠粶绫诲瀷
|
||||
*/
|
||||
public enum NetType {
|
||||
none,
|
||||
@@ -9,3 +9,4 @@ public enum NetType {
|
||||
v6,
|
||||
both
|
||||
}
|
||||
|
||||
|
||||
@@ -1,14 +1,15 @@
|
||||
package com.alibaba.sdk.android.httpdns;
|
||||
|
||||
/**
|
||||
* 不使用HttpDns的配置接口
|
||||
* 涓嶄娇鐢℉ttpDns鐨勯厤缃帴鍙?
|
||||
*/
|
||||
public interface NotUseHttpDnsFilter {
|
||||
/**
|
||||
* 是否应该不使用httpdns
|
||||
* @param hostName 域名
|
||||
* @return true 不走httpdns解析 | false 走httpdns解析
|
||||
* 鏄惁搴旇涓嶄娇鐢╤ttpdns
|
||||
* @param hostName 鍩熷悕
|
||||
* @return true 涓嶈蛋httpdns瑙f瀽 锝?false 璧癶ttpdns瑙f瀽
|
||||
*
|
||||
*/
|
||||
boolean notUseHttpDns(String hostName);
|
||||
}
|
||||
|
||||
|
||||
@@ -18,3 +18,4 @@ public enum Region {
|
||||
return region;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,17 +1,18 @@
|
||||
package com.alibaba.sdk.android.httpdns;
|
||||
|
||||
/**
|
||||
* 请求的ip类型
|
||||
* 璇锋眰鐨刬p绫诲瀷
|
||||
*/
|
||||
public enum RequestIpType {
|
||||
v4,
|
||||
v6,
|
||||
/**
|
||||
* 表示 两个都要
|
||||
* 琛ㄧず 涓や釜閮借
|
||||
*/
|
||||
both,
|
||||
/**
|
||||
* 表示根据网络情况自动判断
|
||||
* 琛ㄧず鏍规嵁缃戠粶鎯呭喌鑷姩鍒ゆ柇
|
||||
*/
|
||||
auto
|
||||
}
|
||||
|
||||
|
||||
@@ -2,12 +2,13 @@ package com.alibaba.sdk.android.httpdns;
|
||||
|
||||
public interface SyncService {
|
||||
/**
|
||||
* 同步解析接口,必须在子线程中执行,否则没有效果
|
||||
* 鍚屾瑙f瀽鎺ュ彛锛屽繀椤诲湪瀛愮嚎绋嬩腑鎵ц锛屽惁鍒欐病鏈夋晥鏋?
|
||||
*
|
||||
* @deprecated 该接口已废弃,后续版本可能会删除,请使用
|
||||
* @deprecated 璇ユ帴鍙e凡搴熷純锛屽悗缁増鏈彲鑳戒細鍒犻櫎锛岃浣跨敤
|
||||
* {@link HttpDnsService#getHttpDnsResultForHostSync(String, RequestIpType)}
|
||||
*/
|
||||
@Deprecated
|
||||
HTTPDNSResult getByHost(String host, RequestIpType type);
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -6,8 +6,8 @@ import com.alibaba.sdk.android.httpdns.RequestIpType;
|
||||
import com.alibaba.sdk.android.httpdns.utils.CommonUtil;
|
||||
|
||||
/**
|
||||
* ip解析结果记录
|
||||
* 注意计算hash 和 equal实现,没有使用fromDB字段
|
||||
* ip瑙f瀽缁撴灉璁板綍
|
||||
* 娉ㄦ剰璁$畻hash 鍜?equal瀹炵幇锛屾病鏈変娇鐢╢romDB瀛楁
|
||||
*/
|
||||
public class HostRecord {
|
||||
private long id = -1;
|
||||
@@ -181,3 +181,4 @@ public class HostRecord {
|
||||
'}';
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -13,7 +13,7 @@ import android.database.sqlite.SQLiteDatabase;
|
||||
import android.database.sqlite.SQLiteOpenHelper;
|
||||
|
||||
/**
|
||||
* 数据库存取操作
|
||||
* 鏁版嵁搴撳瓨鍙栨搷浣?
|
||||
*/
|
||||
public class RecordDBHelper extends SQLiteOpenHelper {
|
||||
|
||||
@@ -42,7 +42,7 @@ public class RecordDBHelper extends SQLiteOpenHelper {
|
||||
|
||||
static final String COL_CACHE_KEY = "cache_key";
|
||||
|
||||
// 旧版本 用于存储网络标识的字段,由于合规的影响,删除了相关代码,此字段变为固定字段,目前已经没有意义
|
||||
// 鏃х増鏈?鐢ㄤ簬瀛樺偍缃戠粶鏍囪瘑鐨勫瓧娈碉紝鐢变簬鍚堣鐨勫奖鍝嶏紝鍒犻櫎浜嗙浉鍏充唬鐮侊紝姝ゅ瓧娈靛彉涓哄浐瀹氬瓧娈碉紝鐩墠宸茬粡娌℃湁鎰忎箟
|
||||
static final String COL_SP = "sp";
|
||||
|
||||
static final String COL_NO_IP_CODE = "no_ip_code";
|
||||
@@ -93,7 +93,7 @@ public class RecordDBHelper extends SQLiteOpenHelper {
|
||||
}
|
||||
|
||||
/**
|
||||
* 从数据库获取全部数据
|
||||
* 浠庢暟鎹簱鑾峰彇鍏ㄩ儴鏁版嵁
|
||||
*
|
||||
* @param region
|
||||
* @return
|
||||
@@ -146,7 +146,7 @@ public class RecordDBHelper extends SQLiteOpenHelper {
|
||||
}
|
||||
|
||||
/**
|
||||
* 从数据库删除数据
|
||||
* 浠庢暟鎹簱鍒犻櫎鏁版嵁
|
||||
*/
|
||||
public void delete(List<HostRecord> records) {
|
||||
if (records == null || records.isEmpty()) {
|
||||
@@ -177,7 +177,7 @@ public class RecordDBHelper extends SQLiteOpenHelper {
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新数据
|
||||
* 鏇存柊鏁版嵁
|
||||
*/
|
||||
public void insertOrUpdate(List<HostRecord> records) {
|
||||
synchronized (mLock) {
|
||||
@@ -258,3 +258,4 @@ public class RecordDBHelper extends SQLiteOpenHelper {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -9,7 +9,7 @@ import android.content.Context;
|
||||
import android.content.SharedPreferences;
|
||||
|
||||
/**
|
||||
* 辅助配置的缓存写入和读取
|
||||
* 杈呭姪閰嶇疆鐨勭紦瀛樺啓鍏ュ拰璇诲彇
|
||||
*/
|
||||
public class ConfigCacheHelper {
|
||||
|
||||
@@ -58,8 +58,9 @@ public class ConfigCacheHelper {
|
||||
for (SpCacheItem item : items) {
|
||||
item.saveToCache(editor);
|
||||
}
|
||||
// 虽然提示建议使用apply,但是实践证明,apply是把写文件操作推迟到了一些界面切换等时机,反而影响了UI线程。不如直接在子线程写文件
|
||||
// 铏界劧鎻愮ず寤鸿浣跨敤apply锛屼絾鏄疄璺佃瘉鏄庯紝apply鏄妸鍐欐枃浠舵搷浣滄帹杩熷埌浜嗕竴浜涚晫闈㈠垏鎹㈢瓑鏃舵満锛屽弽鑰屽奖鍝嶄簡UI绾跨▼銆備笉濡傜洿鎺ュ湪瀛愮嚎绋嬪啓鏂囦欢
|
||||
editor.commit();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -6,14 +6,14 @@ import java.util.Arrays;
|
||||
|
||||
public class RegionServer {
|
||||
/**
|
||||
* HttpDns的服务IP
|
||||
* HttpDns鐨勬湇鍔P
|
||||
*/
|
||||
private String[] mServerIps;
|
||||
/**
|
||||
* HttpDns的服务端口,线上都是默认端口 80 或者 443
|
||||
* 此处是为了测试场景指定端口
|
||||
* 下标和{@link #mServerIps} 对应
|
||||
* 如果为null 表示没有指定端口
|
||||
* HttpDns鐨勬湇鍔$鍙o紝绾夸笂閮芥槸榛樿绔彛 80 鎴栬€?443
|
||||
* 姝ゅ鏄负浜嗘祴璇曞満鏅寚瀹氱鍙?
|
||||
* 涓嬫爣鍜寋@link #mServerIps} 瀵瑰簲
|
||||
* 濡傛灉涓簄ull 琛ㄧず娌℃湁鎸囧畾绔彛
|
||||
*/
|
||||
private int[] mPorts;
|
||||
private String mRegion;
|
||||
@@ -115,3 +115,4 @@ public class RegionServer {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -11,8 +11,8 @@ import android.content.SharedPreferences;
|
||||
import android.text.TextUtils;
|
||||
|
||||
/**
|
||||
* 服务节点配置
|
||||
* 维护 服务节点的一些状态
|
||||
* 鏈嶅姟鑺傜偣閰嶇疆
|
||||
* 缁存姢 鏈嶅姟鑺傜偣鐨勪竴浜涚姸鎬?
|
||||
*/
|
||||
public class ServerConfig extends RegionServer implements SpCacheItem {
|
||||
|
||||
@@ -30,7 +30,7 @@ public class ServerConfig extends RegionServer implements SpCacheItem {
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取当前使用的服务IP
|
||||
* 鑾峰彇褰撳墠浣跨敤鐨勬湇鍔P
|
||||
*/
|
||||
public String getServerIp() {
|
||||
final String[] serverIps = getServerIps();
|
||||
@@ -42,7 +42,7 @@ public class ServerConfig extends RegionServer implements SpCacheItem {
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取当前使用的服务IP ipv6
|
||||
* 鑾峰彇褰撳墠浣跨敤鐨勬湇鍔P ipv6
|
||||
*/
|
||||
public String getServerIpForV6() {
|
||||
final String[] serverIps = getIpv6ServerIps();
|
||||
@@ -54,7 +54,7 @@ public class ServerConfig extends RegionServer implements SpCacheItem {
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取当前使用的服务端口
|
||||
* 鑾峰彇褰撳墠浣跨敤鐨勬湇鍔$鍙?
|
||||
*/
|
||||
public int getPort() {
|
||||
final int[] ports = getPorts();
|
||||
@@ -65,7 +65,7 @@ public class ServerConfig extends RegionServer implements SpCacheItem {
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取当前使用的服务端口
|
||||
* 鑾峰彇褰撳墠浣跨敤鐨勬湇鍔$鍙?
|
||||
*/
|
||||
public int getPortForV6() {
|
||||
final int[] ports = getIpv6Ports();
|
||||
@@ -77,16 +77,16 @@ public class ServerConfig extends RegionServer implements SpCacheItem {
|
||||
}
|
||||
|
||||
/**
|
||||
* 是否应该更新服务IP
|
||||
* 鏄惁搴旇鏇存柊鏈嶅姟IP
|
||||
*/
|
||||
public boolean shouldUpdateServerIp() {
|
||||
return System.currentTimeMillis() - mServerIpsLastUpdatedTime >= 24 * 60 * 60 * 1000;
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置服务IP
|
||||
* 璁剧疆鏈嶅姟IP
|
||||
*
|
||||
* @return false 表示 前后服务一直,没有更新
|
||||
* @return false 琛ㄧず 鍓嶅悗鏈嶅姟涓€鐩达紝娌℃湁鏇存柊
|
||||
*/
|
||||
public synchronized boolean setServerIps(String region, String[] serverIps, int[] ports,
|
||||
String[] serverV6Ips, int[] v6Ports) {
|
||||
@@ -115,9 +115,9 @@ public class ServerConfig extends RegionServer implements SpCacheItem {
|
||||
|| !CommonUtil.isSameServer(serverV6Ips, v6Ports,
|
||||
mHttpDnsConfig.getInitServer().getIpv6ServerIps(),
|
||||
mHttpDnsConfig.getInitServer().getIpv6Ports())) {
|
||||
// 非初始化IP,才认为是真正的更新了服务IP
|
||||
// 闈炲垵濮嬪寲IP锛屾墠璁や负鏄湡姝g殑鏇存柊浜嗘湇鍔P
|
||||
this.mServerIpsLastUpdatedTime = System.currentTimeMillis();
|
||||
// 非初始IP才有缓存的必要
|
||||
// 闈炲垵濮婭P鎵嶆湁缂撳瓨鐨勫繀瑕?
|
||||
mHttpDnsConfig.saveToCache();
|
||||
}
|
||||
return changed || v6changed;
|
||||
@@ -128,9 +128,9 @@ public class ServerConfig extends RegionServer implements SpCacheItem {
|
||||
int[] serverPorts = getPorts();
|
||||
String region = getRegion();
|
||||
|
||||
//对比和当前的region server是否是同一批,避免测速完已经被更新
|
||||
//瀵规瘮鍜屽綋鍓嶇殑region server鏄惁鏄悓涓€鎵癸紝閬垮厤娴嬮€熷畬宸茬粡琚洿鏂?
|
||||
if (serverIps.length != sortedIps.length) {
|
||||
//ip数量不一致,数据已经被更新
|
||||
//ip鏁伴噺涓嶄竴鑷达紝鏁版嵁宸茬粡琚洿鏂?
|
||||
if (HttpDnsLog.isPrint()) {
|
||||
HttpDnsLog.d("abort rank server ip count changed, current ips: " + Arrays.toString(serverIps)
|
||||
+ ", sorted ips: " + Arrays.toString(sortedIps));
|
||||
@@ -139,7 +139,7 @@ public class ServerConfig extends RegionServer implements SpCacheItem {
|
||||
}
|
||||
|
||||
boolean contain;
|
||||
//如果排序的ip都在当前Server ip列表中,认为是一批服务ip,ip和端口需要一起判断
|
||||
//濡傛灉鎺掑簭鐨刬p閮藉湪褰撳墠Server ip鍒楄〃涓紝璁や负鏄竴鎵规湇鍔p锛宨p鍜岀鍙i渶瑕佷竴璧峰垽鏂?
|
||||
for (int i = 0; i != sortedIps.length; ++i) {
|
||||
contain = isContainServiceIp(serverIps, serverPorts, sortedIps[i], ports == null ? -1 : ports[i]);
|
||||
if (!contain) {
|
||||
@@ -159,7 +159,7 @@ public class ServerConfig extends RegionServer implements SpCacheItem {
|
||||
HttpDnsLog.d("update ranked server ips: " + Arrays.toString(sortedIps)
|
||||
+ ", ports: " + Arrays.toString(ports));
|
||||
}
|
||||
//仅更新内存
|
||||
//浠呮洿鏂板唴瀛?
|
||||
boolean changed = updateRegionAndIpv4(region, sortedIps, ports);
|
||||
if (changed) {
|
||||
this.mLastOkServerIndex = 0;
|
||||
@@ -168,13 +168,13 @@ public class ServerConfig extends RegionServer implements SpCacheItem {
|
||||
}
|
||||
|
||||
public synchronized void updateServerIpv6sRank(String[] sortedIps, int[] ports) {
|
||||
//和当前ip进行对比,看看是不是已经被更新了,如果被更新了那此次排序结果不使用
|
||||
//鍜屽綋鍓峣p杩涜瀵规瘮锛岀湅鐪嬫槸涓嶆槸宸茬粡琚洿鏂颁簡锛屽鏋滆鏇存柊浜嗛偅姝ゆ鎺掑簭缁撴灉涓嶄娇鐢?
|
||||
String[] serverIps = getIpv6ServerIps();
|
||||
int[] serverPorts = getIpv6Ports();
|
||||
|
||||
//对比和当前的region server是否是同一批,避免测速完已经被更新
|
||||
//瀵规瘮鍜屽綋鍓嶇殑region server鏄惁鏄悓涓€鎵癸紝閬垮厤娴嬮€熷畬宸茬粡琚洿鏂?
|
||||
if (serverIps.length != sortedIps.length) {
|
||||
//ip数量不一致,数据已经被更新
|
||||
//ip鏁伴噺涓嶄竴鑷达紝鏁版嵁宸茬粡琚洿鏂?
|
||||
if (HttpDnsLog.isPrint()) {
|
||||
HttpDnsLog.d("abort rank server ip count changed, current ipv6s: " + Arrays.toString(serverIps)
|
||||
+ ", sorted ipv6s: " + Arrays.toString(sortedIps));
|
||||
@@ -183,7 +183,7 @@ public class ServerConfig extends RegionServer implements SpCacheItem {
|
||||
}
|
||||
|
||||
boolean contain;
|
||||
//如果排序的ip都在当前Server ip列表中,认为是一批服务ip
|
||||
//濡傛灉鎺掑簭鐨刬p閮藉湪褰撳墠Server ip鍒楄〃涓紝璁や负鏄竴鎵规湇鍔p
|
||||
for (int i = 0; i != sortedIps.length; ++i) {
|
||||
contain = isContainServiceIp(serverIps, serverPorts, sortedIps[i], ports == null ? -1 : ports[i]);
|
||||
if (!contain) {
|
||||
@@ -204,7 +204,7 @@ public class ServerConfig extends RegionServer implements SpCacheItem {
|
||||
+ ", ports: " + Arrays.toString(ports));
|
||||
}
|
||||
|
||||
//仅更新内存
|
||||
//浠呮洿鏂板唴瀛?
|
||||
boolean v6changed = updateIpv6(sortedIps, ports);
|
||||
if (v6changed) {
|
||||
mLastOkServerIndexForV6 = 0;
|
||||
@@ -239,11 +239,11 @@ public class ServerConfig extends RegionServer implements SpCacheItem {
|
||||
}
|
||||
|
||||
/**
|
||||
* 切换域名解析服务
|
||||
* 鍒囨崲鍩熷悕瑙f瀽鏈嶅姟
|
||||
*
|
||||
* @param ip 请求失败的服务IP
|
||||
* @param port 请求失败的服务端口
|
||||
* @return 是否切换回了最开始的服务。当请求切换的ip和port不是当前ip和port时,说明这个切换请求是无效的,不切换,返回false 认为没有切换回最开始的ip
|
||||
* @param ip 璇锋眰澶辫触鐨勬湇鍔P
|
||||
* @param port 璇锋眰澶辫触鐨勬湇鍔$鍙?
|
||||
* @return 鏄惁鍒囨崲鍥炰簡鏈€寮€濮嬬殑鏈嶅姟銆傚綋璇锋眰鍒囨崲鐨刬p鍜宲ort涓嶆槸褰撳墠ip鍜宲ort鏃讹紝璇存槑杩欎釜鍒囨崲璇锋眰鏄棤鏁堢殑锛屼笉鍒囨崲锛岃繑鍥瀎alse 璁や负娌℃湁鍒囨崲鍥炴渶寮€濮嬬殑ip
|
||||
*/
|
||||
public boolean shiftServer(String ip, int port) {
|
||||
return shiftServerV4(ip, port);
|
||||
@@ -284,9 +284,9 @@ public class ServerConfig extends RegionServer implements SpCacheItem {
|
||||
}
|
||||
|
||||
/**
|
||||
* 标记当前好用的域名解析服务
|
||||
* 鏍囪褰撳墠濂界敤鐨勫煙鍚嶈В鏋愭湇鍔?
|
||||
*
|
||||
* @return 标记成功与否
|
||||
* @return 鏍囪鎴愬姛涓庡惁
|
||||
*/
|
||||
public boolean markOkServer(String serverIp, int port) {
|
||||
final String[] serverIps = getServerIps();
|
||||
@@ -306,9 +306,9 @@ public class ServerConfig extends RegionServer implements SpCacheItem {
|
||||
}
|
||||
|
||||
/**
|
||||
* 标记当前好用的域名解析服务
|
||||
* 鏍囪褰撳墠濂界敤鐨勫煙鍚嶈В鏋愭湇鍔?
|
||||
*
|
||||
* @return 标记成功与否
|
||||
* @return 鏍囪鎴愬姛涓庡惁
|
||||
*/
|
||||
public boolean markOkServerV6(String serverIp, int port) {
|
||||
final String[] serverIps = getIpv6ServerIps();
|
||||
@@ -353,7 +353,7 @@ public class ServerConfig extends RegionServer implements SpCacheItem {
|
||||
public void restoreFromCache(SharedPreferences sp) {
|
||||
String cachedServerRegion = sp.getString(Constants.CONFIG_CURRENT_SERVER_REGION,
|
||||
getRegion());
|
||||
//初始化region和缓存server region一致的情况,使用缓存的服务IP。否则初始化的region优先级更高
|
||||
//鍒濆鍖杛egion鍜岀紦瀛榮erver region涓€鑷寸殑鎯呭喌锛屼娇鐢ㄧ紦瀛樼殑鏈嶅姟IP銆傚惁鍒欏垵濮嬪寲鐨剅egion浼樺厛绾ф洿楂?
|
||||
if (CommonUtil.regionEquals(cachedServerRegion, getRegion())) {
|
||||
if (HttpDnsLog.isPrint()) {
|
||||
HttpDnsLog.d("restore service ip of " + (TextUtils.isEmpty(cachedServerRegion) ? "default" : cachedServerRegion));
|
||||
@@ -390,3 +390,4 @@ public class ServerConfig extends RegionServer implements SpCacheItem {
|
||||
editor.putString(Constants.CONFIG_CURRENT_SERVER_REGION, getRegion());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -7,3 +7,4 @@ public interface SpCacheItem {
|
||||
|
||||
void saveToCache(SharedPreferences.Editor editor);
|
||||
}
|
||||
|
||||
|
||||
@@ -16,10 +16,10 @@ public class AmericaRegionServer {
|
||||
private static final int[] IPV6_PORTS = null;
|
||||
|
||||
private static final String[] UPDATE_SERVER = new String[] {
|
||||
"resolvers-us.httpdns.aliyuncs.com"
|
||||
"resolvers-us.httpdns.Aliyuncs.com"
|
||||
};
|
||||
private static final String[] IPV6_UPDATE_SERVER = new String[] {
|
||||
"resolvers-us.httpdns.aliyuncs.com"
|
||||
"resolvers-us.httpdns.Aliyuncs.com"
|
||||
};
|
||||
|
||||
public static RegionServer getInitServer() {
|
||||
@@ -30,3 +30,4 @@ public class AmericaRegionServer {
|
||||
return new RegionServer(UPDATE_SERVER, Constants.NO_PORTS, IPV6_UPDATE_SERVER, Constants.NO_PORTS, Constants.REGION_US);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -22,10 +22,10 @@ public final class DefaultRegionServer {
|
||||
private static final int[] IPV6_PORTS = null;
|
||||
|
||||
private static final String[] UPDATE_SERVER = new String[] {
|
||||
"resolvers-cn.httpdns.aliyuncs.com"
|
||||
"resolvers-cn.httpdns.Aliyuncs.com"
|
||||
};
|
||||
private static final String[] IPV6_UPDATE_SERVER = new String[] {
|
||||
"resolvers-cn.httpdns.aliyuncs.com"
|
||||
"resolvers-cn.httpdns.Aliyuncs.com"
|
||||
};
|
||||
|
||||
public static RegionServer getInitServer() {
|
||||
@@ -36,3 +36,4 @@ public final class DefaultRegionServer {
|
||||
return new RegionServer(UPDATE_SERVER, Constants.NO_PORTS, IPV6_UPDATE_SERVER, Constants.NO_PORTS, Constants.REGION_DEFAULT);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -17,10 +17,10 @@ public class GermanyRegionServer {
|
||||
private static final int[] IPV6_PORTS = null;
|
||||
|
||||
private static final String[] UPDATE_SERVER = new String[] {
|
||||
"resolvers-de.httpdns.aliyuncs.com"
|
||||
"resolvers-de.httpdns.Aliyuncs.com"
|
||||
};
|
||||
private static final String[] IPV6_UPDATE_SERVER = new String[] {
|
||||
"resolvers-de.httpdns.aliyuncs.com"
|
||||
"resolvers-de.httpdns.Aliyuncs.com"
|
||||
};
|
||||
|
||||
public static RegionServer getInitServer() {
|
||||
@@ -31,3 +31,4 @@ public class GermanyRegionServer {
|
||||
return new RegionServer(UPDATE_SERVER, Constants.NO_PORTS, IPV6_UPDATE_SERVER, Constants.NO_PORTS, Constants.REGION_DE);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -16,10 +16,10 @@ public class HongKongRegionServer {
|
||||
private static final int[] IPV6_PORTS = null;
|
||||
|
||||
private static final String[] UPDATE_SERVER = new String[] {
|
||||
"resolvers-hk.httpdns.aliyuncs.com"
|
||||
"resolvers-hk.httpdns.Aliyuncs.com"
|
||||
};
|
||||
private static final String[] IPV6_UPDATE_SERVER = new String[] {
|
||||
"resolvers-hk.httpdns.aliyuncs.com"
|
||||
"resolvers-hk.httpdns.Aliyuncs.com"
|
||||
};
|
||||
|
||||
public static RegionServer getInitServer() {
|
||||
@@ -30,3 +30,4 @@ public class HongKongRegionServer {
|
||||
return new RegionServer(UPDATE_SERVER, Constants.NO_PORTS, IPV6_UPDATE_SERVER, Constants.NO_PORTS, Constants.REGION_HK);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -9,15 +9,15 @@ public class PreReleaseRegionServer {
|
||||
};
|
||||
private static final int[] PORTS = null;
|
||||
private static final String[] IPV6_SERVER_IPS = new String [] {
|
||||
"resolvers-cn-pre.httpdns.aliyuncs.com"
|
||||
"resolvers-cn-pre.httpdns.Aliyuncs.com"
|
||||
};
|
||||
private static final int[] IPV6_PORTS = null;
|
||||
|
||||
private static final String[] UPDATE_SERVER = new String[] {
|
||||
"resolvers-cn-pre.httpdns.aliyuncs.com"
|
||||
"resolvers-cn-pre.httpdns.Aliyuncs.com"
|
||||
};
|
||||
private static final String[] IPV6_UPDATE_SERVER = new String[] {
|
||||
"resolvers-cn-pre.httpdns.aliyuncs.com"
|
||||
"resolvers-cn-pre.httpdns.Aliyuncs.com"
|
||||
};
|
||||
|
||||
public static RegionServer getInitServer() {
|
||||
@@ -28,3 +28,4 @@ public class PreReleaseRegionServer {
|
||||
return new RegionServer(UPDATE_SERVER, Constants.NO_PORTS, IPV6_UPDATE_SERVER, Constants.NO_PORTS, Constants.REGION_DEBUG_PRE);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -74,3 +74,4 @@ public class RegionServerManager {
|
||||
return regionServer;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -16,10 +16,10 @@ public class SingaporeRegionServer {
|
||||
private static final int[] IPV6_PORTS = null;
|
||||
|
||||
private static final String[] UPDATE_SERVER = new String[] {
|
||||
"resolvers-sg.httpdns.aliyuncs.com"
|
||||
"resolvers-sg.httpdns.Aliyuncs.com"
|
||||
};
|
||||
private static final String[] IPV6_UPDATE_SERVER = new String[] {
|
||||
"resolvers-sg.httpdns.aliyuncs.com"
|
||||
"resolvers-sg.httpdns.Aliyuncs.com"
|
||||
};
|
||||
|
||||
public static RegionServer getInitServer() {
|
||||
@@ -30,3 +30,4 @@ public class SingaporeRegionServer {
|
||||
return new RegionServer(UPDATE_SERVER, Constants.NO_PORTS, IPV6_UPDATE_SERVER, Constants.NO_PORTS, Constants.REGION_SG);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@ package com.alibaba.sdk.android.httpdns.exception;
|
||||
import com.alibaba.sdk.android.httpdns.log.HttpDnsLog;
|
||||
|
||||
public class HttpDnsUncaughtExceptionHandler implements Thread.UncaughtExceptionHandler {
|
||||
// 处理所有未捕获异常
|
||||
// 澶勭悊鎵€鏈夋湭鎹曡幏寮傚父
|
||||
public void uncaughtException(Thread thread, Throwable ex) {
|
||||
try {
|
||||
HttpDnsLog.e("Catch an uncaught exception, " + thread.getName() + ", error message: "
|
||||
@@ -19,3 +19,4 @@ public class HttpDnsUncaughtExceptionHandler implements Thread.UncaughtException
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -6,3 +6,4 @@ public class InitException extends RuntimeException {
|
||||
super(msg);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -161,3 +161,4 @@ public class AESEncryptService {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -176,3 +176,4 @@ public class ErrorImpl implements HttpDnsService, SyncService {
|
||||
return Constants.EMPTY;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -22,12 +22,12 @@ public class HostResolveLocker {
|
||||
|
||||
if (type == RequestIpType.both) {
|
||||
if (mBothResolvingHost.contains(host)) {
|
||||
// 正在解析
|
||||
// 姝e湪瑙f瀽
|
||||
return false;
|
||||
} else {
|
||||
synchronized (mLock) {
|
||||
if (mBothResolvingHost.contains(host)) {
|
||||
// 正在解析
|
||||
// 姝e湪瑙f瀽
|
||||
return false;
|
||||
} else {
|
||||
mBothResolvingHost.add(host);
|
||||
@@ -159,3 +159,4 @@ public class HostResolveLocker {
|
||||
return recorder.await(host, type, timeout, unit);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -17,13 +17,13 @@ public class HostResolveRecorder {
|
||||
if (type == RequestIpType.both) {
|
||||
if (mBothResolvingHost.contains(host) || (mV4ResolvingHost.contains(host)
|
||||
&& mV6ResolvingHost.contains(host))) {
|
||||
// 正在解析
|
||||
// 姝e湪瑙f瀽
|
||||
return false;
|
||||
} else {
|
||||
synchronized (mLock) {
|
||||
if (mBothResolvingHost.contains(host) || (mV4ResolvingHost.contains(host)
|
||||
&& mV6ResolvingHost.contains(host))) {
|
||||
// 正在解析
|
||||
// 姝e湪瑙f瀽
|
||||
return false;
|
||||
} else {
|
||||
mBothResolvingHost.add(host);
|
||||
@@ -117,3 +117,4 @@ public class HostResolveRecorder {
|
||||
recorder.endResolve(host, type);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -25,62 +25,62 @@ import android.content.pm.PackageManager;
|
||||
import android.os.Build;
|
||||
|
||||
/**
|
||||
* httpdns的配置
|
||||
* httpdns鐨勯厤缃?
|
||||
*/
|
||||
public class HttpDnsConfig implements SpCacheItem {
|
||||
private final Context mContext;
|
||||
private boolean mEnabled = Constants.DEFAULT_SDK_ENABLE;
|
||||
/**
|
||||
* 初始服务节点
|
||||
* 鍒濆鏈嶅姟鑺傜偣
|
||||
*/
|
||||
private RegionServer mInitServer;
|
||||
|
||||
/**
|
||||
* 兜底的调度服务IP,用于应对国际版服务IP有可能不稳定的情况
|
||||
* 鍏滃簳鐨勮皟搴︽湇鍔P锛岀敤浜庡簲瀵瑰浗闄呯増鏈嶅姟IP鏈夊彲鑳戒笉绋冲畾鐨勬儏鍐?
|
||||
*/
|
||||
private RegionServer mDefaultUpdateServer;
|
||||
|
||||
/**
|
||||
* 当前服务节点
|
||||
* 褰撳墠鏈嶅姟鑺傜偣
|
||||
*/
|
||||
private final ServerConfig mCurrentServer;
|
||||
|
||||
/**
|
||||
* 用户的accountId
|
||||
* 鐢ㄦ埛鐨刟ccountId
|
||||
*/
|
||||
private final String mAccountId;
|
||||
/**
|
||||
* 当前请求使用的schema
|
||||
* 褰撳墠璇锋眰浣跨敤鐨剆chema
|
||||
*/
|
||||
private String mSchema = Constants.DEFAULT_SCHEMA;
|
||||
/**
|
||||
* 当前region
|
||||
* 褰撳墠region
|
||||
*/
|
||||
private String mRegion;
|
||||
/**
|
||||
* 超时时长
|
||||
* 瓒呮椂鏃堕暱
|
||||
*/
|
||||
private int mTimeout = Constants.DEFAULT_TIMEOUT;
|
||||
|
||||
/**
|
||||
* 是否禁用服务,以避免崩溃
|
||||
* 鏄惁绂佺敤鏈嶅姟锛屼互閬垮厤宕╂簝
|
||||
*/
|
||||
private boolean mHitCrashDefend;
|
||||
/**
|
||||
* 是否远程禁用服务
|
||||
* 鏄惁杩滅▼绂佺敤鏈嶅姟
|
||||
*/
|
||||
private boolean mRemoteDisabled = false;
|
||||
/**
|
||||
* 是否禁用probe能力
|
||||
* 鏄惁绂佺敤probe鑳藉姏
|
||||
*/
|
||||
private boolean mIPRankingDisabled = false;
|
||||
/**
|
||||
* 是否开启降级到Local Dns
|
||||
* 鏄惁寮€鍚檷绾у埌Local Dns
|
||||
*/
|
||||
private boolean mEnableDegradationLocalDns = Constants.DEFAULT_ENABLE_DEGRADATION_LOCAL_DNS;
|
||||
|
||||
/**
|
||||
* 网络探测接口
|
||||
* 缃戠粶鎺㈡祴鎺ュ彛
|
||||
*/
|
||||
private HttpDnsSettings.NetworkDetector mNetworkDetector = null;
|
||||
|
||||
@@ -102,14 +102,14 @@ public class HttpDnsConfig implements SpCacheItem {
|
||||
mUA = buildUA();
|
||||
}
|
||||
|
||||
//region提前设置
|
||||
//region鎻愬墠璁剧疆
|
||||
mRegion = getInitRegion(accountId);
|
||||
mInitServer = RegionServerManager.getInitServer(mRegion);
|
||||
mDefaultUpdateServer = RegionServerManager.getUpdateServer(mRegion);
|
||||
|
||||
mCurrentServer = new ServerConfig(this, mInitServer.getServerIps(), mInitServer.getPorts(), mInitServer.getIpv6ServerIps(), mInitServer.getIpv6Ports());
|
||||
mObservableConfig = new ObservableConfig();
|
||||
// 先从缓存读取数据,再赋值cacheHelper, 避免在读取缓存过程中,触发写缓存操作
|
||||
// 鍏堜粠缂撳瓨璇诲彇鏁版嵁锛屽啀璧嬪€糲acheHelper锛?閬垮厤鍦ㄨ鍙栫紦瀛樿繃绋嬩腑锛岃Е鍙戝啓缂撳瓨鎿嶄綔
|
||||
ConfigCacheHelper helper = new ConfigCacheHelper();
|
||||
if (context != null) {
|
||||
helper.restoreFromCache(context, this);
|
||||
@@ -167,9 +167,9 @@ public class HttpDnsConfig implements SpCacheItem {
|
||||
}
|
||||
|
||||
/**
|
||||
* 是否启用httpdns
|
||||
* 鏄惁鍚敤httpdns
|
||||
* <p>
|
||||
* 注意是 永久禁用,因为缓存的原因,一旦禁用,就没有机会启用了
|
||||
* 娉ㄦ剰鏄?姘镐箙绂佺敤锛屽洜涓虹紦瀛樼殑鍘熷洜锛屼竴鏃︾鐢紝灏辨病鏈夋満浼氬惎鐢ㄤ簡
|
||||
*/
|
||||
public void setEnabled(boolean enabled) {
|
||||
if (this.mEnabled != enabled) {
|
||||
@@ -214,16 +214,16 @@ public class HttpDnsConfig implements SpCacheItem {
|
||||
}
|
||||
|
||||
public void setWorker(ExecutorService worker) {
|
||||
// 给测试使用
|
||||
// 缁欐祴璇曚娇鐢?
|
||||
this.mWorker = worker;
|
||||
this.mDbWorker = worker;
|
||||
mResolveWorker = worker;
|
||||
}
|
||||
|
||||
/**
|
||||
* 切换https
|
||||
* 鍒囨崲https
|
||||
*
|
||||
* @return 配置是否变化
|
||||
* @return 閰嶇疆鏄惁鍙樺寲
|
||||
*/
|
||||
public boolean setHTTPSRequestEnabled(boolean enabled) {
|
||||
String oldSchema = mSchema;
|
||||
@@ -247,7 +247,7 @@ public class HttpDnsConfig implements SpCacheItem {
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置用户切换的region
|
||||
* 璁剧疆鐢ㄦ埛鍒囨崲鐨剅egion
|
||||
*/
|
||||
public boolean setRegion(String region) {
|
||||
if (!mRegion.equals(region)) {
|
||||
@@ -261,7 +261,7 @@ public class HttpDnsConfig implements SpCacheItem {
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取ipv6的服务节点
|
||||
* 鑾峰彇ipv6鐨勬湇鍔¤妭鐐?
|
||||
*/
|
||||
public String[] getIpv6ServerIps() {
|
||||
return this.mCurrentServer.getIpv6ServerIps();
|
||||
@@ -316,10 +316,10 @@ public class HttpDnsConfig implements SpCacheItem {
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置初始服务IP
|
||||
* 璁剧疆鍒濆鏈嶅姟IP
|
||||
* <p>
|
||||
* 线上SDK 初始化服务IP是内置写死的。
|
||||
* 本API主要用于一些测试代码使用
|
||||
* 绾夸笂SDK 鍒濆鍖栨湇鍔P鏄唴缃啓姝荤殑銆?
|
||||
* 鏈珹PI涓昏鐢ㄤ簬涓€浜涙祴璇曚唬鐮佷娇鐢?
|
||||
*
|
||||
*/
|
||||
public void setInitServers(String initRegion, String[] initIps, int[] initPorts,
|
||||
@@ -344,8 +344,8 @@ public class HttpDnsConfig implements SpCacheItem {
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置兜底的调度IP,
|
||||
* 测试代码使用
|
||||
* 璁剧疆鍏滃簳鐨勮皟搴P锛?
|
||||
* 娴嬭瘯浠g爜浣跨敤
|
||||
*/
|
||||
public void setDefaultUpdateServer(String[] ips, int[] ports) {
|
||||
this.mDefaultUpdateServer.updateRegionAndIpv4(this.mInitServer.getRegion(), ips, ports);
|
||||
@@ -379,7 +379,7 @@ public class HttpDnsConfig implements SpCacheItem {
|
||||
this.mNetworkDetector = networkDetector;
|
||||
}
|
||||
|
||||
// 缓存相关的 处理,暂时放这里
|
||||
// 缂撳瓨鐩稿叧鐨?澶勭悊锛屾殏鏃舵斁杩欓噷
|
||||
|
||||
public void saveToCache() {
|
||||
if (mCacheHelper != null && mContext != null) {
|
||||
@@ -429,3 +429,4 @@ public class HttpDnsConfig implements SpCacheItem {
|
||||
+ ";" + "HTTPDNS" + "/" + BuildConfig.VERSION_NAME;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -5,8 +5,9 @@ import android.content.Context;
|
||||
import com.alibaba.sdk.android.httpdns.HttpDnsService;
|
||||
|
||||
/**
|
||||
* httpdns服务创建接口
|
||||
* httpdns鏈嶅姟鍒涘缓鎺ュ彛
|
||||
*/
|
||||
public interface HttpDnsCreator {
|
||||
HttpDnsService create(Context context, String accountId, String secretKey);
|
||||
}
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ import com.alibaba.sdk.android.httpdns.log.HttpDnsLog;
|
||||
import java.util.HashMap;
|
||||
|
||||
/**
|
||||
* HttpDnsService 实例持有者
|
||||
* HttpDnsService 瀹炰緥鎸佹湁鑰?
|
||||
*/
|
||||
public class HttpDnsInstanceHolder {
|
||||
|
||||
@@ -40,3 +40,4 @@ public class HttpDnsInstanceHolder {
|
||||
return service;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -45,7 +45,7 @@ import android.os.Looper;
|
||||
import android.text.TextUtils;
|
||||
|
||||
/**
|
||||
* 域名解析服务 httpdns接口的实现
|
||||
* 鍩熷悕瑙f瀽鏈嶅姟 httpdns鎺ュ彛鐨勫疄鐜?
|
||||
*/
|
||||
public class HttpDnsServiceImpl implements HttpDnsService, OnRegionServerIpUpdate,
|
||||
NetworkStateManager.OnNetworkChange, SyncService {
|
||||
@@ -64,7 +64,7 @@ public class HttpDnsServiceImpl implements HttpDnsService, OnRegionServerIpUpdat
|
||||
private boolean resolveAfterNetworkChange = true;
|
||||
private boolean mUseCustomServiceHosts = false;
|
||||
/**
|
||||
* crash defend 默认关闭
|
||||
* crash defend 榛樿鍏抽棴
|
||||
*/
|
||||
private boolean mCrashDefendEnabled = false;
|
||||
public static Context sContext;
|
||||
@@ -135,21 +135,21 @@ public class HttpDnsServiceImpl implements HttpDnsService, OnRegionServerIpUpdat
|
||||
InitConfig config = InitConfig.getInitConfig(accountId);
|
||||
|
||||
if (config != null) {
|
||||
// 先设置和网络相关的内容
|
||||
// 鍏堣缃拰缃戠粶鐩稿叧鐨勫唴瀹?
|
||||
this.mHttpDnsConfig.setTimeout(config.getTimeout());
|
||||
this.mHttpDnsConfig.setHTTPSRequestEnabled(config.isEnableHttps());
|
||||
mHttpDnsConfig.setBizTags(config.getBizTags());
|
||||
mHttpDnsConfig.setEnableDegradationLocalDns(config.isEnableDegradationLocalDns());
|
||||
// 再设置一些可以提前,没有副作用的内容
|
||||
// 鍐嶈缃竴浜涘彲浠ユ彁鍓嶏紝娌℃湁鍓綔鐢ㄧ殑鍐呭
|
||||
mResolveHostService.setEnableExpiredIp(config.isEnableExpiredIp());
|
||||
if (config.getIPRankingList() != null) {
|
||||
mIpIPRankingService.setIPRankingList(config.getIPRankingList());
|
||||
}
|
||||
// 设置region 必须在 读取缓存之前。2.4.1版本开始region初始化提前到HttpDnsConfig初始化
|
||||
// 璁剧疆region 蹇呴』鍦?璇诲彇缂撳瓨涔嬪墠銆?.4.1鐗堟湰寮€濮媟egion鍒濆鍖栨彁鍓嶅埌HttpDnsConfig鍒濆鍖?
|
||||
|
||||
// 设置 主站域名 需要在 读取缓存之前
|
||||
// 璁剧疆 涓荤珯鍩熷悕 闇€瑕佸湪 璇诲彇缂撳瓨涔嬪墠
|
||||
this.mResultRepo.setHostListWhichIpFixed(config.getHostListWithFixedIp());
|
||||
// 设置缓存控制,并读取缓存
|
||||
// 璁剧疆缂撳瓨鎺у埗锛屽苟璇诲彇缂撳瓨
|
||||
mResultRepo.setCachedIPEnabled(config.isEnableCacheIp(), config.getExpiredThresholdMillis());
|
||||
this.mResultRepo.setCacheTtlChanger(config.getCacheTtlChanger());
|
||||
resolveAfterNetworkChange = config.isResolveAfterNetworkChange();
|
||||
@@ -249,7 +249,7 @@ public class HttpDnsServiceImpl implements HttpDnsService, OnRegionServerIpUpdat
|
||||
}
|
||||
mRequestHandler.resetStatus();
|
||||
|
||||
//服务IP更新,触发服务IP测速
|
||||
//鏈嶅姟IP鏇存柊锛岃Е鍙戞湇鍔P娴嬮€?
|
||||
if (!mUseCustomServiceHosts) {
|
||||
mRegionServerRankingService.rankServiceIp(mHttpDnsConfig.getCurrentServer());
|
||||
}
|
||||
@@ -644,7 +644,7 @@ public class HttpDnsServiceImpl implements HttpDnsService, OnRegionServerIpUpdat
|
||||
boolean changed = mHttpDnsConfig.setRegion(region);
|
||||
if (changed) {
|
||||
mResultRepo.clearMemoryCache();
|
||||
//region变化,服务IP变成对应的预置IP,触发测速
|
||||
//region鍙樺寲锛屾湇鍔P鍙樻垚瀵瑰簲鐨勯缃甀P锛岃Е鍙戞祴閫?
|
||||
if (!mUseCustomServiceHosts) {
|
||||
mRegionServerRankingService.rankServiceIp(mHttpDnsConfig.getCurrentServer());
|
||||
}
|
||||
@@ -710,24 +710,24 @@ public class HttpDnsServiceImpl implements HttpDnsService, OnRegionServerIpUpdat
|
||||
mHttpDnsConfig.getWorker().execute(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
// 获取当前网络标识
|
||||
// 鑾峰彇褰撳墠缃戠粶鏍囪瘑
|
||||
String requestNetworkKey = getCurrentNetworkKey();
|
||||
|
||||
// 获取历史域名
|
||||
// 鑾峰彇鍘嗗彶鍩熷悕
|
||||
HashMap<String, RequestIpType> allHost = mResultRepo.getAllHostWithoutFixedIP();
|
||||
|
||||
if (HttpDnsLog.isPrint()) {
|
||||
HttpDnsLog.d("network change to " + requestNetworkKey + ", smart resolve hosts");
|
||||
}
|
||||
|
||||
// 智能增量解析
|
||||
// 鏅鸿兘澧為噺瑙f瀽
|
||||
if (resolveAfterNetworkChange && mHttpDnsConfig.isEnabled()) {
|
||||
smartBatchResolve(allHost, requestNetworkKey);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
//网络变化,触发服务IP测速
|
||||
//缃戠粶鍙樺寲锛岃Е鍙戞湇鍔P娴嬮€?
|
||||
if (!mUseCustomServiceHosts) {
|
||||
mRegionServerRankingService.rankServiceIp(mHttpDnsConfig.getCurrentServer());
|
||||
}
|
||||
@@ -778,11 +778,11 @@ public class HttpDnsServiceImpl implements HttpDnsService, OnRegionServerIpUpdat
|
||||
public void cleanHostCache(ArrayList<String> hosts) {
|
||||
CleanHostCacheEvent cleanHostCacheEvent = new CleanHostCacheEvent();
|
||||
if (hosts == null || hosts.size() == 0) {
|
||||
// 清理所有host
|
||||
// 娓呯悊鎵€鏈塰ost
|
||||
mResultRepo.clear();
|
||||
cleanHostCacheEvent.setTag(ObservableConstants.CLEAN_ALL_HOST_CACHE);
|
||||
} else {
|
||||
// 清理选中的host
|
||||
// 娓呯悊閫変腑鐨刪ost
|
||||
cleanHostCacheEvent.setTag(ObservableConstants.CLEAN_SPECIFY_HOST_CACHE);
|
||||
mResultRepo.clear(hosts);
|
||||
}
|
||||
@@ -887,22 +887,22 @@ public class HttpDnsServiceImpl implements HttpDnsService, OnRegionServerIpUpdat
|
||||
}
|
||||
|
||||
/**
|
||||
* 智能增量解析:只解析当前网络环境下缺失的域名
|
||||
* 鏅鸿兘澧為噺瑙f瀽锛氬彧瑙f瀽褰撳墠缃戠粶鐜涓嬬己澶辩殑鍩熷悕
|
||||
*
|
||||
* @param allHosts 所有历史域名
|
||||
* @param requestNetworkKey 请求时的网络标识
|
||||
* @param allHosts 鎵€鏈夊巻鍙插煙鍚?
|
||||
* @param requestNetworkKey 璇锋眰鏃剁殑缃戠粶鏍囪瘑
|
||||
*/
|
||||
private void smartBatchResolve(HashMap<String, RequestIpType> allHosts, String requestNetworkKey) {
|
||||
ArrayList<String> v4List = new ArrayList<>();
|
||||
ArrayList<String> v6List = new ArrayList<>();
|
||||
ArrayList<String> bothList = new ArrayList<>();
|
||||
|
||||
// 检查当前网络环境下是否需要解析
|
||||
// 妫€鏌ュ綋鍓嶇綉缁滅幆澧冧笅鏄惁闇€瑕佽В鏋?
|
||||
for (Map.Entry<String, RequestIpType> entry : allHosts.entrySet()) {
|
||||
String host = entry.getKey();
|
||||
RequestIpType type = entry.getValue();
|
||||
|
||||
// 使用请求时的网络标识检查缓存
|
||||
// 浣跨敤璇锋眰鏃剁殑缃戠粶鏍囪瘑妫€鏌ョ紦瀛?
|
||||
if (needsResolveInNetwork(host, type, requestNetworkKey)) {
|
||||
if (type == RequestIpType.v4) {
|
||||
v4List.add(host);
|
||||
@@ -914,7 +914,7 @@ public class HttpDnsServiceImpl implements HttpDnsService, OnRegionServerIpUpdat
|
||||
}
|
||||
}
|
||||
|
||||
// 使用带网络标识的批量解析方法
|
||||
// 浣跨敤甯︾綉缁滄爣璇嗙殑鎵归噺瑙f瀽鏂规硶
|
||||
if (v4List.size() > 0) {
|
||||
mBatchResolveHostService.batchResolveHostAsync(v4List, RequestIpType.v4);
|
||||
}
|
||||
@@ -933,26 +933,27 @@ public class HttpDnsServiceImpl implements HttpDnsService, OnRegionServerIpUpdat
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查指定网络环境下是否需要解析域名
|
||||
* 妫€鏌ユ寚瀹氱綉缁滅幆澧冧笅鏄惁闇€瑕佽В鏋愬煙鍚?
|
||||
*
|
||||
* @param host 域名
|
||||
* @param type 解析类型
|
||||
* @param networkKey 网络标识
|
||||
* @return 是否需要解析
|
||||
* @param host 鍩熷悕
|
||||
* @param type 瑙f瀽绫诲瀷
|
||||
* @param networkKey 缃戠粶鏍囪瘑
|
||||
* @return 鏄惁闇€瑕佽В鏋?
|
||||
*/
|
||||
private boolean needsResolveInNetwork(String host, RequestIpType type, String networkKey) {
|
||||
// 检查指定网络环境下是否有有效缓存
|
||||
// 妫€鏌ユ寚瀹氱綉缁滅幆澧冧笅鏄惁鏈夋湁鏁堢紦瀛?
|
||||
ResolveHostCache cache = mResultRepo.getCacheGroup().getCache(networkKey);
|
||||
HTTPDNSResultWrapper result = cache.getResult(host, type);
|
||||
return result == null || result.isExpired();
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取当前网络标识,用于网络隔离缓存
|
||||
* 鑾峰彇褰撳墠缃戠粶鏍囪瘑锛岀敤浜庣綉缁滈殧绂荤紦瀛?
|
||||
*
|
||||
* @return 当前网络标识
|
||||
* @return 褰撳墠缃戠粶鏍囪瘑
|
||||
*/
|
||||
private String getCurrentNetworkKey() {
|
||||
return NetworkStateManager.getInstance().getCurrentNetworkKey();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -45,7 +45,7 @@ public class SignService {
|
||||
public String sign(Map<String, String> param) {
|
||||
if (TextUtils.isEmpty(mSecretKey)) {
|
||||
if (HttpDnsLog.isPrint()) {
|
||||
HttpDnsLog.d("secretKey为空.");
|
||||
HttpDnsLog.d("secretKey为空");
|
||||
}
|
||||
return "";
|
||||
}
|
||||
@@ -67,8 +67,7 @@ public class SignService {
|
||||
}
|
||||
|
||||
/**
|
||||
* 新版 /resolve 请求签名:
|
||||
* appId|lower(domain)|upper(qtype)|exp|nonce
|
||||
* 鏂扮増 /resolve 璇锋眰绛惧悕锛? * appId|lower(domain)|upper(qtype)|exp|nonce
|
||||
*/
|
||||
public String signResolve(String appId, String domain, String qtype, String exp, String nonce) {
|
||||
if (TextUtils.isEmpty(mSecretKey)
|
||||
@@ -139,3 +138,4 @@ public class SignService {
|
||||
return !TextUtils.isEmpty(mSecretKey);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@ import com.alibaba.sdk.android.httpdns.ILogger;
|
||||
import android.util.Log;
|
||||
|
||||
/**
|
||||
* 日志工具类
|
||||
* 鏃ュ織宸ュ叿绫?
|
||||
*/
|
||||
public class HttpDnsLog {
|
||||
|
||||
@@ -16,8 +16,8 @@ public class HttpDnsLog {
|
||||
private static final HashSet<ILogger> LOGGERS = new HashSet<>();
|
||||
|
||||
/**
|
||||
* 设置日志接口
|
||||
* 不受{@link #printToLogcat} 控制
|
||||
* 璁剧疆鏃ュ織鎺ュ彛
|
||||
* 涓嶅彈{@link #printToLogcat} 鎺у埗
|
||||
*/
|
||||
public static void setLogger(ILogger logger) {
|
||||
if (logger != null) {
|
||||
@@ -26,7 +26,7 @@ public class HttpDnsLog {
|
||||
}
|
||||
|
||||
/**
|
||||
* 移除日志接口
|
||||
* 绉婚櫎鏃ュ織鎺ュ彛
|
||||
*/
|
||||
public static void removeLogger(ILogger logger) {
|
||||
if (logger != null) {
|
||||
@@ -35,7 +35,7 @@ public class HttpDnsLog {
|
||||
}
|
||||
|
||||
/**
|
||||
* logcat开关
|
||||
* logcat寮€鍏?
|
||||
*
|
||||
* @param enable
|
||||
*/
|
||||
@@ -124,7 +124,7 @@ public class HttpDnsLog {
|
||||
}
|
||||
|
||||
/**
|
||||
* ip数组转成字符串方便输出
|
||||
* ip鏁扮粍杞垚瀛楃涓叉柟渚胯緭鍑?
|
||||
*
|
||||
* @param ips
|
||||
* @return
|
||||
@@ -142,3 +142,4 @@ public class HttpDnsLog {
|
||||
return stringBuilder.toString();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -31,7 +31,7 @@ public class HttpDnsNetworkDetector implements HttpDnsSettings.NetworkDetector {
|
||||
private Context mContext;
|
||||
|
||||
/**
|
||||
* 网络变化时,清除缓存
|
||||
* 缃戠粶鍙樺寲鏃讹紝娓呴櫎缂撳瓨
|
||||
*/
|
||||
public void cleanCache(final boolean connected) {
|
||||
if (mDisableCache) {
|
||||
@@ -42,7 +42,7 @@ public class HttpDnsNetworkDetector implements HttpDnsSettings.NetworkDetector {
|
||||
mWorker.execute(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
// 异步探测一下
|
||||
// 寮傛鎺㈡祴涓€涓?
|
||||
if (mContext != null) {
|
||||
mCache = detectNetType(mContext);
|
||||
}
|
||||
@@ -52,22 +52,22 @@ public class HttpDnsNetworkDetector implements HttpDnsSettings.NetworkDetector {
|
||||
}
|
||||
|
||||
/**
|
||||
* 是否禁用缓存,默认不禁用
|
||||
* 不确定是否存在网络链接不变的情况下,网络情况会发生变化的情况,所以提供了此开关
|
||||
* 鏄惁绂佺敤缂撳瓨锛岄粯璁や笉绂佺敤
|
||||
* 涓嶇‘瀹氭槸鍚﹀瓨鍦ㄧ綉缁滈摼鎺ヤ笉鍙樼殑鎯呭喌涓嬶紝缃戠粶鎯呭喌浼氬彂鐢熷彉鍖栫殑鎯呭喌锛屾墍浠ユ彁渚涗簡姝ゅ紑鍏?
|
||||
*/
|
||||
public void disableCache(boolean disable) {
|
||||
this.mDisableCache = disable;
|
||||
}
|
||||
|
||||
/**
|
||||
* 如果不能检查本地网关ip,可以调用此接口关闭
|
||||
* 濡傛灉涓嶈兘妫€鏌ユ湰鍦扮綉鍏砳p,鍙互璋冪敤姝ゆ帴鍙e叧闂?
|
||||
*/
|
||||
public void setCheckInterface(boolean checkInterface) {
|
||||
this.mCheckInterface = checkInterface;
|
||||
}
|
||||
|
||||
/**
|
||||
* 有些场景需要通过本地解析来确认网络类型,默认使用 www.taobao.com
|
||||
* 鏈変簺鍦烘櫙闇€瑕侀€氳繃鏈湴瑙f瀽鏉ョ‘璁ょ綉缁滅被鍨嬶紝榛樿浣跨敤 www.taobao.com
|
||||
*/
|
||||
public void setHostToCheckNetType(String hostToCheckNetType) {
|
||||
this.mHostToCheckNetType = hostToCheckNetType;
|
||||
@@ -95,8 +95,8 @@ public class HttpDnsNetworkDetector implements HttpDnsSettings.NetworkDetector {
|
||||
private NetType detectNetType(Context context) {
|
||||
this.mContext = context.getApplicationContext();
|
||||
try {
|
||||
int type;// 不检查本地IP的情况下,无法过滤ipv6只有本地ip的情况,需要通过其它方式检测下。
|
||||
// 没有网络?
|
||||
int type;// 涓嶆鏌ユ湰鍦癐P鐨勬儏鍐典笅锛屾棤娉曡繃婊pv6鍙湁鏈湴ip鐨勬儏鍐碉紝闇€瑕侀€氳繃鍏跺畠鏂瑰紡妫€娴嬩笅銆?
|
||||
// 娌℃湁缃戠粶锛?
|
||||
if (mCheckInterface) {
|
||||
type = Inet64Util.getIpStack(context);
|
||||
} else {
|
||||
@@ -112,7 +112,7 @@ public class HttpDnsNetworkDetector implements HttpDnsSettings.NetworkDetector {
|
||||
} else if (type == IPV6_ONLY) {
|
||||
return NetType.v6;
|
||||
} else {
|
||||
// 没有网络?
|
||||
// 娌℃湁缃戠粶锛?
|
||||
return NetType.none;
|
||||
}
|
||||
|
||||
@@ -128,4 +128,5 @@ public class HttpDnsNetworkDetector implements HttpDnsSettings.NetworkDetector {
|
||||
private final static int IPV6_ONLY = 2;
|
||||
private final static int IP_DUAL_STACK = 3;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -54,7 +54,7 @@ public class NetworkStateManager {
|
||||
}
|
||||
this.mContext = ctx.getApplicationContext();
|
||||
|
||||
// 立即检测当前网络状态
|
||||
// 绔嬪嵆妫€娴嬪綋鍓嶇綉缁滅姸鎬?
|
||||
mWorker.execute(() -> {
|
||||
try {
|
||||
String currentNetwork = detectCurrentNetwork();
|
||||
@@ -132,7 +132,7 @@ public class NetworkStateManager {
|
||||
if (ipPrefix != null) {
|
||||
name = name + "_" + ipPrefix;
|
||||
}
|
||||
// 增加前缀,防止与用户cacheKey冲突
|
||||
// 澧炲姞鍓嶇紑锛岄槻姝笌鐢ㄦ埛cacheKey鍐茬獊
|
||||
mCurrentNetworkKey = (name == null) ? NONE_NETWORK : (NETWORK_KEY_PREFIX + name);
|
||||
|
||||
if (HttpDnsLog.isPrint()) {
|
||||
@@ -235,3 +235,4 @@ public class NetworkStateManager {
|
||||
return context.checkPermission(permission, Process.myPid(), Process.myUid());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package com.alibaba.sdk.android.httpdns.network;
|
||||
package com.alibaba.sdk.android.httpdns.network;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
@@ -19,3 +19,4 @@ public class HttpDnsAdapterException extends IOException {
|
||||
return errorCode;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package com.alibaba.sdk.android.httpdns.network;
|
||||
package com.alibaba.sdk.android.httpdns.network;
|
||||
|
||||
import com.alibaba.sdk.android.httpdns.RequestIpType;
|
||||
|
||||
@@ -68,3 +68,4 @@ public class HttpDnsAdapterOptions {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package com.alibaba.sdk.android.httpdns.network;
|
||||
package com.alibaba.sdk.android.httpdns.network;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.LinkedHashMap;
|
||||
@@ -41,3 +41,4 @@ public class HttpDnsAdapterRequest {
|
||||
return body;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package com.alibaba.sdk.android.httpdns.network;
|
||||
package com.alibaba.sdk.android.httpdns.network;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
@@ -32,3 +32,4 @@ public class HttpDnsAdapterResponse {
|
||||
return usedIp;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package com.alibaba.sdk.android.httpdns.network;
|
||||
package com.alibaba.sdk.android.httpdns.network;
|
||||
|
||||
public final class HttpDnsErrorCode {
|
||||
private HttpDnsErrorCode() {
|
||||
@@ -9,3 +9,4 @@ public final class HttpDnsErrorCode {
|
||||
public static final String HOST_ROUTE_REJECTED = "HOST_ROUTE_REJECTED";
|
||||
public static final String RESOLVE_SIGN_INVALID = "RESOLVE_SIGN_INVALID";
|
||||
}
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package com.alibaba.sdk.android.httpdns.network;
|
||||
package com.alibaba.sdk.android.httpdns.network;
|
||||
|
||||
import com.alibaba.sdk.android.httpdns.HTTPDNSResult;
|
||||
import com.alibaba.sdk.android.httpdns.HttpDnsService;
|
||||
@@ -211,7 +211,7 @@ public class HttpDnsHttpAdapter {
|
||||
try {
|
||||
SSLSocketFactory baseFactory;
|
||||
if (options.isAllowInsecureCertificatesForDebugOnly()) {
|
||||
baseFactory = trustAllSocketFactory();
|
||||
baseFactory = AlibabaAllSocketFactory();
|
||||
} else {
|
||||
baseFactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
|
||||
}
|
||||
@@ -221,7 +221,7 @@ public class HttpDnsHttpAdapter {
|
||||
}
|
||||
}
|
||||
|
||||
private SSLSocketFactory trustAllSocketFactory() throws GeneralSecurityException {
|
||||
private SSLSocketFactory AlibabaAllSocketFactory() throws GeneralSecurityException {
|
||||
TrustManager[] managers = new TrustManager[]{new X509TrustManager() {
|
||||
@Override
|
||||
public void checkClientTrusted(X509Certificate[] chain, String authType) {
|
||||
@@ -306,3 +306,4 @@ public class HttpDnsHttpAdapter {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@ import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
|
||||
public class ObservableConfig implements SpCacheItem {
|
||||
//默认关闭
|
||||
//榛樿鍏抽棴
|
||||
public boolean enable = false;
|
||||
public double sampleRatio = 1.0;
|
||||
public String endpoint = "";
|
||||
@@ -21,7 +21,7 @@ public class ObservableConfig implements SpCacheItem {
|
||||
|
||||
public boolean updateConfig(ObservableConfig config) {
|
||||
if (config == null) {
|
||||
//调度接口没有下发配置,关闭可观测
|
||||
//璋冨害鎺ュ彛娌℃湁涓嬪彂閰嶇疆锛屽叧闂彲瑙傛祴
|
||||
if (enable) {
|
||||
enable = false;
|
||||
raw = null;
|
||||
@@ -115,3 +115,4 @@ public class ObservableConfig implements SpCacheItem {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -36,3 +36,4 @@ public final class ObservableConstants {
|
||||
public static final int EMPTY_RESULT = 0x00;
|
||||
public static final int NOT_EMPTY_RESULT = 0x40;
|
||||
}
|
||||
|
||||
|
||||
@@ -96,3 +96,4 @@ public class ObservableHttpRequest<T> extends HttpRequestWrapper<T> {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -92,7 +92,7 @@ public class ObservableManager {
|
||||
}
|
||||
|
||||
/**
|
||||
* 是否开启可观测,如果关闭,则打点和上报都关闭
|
||||
* 鏄惁寮€鍚彲瑙傛祴锛屽鏋滃叧闂紝鍒欐墦鐐瑰拰涓婃姤閮藉叧闂?
|
||||
* @return
|
||||
*/
|
||||
private boolean isEnableObservable() {
|
||||
@@ -111,7 +111,7 @@ public class ObservableManager {
|
||||
}
|
||||
|
||||
if (event instanceof LocalDnsEvent) {
|
||||
//需要local dns的event,在这里统一执行local dns解析
|
||||
//闇€瑕乴ocal dns鐨別vent锛屽湪杩欓噷缁熶竴鎵цlocal dns瑙f瀽
|
||||
try {
|
||||
sWorker.execute(new Runnable() {
|
||||
@Override
|
||||
@@ -121,7 +121,7 @@ public class ObservableManager {
|
||||
}
|
||||
});
|
||||
} catch (Exception e) {
|
||||
//线程池异常,也要添加事件
|
||||
//绾跨▼姹犲紓甯革紝涔熻娣诲姞浜嬩欢
|
||||
addObservableEventInner(event);
|
||||
}
|
||||
} else {
|
||||
@@ -205,14 +205,14 @@ public class ObservableManager {
|
||||
if (HttpDnsLog.isPrint()) {
|
||||
HttpDnsLog.w("observable report rate exception.");
|
||||
}
|
||||
//关闭日志采集
|
||||
//鍏抽棴鏃ュ織閲囬泦
|
||||
mReportingRateException = true;
|
||||
}
|
||||
}
|
||||
|
||||
private void tryReport() {
|
||||
if (mCacheEvents.size() >= mHttpDnsConfig.getObservableConfig().batchReportMaxSize) {
|
||||
//达到上报数量
|
||||
//杈惧埌涓婃姤鏁伴噺
|
||||
mHandler.removeMessages(MESSAGE_REPORT);
|
||||
mHandler.sendEmptyMessage(MESSAGE_REPORT);
|
||||
}
|
||||
@@ -233,7 +233,7 @@ public class ObservableManager {
|
||||
return;
|
||||
}
|
||||
|
||||
//上报流量控制判断
|
||||
//涓婃姤娴侀噺鎺у埗鍒ゆ柇
|
||||
long current = System.currentTimeMillis();
|
||||
if (reachingReportingLimit(current)) {
|
||||
return;
|
||||
@@ -258,7 +258,7 @@ public class ObservableManager {
|
||||
return;
|
||||
}
|
||||
|
||||
//添加上报时间点,用于上报流量控制
|
||||
//娣诲姞涓婃姤鏃堕棿鐐癸紝鐢ㄤ簬涓婃姤娴侀噺鎺у埗
|
||||
mReportsTime.addLast(current);
|
||||
|
||||
HttpRequest<String> request = new ObservableHttpRequest<>(url, new ResponseParser<String>() {
|
||||
@@ -267,7 +267,7 @@ public class ObservableManager {
|
||||
return response;
|
||||
}
|
||||
}, headers, body);
|
||||
// 重试2次
|
||||
// 閲嶈瘯2娆?
|
||||
request = new RetryHttpRequest<>(request, 2);
|
||||
|
||||
mReportWorker.execute(new HttpRequestTask<>(request, new RequestCallback<String>() {
|
||||
@@ -360,7 +360,7 @@ public class ObservableManager {
|
||||
return false;
|
||||
}
|
||||
|
||||
//先移除超过每分钟上报次数的上报时间点
|
||||
//鍏堢Щ闄よ秴杩囨瘡鍒嗛挓涓婃姤娆℃暟鐨勪笂鎶ユ椂闂寸偣
|
||||
while (mReportsTime.size() > limit) {
|
||||
mReportsTime.pollFirst();
|
||||
}
|
||||
@@ -373,3 +373,4 @@ public class ObservableManager {
|
||||
return current - first < DateUtils.MINUTE_IN_MILLIS;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -22,3 +22,4 @@ public class BatchQueryHttpDnsApiEvent extends QueryHttpDnsApiEvent {
|
||||
//do nothing
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -80,3 +80,4 @@ public class CallSdkApiEvent extends ObservableEvent implements GroupEvent, Loca
|
||||
return mTag;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -42,3 +42,4 @@ public class CleanHostCacheEvent extends ObservableEvent {
|
||||
//do nothing
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
package com.alibaba.sdk.android.httpdns.observable.event;
|
||||
|
||||
/**
|
||||
* 需要聚合的事件
|
||||
* 闇€瑕佽仛鍚堢殑浜嬩欢
|
||||
*/
|
||||
public interface GroupEvent {
|
||||
boolean isSameGroup(ObservableEvent event);
|
||||
|
||||
void groupWith(ObservableEvent event);
|
||||
}
|
||||
|
||||
|
||||
@@ -60,8 +60,9 @@ public interface LocalDnsEvent {
|
||||
}
|
||||
|
||||
/**
|
||||
* 返回值和tag中的请求类型保持一致
|
||||
* 杩斿洖鍊煎拰tag涓殑璇锋眰绫诲瀷淇濇寔涓€鑷?
|
||||
* @return
|
||||
*/
|
||||
abstract int getRequestIpType();
|
||||
}
|
||||
|
||||
|
||||
@@ -164,7 +164,7 @@ public abstract class ObservableEvent {
|
||||
DIVIDER + mTimestamp +
|
||||
DIVIDER + (TextUtils.isEmpty(mServerIp) ? "" : mServerIp) +
|
||||
DIVIDER + mCostTime +
|
||||
DIVIDER + (TextUtils.isEmpty(mNetworkType) ? "" : mNetworkType) + //预留的网络类型
|
||||
DIVIDER + (TextUtils.isEmpty(mNetworkType) ? "" : mNetworkType) + //棰勭暀鐨勭綉缁滅被鍨?
|
||||
DIVIDER + ((TextUtils.isEmpty(mIpType)) ? "" : mIpType) +
|
||||
DIVIDER + mStatusCode +
|
||||
DIVIDER + (TextUtils.isEmpty(mErrorCode) ? "" : mErrorCode) +
|
||||
@@ -174,3 +174,4 @@ public abstract class ObservableEvent {
|
||||
DIVIDER + mLocalDnsCost;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -34,3 +34,4 @@ public class QueryHttpDnsApiEvent extends ObservableEvent implements LocalDnsEve
|
||||
return mTag;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -42,3 +42,4 @@ public class ReportingRateExceptionEvent extends ObservableEvent {
|
||||
//do nothing
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -50,3 +50,4 @@ public class UpdateRegionServerIpsEvent extends ObservableEvent {
|
||||
//do nothing
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
package com.alibaba.sdk.android.httpdns.ranking;
|
||||
|
||||
/**
|
||||
* IP优选配置项
|
||||
* IP浼橀€夐厤缃」
|
||||
*/
|
||||
public class IPRankingBean {
|
||||
/**
|
||||
* 进行ip优选的域名
|
||||
* 杩涜ip浼橀€夌殑鍩熷悕
|
||||
*/
|
||||
String hostName;
|
||||
/**
|
||||
* 用于测试速度的端口
|
||||
* 鐢ㄤ簬娴嬭瘯閫熷害鐨勭鍙?
|
||||
*/
|
||||
int port;
|
||||
|
||||
@@ -46,3 +46,4 @@ public class IPRankingBean {
|
||||
return hash;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
package com.alibaba.sdk.android.httpdns.ranking;
|
||||
|
||||
/**
|
||||
* IP优选的结果回调
|
||||
* IP浼橀€夌殑缁撴灉鍥炶皟
|
||||
*/
|
||||
public interface IPRankingCallback {
|
||||
void onResult(String host, String[] sortedIps);
|
||||
}
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ import java.util.concurrent.ConcurrentSkipListSet;
|
||||
import com.alibaba.sdk.android.httpdns.impl.HttpDnsConfig;
|
||||
|
||||
/**
|
||||
* IP优选服务
|
||||
* IP浼橀€夋湇鍔?
|
||||
*/
|
||||
public class IPRankingService {
|
||||
|
||||
@@ -28,7 +28,7 @@ public class IPRankingService {
|
||||
}
|
||||
|
||||
/**
|
||||
* 进行ipv4优选
|
||||
* 杩涜ipv4浼橀€?
|
||||
*/
|
||||
public void probeIpv4(String host, String[] ips, final IPRankingCallback IPRankingCallback) {
|
||||
if (mHttpDnsConfig.isIPRankingDisabled()) {
|
||||
@@ -77,3 +77,4 @@ public class IPRankingService {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ import java.net.SocketAddress;
|
||||
import com.alibaba.sdk.android.httpdns.utils.CommonUtil;
|
||||
|
||||
/**
|
||||
* ip优选实现
|
||||
* ip浼橀€夊疄鐜?
|
||||
*/
|
||||
public class IPRankingTask implements Runnable {
|
||||
|
||||
@@ -61,3 +61,4 @@ public class IPRankingTask implements Runnable {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package com.alibaba.sdk.android.httpdns.request;
|
||||
|
||||
/**
|
||||
* 数据请求转异步
|
||||
* 鏁版嵁璇锋眰杞紓姝?
|
||||
*/
|
||||
public abstract class AsyncRequestTask<T> implements Runnable {
|
||||
|
||||
@@ -12,7 +12,7 @@ public abstract class AsyncRequestTask<T> implements Runnable {
|
||||
}
|
||||
|
||||
/**
|
||||
* 请求数据,不需要直接调用,除非想要同步获取请求数据
|
||||
* 璇锋眰鏁版嵁锛屼笉闇€瑕佺洿鎺ヨ皟鐢紝闄ら潪鎯宠鍚屾鑾峰彇璇锋眰鏁版嵁
|
||||
*/
|
||||
public abstract T request() throws Throwable;
|
||||
|
||||
@@ -31,3 +31,4 @@ public abstract class AsyncRequestTask<T> implements Runnable {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -71,3 +71,4 @@ public class BatchResolveHttpRequestStatusWatcher implements HttpRequestWatcher.
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@ import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
|
||||
/**
|
||||
* 网络请求失败的异常
|
||||
* 缃戠粶璇锋眰澶辫触鐨勫紓甯?
|
||||
*/
|
||||
public class HttpException extends Exception {
|
||||
public static final int ERROR_CODE_403 = 403;
|
||||
@@ -14,55 +14,55 @@ public class HttpException extends Exception {
|
||||
public static final int ERROR_CODE_500 = 500;
|
||||
|
||||
/**
|
||||
* 用户服务level不匹配
|
||||
* (用户有不同的level,高level有一些专用的服务节点,如果一个低level的用户,向一个高level专用的服务节点请求,就会返回此错误)
|
||||
* 鐢ㄦ埛鏈嶅姟level涓嶅尮閰?
|
||||
* 锛堢敤鎴锋湁涓嶅悓鐨刲evel锛岄珮level鏈変竴浜涗笓鐢ㄧ殑鏈嶅姟鑺傜偣锛屽鏋滀竴涓綆level鐨勭敤鎴凤紝鍚戜竴涓珮level涓撶敤鐨勬湇鍔¤妭鐐硅姹傦紝灏变細杩斿洖姝ら敊璇級
|
||||
* <p>
|
||||
* 需要重试 切换服务IP
|
||||
* 闇€瑕侀噸璇?鍒囨崲鏈嶅姟IP
|
||||
*/
|
||||
public static final String ERROR_MSG_SERVICE_LEVEL_DENY = "ServiceLevelDeny";
|
||||
|
||||
/**
|
||||
* 未用签名访问
|
||||
* 不重试 不切换
|
||||
* 生成空解析 缓存1小时
|
||||
* 鏈敤绛惧悕璁块棶
|
||||
* 涓嶉噸璇?涓嶅垏鎹?
|
||||
* 鐢熸垚绌鸿В鏋?缂撳瓨1灏忔椂
|
||||
*/
|
||||
public static final String ERROR_MSG_UNSIGNED = "UnsignedInterfaceDisabled";
|
||||
|
||||
/**
|
||||
* 签名过期
|
||||
* 不重试 不切换 (sdk逻辑保证不应该过期)
|
||||
* 绛惧悕杩囨湡
|
||||
* 涓嶉噸璇?涓嶅垏鎹?锛坰dk閫昏緫淇濊瘉涓嶅簲璇ヨ繃鏈燂級
|
||||
*/
|
||||
public static final String ERROR_MSG_SIGNATURE_EXPIRED = "SignatureExpired";
|
||||
|
||||
/**
|
||||
* 签名验证失败
|
||||
* 不重试 不切换
|
||||
* 绛惧悕楠岃瘉澶辫触
|
||||
* 涓嶉噸璇?涓嶅垏鎹?
|
||||
*/
|
||||
public static final String ERROR_MSG_INVALID_SIGNATURE = "InvalidSignature";
|
||||
|
||||
/**
|
||||
* 账户服务level缺失
|
||||
* 不重试 不切换
|
||||
* 生成空解析 缓存1小时
|
||||
* 璐︽埛鏈嶅姟level缂哄け
|
||||
* 涓嶉噸璇?涓嶅垏鎹?
|
||||
* 鐢熸垚绌鸿В鏋?缂撳瓨1灏忔椂
|
||||
*/
|
||||
public static final String ERROR_MSG_INVALID_ACCOUNT = "InvalidAccount";
|
||||
|
||||
/**
|
||||
* 账户不存在或者禁用
|
||||
* 不重试 不切换
|
||||
* 生成空解析 缓存1小时
|
||||
* 璐︽埛涓嶅瓨鍦ㄦ垨鑰呯鐢?
|
||||
* 涓嶉噸璇?涓嶅垏鎹?
|
||||
* 鐢熸垚绌鸿В鏋?缂撳瓨1灏忔椂
|
||||
*/
|
||||
public static final String ERROR_MSG_ACCOUNT_NOT_EXISTS = "AccountNotExists";
|
||||
|
||||
/**
|
||||
* 签名有效时间过长
|
||||
* 不重试 不切换
|
||||
* 绛惧悕鏈夋晥鏃堕棿杩囬暱
|
||||
* 涓嶉噸璇?涓嶅垏鎹?
|
||||
*/
|
||||
public static final String ERROR_MSG_INVALID_DURATION = "InvalidDuration";
|
||||
|
||||
/**
|
||||
* 无效域名
|
||||
* 不重试 不切换
|
||||
* 鏃犳晥鍩熷悕
|
||||
* 涓嶉噸璇?涓嶅垏鎹?
|
||||
*/
|
||||
public static final String ERROR_MSG_INVALID_HOST = "InvalidHost";
|
||||
|
||||
@@ -82,10 +82,10 @@ public class HttpException extends Exception {
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建异常
|
||||
* 鍒涘缓寮傚父
|
||||
*
|
||||
* @param code
|
||||
* @param message 服务器返回的特定格式的数据
|
||||
* @param message 鏈嶅姟鍣ㄨ繑鍥炵殑鐗瑰畾鏍煎紡鐨勬暟鎹?
|
||||
* @return
|
||||
*/
|
||||
public static HttpException create(int code, String message) {
|
||||
@@ -116,7 +116,7 @@ public class HttpException extends Exception {
|
||||
}
|
||||
|
||||
/**
|
||||
* 是不是要切换服务IP
|
||||
* 鏄笉鏄鍒囨崲鏈嶅姟IP
|
||||
*/
|
||||
public boolean shouldShiftServer() {
|
||||
String msg = getMessage();
|
||||
@@ -130,7 +130,7 @@ public class HttpException extends Exception {
|
||||
}
|
||||
|
||||
/**
|
||||
* 这个错误是否建议重试
|
||||
* 杩欎釜閿欒鏄惁寤鸿閲嶈瘯
|
||||
*/
|
||||
public boolean shouldRetry() {
|
||||
String msg = getMessage();
|
||||
@@ -144,7 +144,7 @@ public class HttpException extends Exception {
|
||||
}
|
||||
|
||||
/**
|
||||
* 这个错误是否要创建空缓存
|
||||
* 杩欎釜閿欒鏄惁瑕佸垱寤虹┖缂撳瓨
|
||||
*/
|
||||
public boolean shouldCreateEmptyCache() {
|
||||
String msg = getMessage();
|
||||
@@ -153,3 +153,4 @@ public class HttpException extends Exception {
|
||||
|| ERROR_MSG_ACCOUNT_NOT_EXISTS.equals(msg);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -12,102 +12,88 @@ import javax.net.ssl.HttpsURLConnection;
|
||||
import com.alibaba.sdk.android.httpdns.log.HttpDnsLog;
|
||||
|
||||
/**
|
||||
* 网络请求
|
||||
* HTTP request wrapper for resolve APIs.
|
||||
*/
|
||||
public class HttpRequest<T> {
|
||||
private HttpRequestConfig requestConfig;
|
||||
private ResponseParser<T> translator;
|
||||
private HttpRequestConfig requestConfig;
|
||||
private ResponseParser<T> translator;
|
||||
|
||||
protected HttpRequest() {
|
||||
}
|
||||
protected HttpRequest() {
|
||||
}
|
||||
|
||||
public HttpRequest(HttpRequestConfig requestConfig, ResponseParser<T> translator) {
|
||||
this.requestConfig = requestConfig;
|
||||
this.translator = translator;
|
||||
}
|
||||
public HttpRequest(HttpRequestConfig requestConfig, ResponseParser<T> translator) {
|
||||
this.requestConfig = requestConfig;
|
||||
this.translator = translator;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取本次请求的配置
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
public HttpRequestConfig getRequestConfig() {
|
||||
return requestConfig;
|
||||
}
|
||||
public HttpRequestConfig getRequestConfig() {
|
||||
return requestConfig;
|
||||
}
|
||||
|
||||
/**
|
||||
* 发起请求
|
||||
*
|
||||
* @return 返回的数据
|
||||
* @throws Throwable 发生的错误
|
||||
*/
|
||||
public T request() throws Throwable {
|
||||
HttpURLConnection conn = null;
|
||||
InputStream in = null;
|
||||
BufferedReader streamReader = null;
|
||||
public T request() throws Throwable {
|
||||
HttpURLConnection conn = null;
|
||||
InputStream in = null;
|
||||
BufferedReader streamReader = null;
|
||||
|
||||
long start = System.currentTimeMillis();
|
||||
String serverIp = requestConfig.getIp();
|
||||
String url = requestConfig.url();
|
||||
if (HttpDnsLog.isPrint()) {
|
||||
HttpDnsLog.d("request url " + url);
|
||||
}
|
||||
try {
|
||||
conn = (HttpURLConnection)new URL(url).openConnection();
|
||||
conn.setReadTimeout(requestConfig.getTimeout());
|
||||
conn.setConnectTimeout(requestConfig.getTimeout());
|
||||
//设置通用UA
|
||||
conn.setRequestProperty("User-Agent", requestConfig.getUA());
|
||||
if (conn instanceof HttpsURLConnection) {
|
||||
((HttpsURLConnection) conn).setHostnameVerifier(HttpsURLConnection.getDefaultHostnameVerifier());
|
||||
}
|
||||
if (conn.getResponseCode() != HttpURLConnection.HTTP_OK) {
|
||||
in = conn.getErrorStream();
|
||||
if (in != null) {
|
||||
streamReader = new BufferedReader(new InputStreamReader(in, "UTF-8"));
|
||||
String errStr = readStringFrom(streamReader).toString();
|
||||
throw HttpException.create(conn.getResponseCode(), errStr);
|
||||
} else {
|
||||
throw HttpException.create(conn.getResponseCode(), "");
|
||||
}
|
||||
} else {
|
||||
in = conn.getInputStream();
|
||||
streamReader = new BufferedReader(new InputStreamReader(in, "UTF-8"));
|
||||
String responseStr = readStringFrom(streamReader).toString();
|
||||
if (HttpDnsLog.isPrint()) {
|
||||
HttpDnsLog.d("request success " + responseStr);
|
||||
}
|
||||
return translator.parse(serverIp, responseStr);
|
||||
}
|
||||
} catch (Throwable e) {
|
||||
long cost = System.currentTimeMillis() - start;
|
||||
HttpDnsLog.w("request " + url + " fail, cost " + cost, e);
|
||||
throw e;
|
||||
} finally {
|
||||
if (conn != null) {
|
||||
conn.disconnect();
|
||||
}
|
||||
try {
|
||||
if (in != null) {
|
||||
in.close();
|
||||
}
|
||||
if (streamReader != null) {
|
||||
streamReader.close();
|
||||
}
|
||||
} catch (IOException ignored) {
|
||||
}
|
||||
}
|
||||
}
|
||||
long start = System.currentTimeMillis();
|
||||
String serverIp = requestConfig.getIp();
|
||||
String url = requestConfig.url();
|
||||
if (HttpDnsLog.isPrint()) {
|
||||
HttpDnsLog.d("request url " + url);
|
||||
}
|
||||
try {
|
||||
conn = (HttpURLConnection) new URL(url).openConnection();
|
||||
conn.setReadTimeout(requestConfig.getTimeout());
|
||||
conn.setConnectTimeout(requestConfig.getTimeout());
|
||||
conn.setRequestProperty("User-Agent", requestConfig.getUA());
|
||||
if (conn instanceof HttpsURLConnection) {
|
||||
HttpsURLConnection httpsURLConnection = (HttpsURLConnection) conn;
|
||||
httpsURLConnection.setHostnameVerifier(HttpsURLConnection.getDefaultHostnameVerifier());
|
||||
}
|
||||
if (conn.getResponseCode() != HttpURLConnection.HTTP_OK) {
|
||||
in = conn.getErrorStream();
|
||||
if (in != null) {
|
||||
streamReader = new BufferedReader(new InputStreamReader(in, "UTF-8"));
|
||||
String errStr = readStringFrom(streamReader).toString();
|
||||
throw HttpException.create(conn.getResponseCode(), errStr);
|
||||
} else {
|
||||
throw HttpException.create(conn.getResponseCode(), "");
|
||||
}
|
||||
} else {
|
||||
in = conn.getInputStream();
|
||||
streamReader = new BufferedReader(new InputStreamReader(in, "UTF-8"));
|
||||
String responseStr = readStringFrom(streamReader).toString();
|
||||
if (HttpDnsLog.isPrint()) {
|
||||
HttpDnsLog.d("request success " + responseStr);
|
||||
}
|
||||
return translator.parse(serverIp, responseStr);
|
||||
}
|
||||
} catch (Throwable e) {
|
||||
long cost = System.currentTimeMillis() - start;
|
||||
HttpDnsLog.w("request " + url + " fail, cost " + cost, e);
|
||||
throw e;
|
||||
} finally {
|
||||
if (conn != null) {
|
||||
conn.disconnect();
|
||||
}
|
||||
try {
|
||||
if (in != null) {
|
||||
in.close();
|
||||
}
|
||||
if (streamReader != null) {
|
||||
streamReader.close();
|
||||
}
|
||||
} catch (IOException ignored) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* stream to string
|
||||
*/
|
||||
public static StringBuilder readStringFrom(BufferedReader streamReader) throws IOException {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
String line;
|
||||
while ((line = streamReader.readLine()) != null) {
|
||||
sb.append(line);
|
||||
}
|
||||
return sb;
|
||||
}
|
||||
public static StringBuilder readStringFrom(BufferedReader streamReader) throws IOException {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
String line;
|
||||
while ((line = streamReader.readLine()) != null) {
|
||||
sb.append(line);
|
||||
}
|
||||
return sb;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,45 +7,45 @@ import com.alibaba.sdk.android.httpdns.impl.AESEncryptService;
|
||||
import com.alibaba.sdk.android.httpdns.utils.Constants;
|
||||
|
||||
/**
|
||||
* 网络请求的配置
|
||||
* 缃戠粶璇锋眰鐨勯厤缃?
|
||||
*/
|
||||
public class HttpRequestConfig {
|
||||
public static final String HTTP_SCHEMA = "http://";
|
||||
public static final String HTTPS_SCHEMA = "https://";
|
||||
public static final String HTTPS_CERTIFICATE_HOSTNAME = "203.107.1.1";
|
||||
/**
|
||||
* 请求协议
|
||||
* 璇锋眰鍗忚
|
||||
*/
|
||||
private String mSchema = HTTP_SCHEMA;
|
||||
/**
|
||||
* 服务器ip
|
||||
* 鏈嶅姟鍣╥p
|
||||
*/
|
||||
private String mIp;
|
||||
/**
|
||||
* 服务器端口
|
||||
* 鏈嶅姟鍣ㄧ鍙?
|
||||
*/
|
||||
private int mPort;
|
||||
/**
|
||||
* 请求路径,包含query参数
|
||||
* 璇锋眰璺緞锛屽寘鍚玵uery鍙傛暟
|
||||
*/
|
||||
private String mPath;
|
||||
/**
|
||||
* 请求超时时间
|
||||
* 璇锋眰瓒呮椂鏃堕棿
|
||||
*/
|
||||
private int mTimeout = Constants.DEFAULT_TIMEOUT;
|
||||
|
||||
/**
|
||||
* 服务器IP类型 只会是 v4 或者 v6
|
||||
* 鏈嶅姟鍣↖P绫诲瀷 鍙細鏄?v4 鎴栬€?v6
|
||||
*/
|
||||
private RequestIpType mIpType = RequestIpType.v4;
|
||||
|
||||
private String mUA = "";
|
||||
|
||||
//待解析的域名
|
||||
//寰呰В鏋愮殑鍩熷悕
|
||||
private String mResolvingHost;
|
||||
//待解析的域名的ip类型
|
||||
//寰呰В鏋愮殑鍩熷悕鐨刬p绫诲瀷
|
||||
private RequestIpType mResolvingIpType;
|
||||
//是不是重试
|
||||
//鏄笉鏄噸璇?
|
||||
private boolean isRetry = false;
|
||||
|
||||
private boolean isSignMode = false;
|
||||
@@ -114,7 +114,7 @@ public class HttpRequestConfig {
|
||||
|
||||
public String url() {
|
||||
if (mIpType == RequestIpType.v6) {
|
||||
//域名兜底,这里需要对域名做特殊处理
|
||||
//鍩熷悕鍏滃簳锛岃繖閲岄渶瑕佸鍩熷悕鍋氱壒娈婂鐞?
|
||||
if (!TextUtils.isEmpty(mIp) && mIp.contains(".")) {
|
||||
return mSchema + mIp + ":" + mPort + mPath;
|
||||
}
|
||||
@@ -167,3 +167,4 @@ public class HttpRequestConfig {
|
||||
this.mAESEncryptService = mAESEncryptService;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -23,3 +23,4 @@ public class HttpRequestFailWatcher implements HttpRequestWatcher.Watcher {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package com.alibaba.sdk.android.httpdns.request;
|
||||
|
||||
/**
|
||||
* 网络请求的异步任务
|
||||
* 缃戠粶璇锋眰鐨勫紓姝ヤ换鍔?
|
||||
*/
|
||||
public class HttpRequestTask<T> extends AsyncRequestTask<T> {
|
||||
|
||||
@@ -17,3 +17,4 @@ public class HttpRequestTask<T> extends AsyncRequestTask<T> {
|
||||
return mHttpRequest.request();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package com.alibaba.sdk.android.httpdns.request;
|
||||
|
||||
/**
|
||||
* 监听网络请求,用于附加业务逻辑
|
||||
* 鐩戝惉缃戠粶璇锋眰锛岀敤浜庨檮鍔犱笟鍔¢€昏緫
|
||||
*/
|
||||
public class HttpRequestWatcher<T> extends HttpRequestWrapper<T> {
|
||||
|
||||
@@ -51,3 +51,4 @@ public class HttpRequestWatcher<T> extends HttpRequestWrapper<T> {
|
||||
void onFail(HttpRequestConfig config, Throwable throwable);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package com.alibaba.sdk.android.httpdns.request;
|
||||
|
||||
/**
|
||||
* 网络请求的包装类
|
||||
* 缃戠粶璇锋眰鐨勫寘瑁呯被
|
||||
*/
|
||||
public class HttpRequestWrapper<T> extends HttpRequest<T> {
|
||||
|
||||
@@ -21,3 +21,4 @@ public class HttpRequestWrapper<T> extends HttpRequest<T> {
|
||||
return mHttpRequest.request();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
package com.alibaba.sdk.android.httpdns.request;
|
||||
|
||||
/**
|
||||
* http请求结果回调
|
||||
* http璇锋眰缁撴灉鍥炶皟
|
||||
*/
|
||||
public interface RequestCallback<T> {
|
||||
void onSuccess(T response);
|
||||
|
||||
void onFail(Throwable throwable);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
package com.alibaba.sdk.android.httpdns.request;
|
||||
|
||||
/**
|
||||
* http响应解析
|
||||
* http鍝嶅簲瑙f瀽
|
||||
*/
|
||||
public interface ResponseParser<T> {
|
||||
T parse(String serverIp, String response) throws Throwable;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package com.alibaba.sdk.android.httpdns.request;
|
||||
|
||||
/**
|
||||
* 失败时 重试请求
|
||||
* 澶辫触鏃?閲嶈瘯璇锋眰
|
||||
*/
|
||||
public class RetryHttpRequest<T> extends HttpRequestWrapper<T> {
|
||||
|
||||
@@ -20,7 +20,7 @@ public class RetryHttpRequest<T> extends HttpRequestWrapper<T> {
|
||||
} catch (Throwable throwable) {
|
||||
if (shouldRetry(throwable)) {
|
||||
if (retryCount > 0) {
|
||||
//可观测需要
|
||||
//鍙娴嬮渶瑕?
|
||||
getRequestConfig().setRetry();
|
||||
retryCount--;
|
||||
} else {
|
||||
@@ -37,8 +37,9 @@ public class RetryHttpRequest<T> extends HttpRequestWrapper<T> {
|
||||
if (throwable instanceof HttpException) {
|
||||
return ((HttpException)throwable).shouldRetry();
|
||||
} else {
|
||||
// 其它异常都可以重试
|
||||
// 鍏跺畠寮傚父閮藉彲浠ラ噸璇?
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -79,3 +79,4 @@ public class SingleResolveHttpRequestStatusWatcher implements HttpRequestWatcher
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -50,3 +50,4 @@ public class UpdateRegionServerHttpRequestStatusWatcher implements HttpRequestWa
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@ import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 批量解析域名
|
||||
* 鎵归噺瑙f瀽鍩熷悕
|
||||
*
|
||||
* @author zonglin.nzl
|
||||
* @date 2020/12/11
|
||||
@@ -42,10 +42,10 @@ public class BatchResolveHostService {
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量解析域名
|
||||
* 鎵归噺瑙f瀽鍩熷悕
|
||||
*
|
||||
* @param hostList 待解析域名列表
|
||||
* @param type 解析类型
|
||||
* @param hostList 寰呰В鏋愬煙鍚嶅垪琛?
|
||||
* @param type 瑙f瀽绫诲瀷
|
||||
*/
|
||||
public void batchResolveHostAsync(final List<String> hostList, final RequestIpType type) {
|
||||
if (HttpDnsLog.isPrint()) {
|
||||
@@ -60,32 +60,32 @@ public class BatchResolveHostService {
|
||||
if (!CommonUtil.isAHost(host)
|
||||
|| CommonUtil.isAnIP(host)
|
||||
|| this.mHostFilter.isFiltered(host)) {
|
||||
// 过滤掉不需要的域名
|
||||
// 杩囨护鎺変笉闇€瑕佺殑鍩熷悕
|
||||
if (HttpDnsLog.isPrint()) {
|
||||
HttpDnsLog.d("resolve ignore host as not invalid " + host);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
// 过滤掉有缓存的域名
|
||||
// 杩囨护鎺夋湁缂撳瓨鐨勫煙鍚?
|
||||
String networkKey = NetworkStateManager.getInstance().getCurrentNetworkKey();
|
||||
if (type == RequestIpType.v4) {
|
||||
HTTPDNSResultWrapper result = mResultRepo.getIps(host, type, networkKey);
|
||||
if (result == null || result.isExpired()) {
|
||||
// 需要解析
|
||||
// 闇€瑕佽В鏋?
|
||||
hostsRequestV4.add(host);
|
||||
}
|
||||
} else if (type == RequestIpType.v6) {
|
||||
HTTPDNSResultWrapper result = mResultRepo.getIps(host, type, networkKey);
|
||||
if (result == null || result.isExpired()) {
|
||||
// 需要解析
|
||||
// 闇€瑕佽В鏋?
|
||||
hostsRequestV6.add(host);
|
||||
}
|
||||
} else {
|
||||
HTTPDNSResultWrapper resultV4 = mResultRepo.getIps(host, RequestIpType.v4, networkKey);
|
||||
HTTPDNSResultWrapper resultV6 = mResultRepo.getIps(host, RequestIpType.v6, networkKey);
|
||||
if ((resultV4 == null || resultV4.isExpired()) && (resultV6 == null || resultV6.isExpired())) {
|
||||
// 都需要解析
|
||||
// 閮介渶瑕佽В鏋?
|
||||
hostsRequestBoth.add(host);
|
||||
} else if (resultV4 == null || resultV4.isExpired()) {
|
||||
hostsRequestV4.add(host);
|
||||
@@ -104,7 +104,7 @@ public class BatchResolveHostService {
|
||||
return;
|
||||
}
|
||||
ArrayList<String> allHosts = new ArrayList<>(hostList);
|
||||
// 预解析每次最多5个域名
|
||||
// 棰勮В鏋愭瘡娆℃渶澶?涓煙鍚?
|
||||
final int maxCountPerRequest = 5;
|
||||
int requestCount = (hostList.size() + maxCountPerRequest - 1) / maxCountPerRequest;
|
||||
for (int i = 0; i < requestCount; i++) {
|
||||
@@ -189,3 +189,4 @@ public class BatchResolveHostService {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@ import com.alibaba.sdk.android.httpdns.impl.HttpDnsConfig;
|
||||
import com.alibaba.sdk.android.httpdns.serverip.RegionServerScheduleService;
|
||||
|
||||
/**
|
||||
* 域名解析策略控制
|
||||
* 鍩熷悕瑙f瀽绛栫暐鎺у埗
|
||||
*/
|
||||
public class CategoryController implements StatusControl {
|
||||
|
||||
@@ -44,7 +44,7 @@ public class CategoryController implements StatusControl {
|
||||
}
|
||||
|
||||
/**
|
||||
* 重置策略
|
||||
* 閲嶇疆绛栫暐
|
||||
*/
|
||||
public void reset() {
|
||||
mStatus = Status.NORMAL;
|
||||
@@ -52,7 +52,7 @@ public class CategoryController implements StatusControl {
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置嗅探模式请求间隔
|
||||
* 璁剧疆鍡呮帰妯″紡璇锋眰闂撮殧
|
||||
*
|
||||
*/
|
||||
public void setSniffTimeInterval(int timeInterval) {
|
||||
@@ -60,7 +60,7 @@ public class CategoryController implements StatusControl {
|
||||
}
|
||||
|
||||
/**
|
||||
* 策略状态,只有disable状态会使用嗅探模式
|
||||
* 绛栫暐鐘舵€侊紝鍙湁disable鐘舵€佷細浣跨敤鍡呮帰妯″紡
|
||||
*/
|
||||
enum Status {
|
||||
NORMAL,
|
||||
@@ -68,3 +68,4 @@ public class CategoryController implements StatusControl {
|
||||
DISABLE
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -20,3 +20,4 @@ public class HostFilter {
|
||||
mNotUseHttpDnsFilter = filter;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@ import com.alibaba.sdk.android.httpdns.request.SingleResolveHttpRequestStatusWat
|
||||
import com.alibaba.sdk.android.httpdns.serverip.RegionServerScheduleService;
|
||||
|
||||
/**
|
||||
* 域名解析的一般策略
|
||||
* 鍩熷悕瑙f瀽鐨勪竴鑸瓥鐣?
|
||||
*/
|
||||
public class NormalResolveCategory implements ResolveHostCategory {
|
||||
private final HttpDnsConfig mHttpDnsConfig;
|
||||
@@ -31,11 +31,11 @@ public class NormalResolveCategory implements ResolveHostCategory {
|
||||
new ResolveHostResponseParser(requestConfig.getAESEncryptService()));
|
||||
request = new HttpRequestWatcher<>(request, new SingleResolveHttpRequestStatusWatcher(
|
||||
mHttpDnsConfig.getObservableManager()));
|
||||
// 切换服务IP,更新服务IP
|
||||
// 鍒囨崲鏈嶅姟IP锛屾洿鏂版湇鍔P
|
||||
request = new HttpRequestWatcher<>(request, new ShiftServerWatcher(config,
|
||||
mScheduleService,
|
||||
mStatusControl));
|
||||
// 重试一次
|
||||
// 閲嶈瘯涓€娆?
|
||||
request = new RetryHttpRequest<>(request, 1);
|
||||
try {
|
||||
config.getResolveWorker().execute(new HttpRequestTask<>(request, callback));
|
||||
@@ -45,3 +45,4 @@ public class NormalResolveCategory implements ResolveHostCategory {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -12,25 +12,25 @@ import com.alibaba.sdk.android.httpdns.cache.HostRecord;
|
||||
public class ResolveHostCache {
|
||||
|
||||
/**
|
||||
* v4的解析记录
|
||||
* v4鐨勮В鏋愯褰?
|
||||
*/
|
||||
private final ConcurrentHashMap<String, HostRecord> mV4Records = new ConcurrentHashMap<>();
|
||||
/**
|
||||
* v6的解析记录
|
||||
* v6鐨勮В鏋愯褰?
|
||||
*/
|
||||
private final ConcurrentHashMap<String, HostRecord> mV6Records = new ConcurrentHashMap<>();
|
||||
/**
|
||||
* v4的返回结果
|
||||
* v4鐨勮繑鍥炵粨鏋?
|
||||
*/
|
||||
private final ConcurrentHashMap<String, HTTPDNSResultWrapper> mV4HttpDnsResults
|
||||
= new ConcurrentHashMap<>();
|
||||
/**
|
||||
* v6的返回结果
|
||||
* v6鐨勮繑鍥炵粨鏋?
|
||||
*/
|
||||
private final ConcurrentHashMap<String, HTTPDNSResultWrapper> mV6HttpDnsResults
|
||||
= new ConcurrentHashMap<>();
|
||||
/**
|
||||
* 同时解析4 6的结果
|
||||
* 鍚屾椂瑙f瀽4 6鐨勭粨鏋?
|
||||
*/
|
||||
private final ConcurrentHashMap<String, HTTPDNSResultWrapper> mBothHttpDnsResults =
|
||||
new ConcurrentHashMap<>();
|
||||
@@ -240,3 +240,4 @@ public class ResolveHostCache {
|
||||
return all;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -10,12 +10,12 @@ import com.alibaba.sdk.android.httpdns.cache.HostRecord;
|
||||
import com.alibaba.sdk.android.httpdns.net.NetworkStateManager;
|
||||
|
||||
/**
|
||||
* 缓存组管理器,支持网络隔离缓存
|
||||
* 缂撳瓨缁勭鐞嗗櫒锛屾敮鎸佺綉缁滈殧绂荤紦瀛?
|
||||
*/
|
||||
public class ResolveHostCacheGroup {
|
||||
|
||||
/**
|
||||
* 所有缓存统一管理,包括网络隔离缓存和SDNS缓存
|
||||
* 鎵€鏈夌紦瀛樼粺涓€绠$悊锛屽寘鎷綉缁滈殧绂荤紦瀛樺拰SDNS缂撳瓨
|
||||
*/
|
||||
private final HashMap<String, ResolveHostCache> mCaches = new HashMap<>();
|
||||
private final Object lock = new Object();
|
||||
@@ -23,11 +23,11 @@ public class ResolveHostCacheGroup {
|
||||
|
||||
public ResolveHostCache getCache(String cacheKey) {
|
||||
if (cacheKey == null || cacheKey.isEmpty()) {
|
||||
// 普通解析使用当前网络标识
|
||||
// 鏅€氳В鏋愪娇鐢ㄥ綋鍓嶇綉缁滄爣璇?
|
||||
cacheKey = NetworkStateManager.getInstance().getCurrentNetworkKey();
|
||||
}
|
||||
|
||||
// 统一的缓存获取逻辑
|
||||
// 缁熶竴鐨勭紦瀛樿幏鍙栭€昏緫
|
||||
ResolveHostCache cache = mCaches.get(cacheKey);
|
||||
if (cache == null) {
|
||||
synchronized (lock) {
|
||||
@@ -42,7 +42,7 @@ public class ResolveHostCacheGroup {
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取所有网络缓存中的域名(排除SDNS缓存)
|
||||
* 鑾峰彇鎵€鏈夌綉缁滅紦瀛樹腑鐨勫煙鍚嶏紙鎺掗櫎SDNS缂撳瓨锛?
|
||||
*/
|
||||
public HashMap<String, RequestIpType> getAllHostFromNetworkCaches() {
|
||||
HashMap<String, RequestIpType> allHosts = new HashMap<>();
|
||||
@@ -112,3 +112,4 @@ public class ResolveHostCacheGroup {
|
||||
return records;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -5,11 +5,11 @@ import com.alibaba.sdk.android.httpdns.request.HttpRequestConfig;
|
||||
import com.alibaba.sdk.android.httpdns.request.RequestCallback;
|
||||
|
||||
/**
|
||||
* 域名解析策略接口
|
||||
* 鍩熷悕瑙f瀽绛栫暐鎺ュ彛
|
||||
*/
|
||||
public interface ResolveHostCategory {
|
||||
/**
|
||||
* 解析域名
|
||||
* 瑙f瀽鍩熷悕
|
||||
* @param config {@link HttpDnsConfig}
|
||||
* @param requestConfig {@link HttpRequestConfig}
|
||||
* @param callback {@link RequestCallback<ResolveHostResponse>}
|
||||
@@ -17,3 +17,4 @@ public interface ResolveHostCategory {
|
||||
void resolve(HttpDnsConfig config, HttpRequestConfig requestConfig,
|
||||
RequestCallback<ResolveHostResponse> callback);
|
||||
}
|
||||
|
||||
|
||||
@@ -135,8 +135,7 @@ public class ResolveHostHelper {
|
||||
}
|
||||
|
||||
/**
|
||||
* 兼容可观测模块透传 tags。
|
||||
*/
|
||||
* 鍏煎鍙娴嬫ā鍧楅€忎紶 tags銆? */
|
||||
public static String getTags(HttpDnsConfig config) {
|
||||
if (config == null || TextUtils.isEmpty(config.getBizTags())) {
|
||||
return "";
|
||||
@@ -144,3 +143,4 @@ public class ResolveHostHelper {
|
||||
return "&tags=" + config.getBizTags();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -14,7 +14,7 @@ import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* 发起域名解析请求
|
||||
* 鍙戣捣鍩熷悕瑙f瀽璇锋眰
|
||||
*/
|
||||
public class ResolveHostRequestHandler {
|
||||
|
||||
@@ -195,22 +195,20 @@ public class ResolveHostRequestHandler {
|
||||
}
|
||||
|
||||
/**
|
||||
* 重置状态
|
||||
*/
|
||||
* 閲嶇疆鐘舵€? */
|
||||
public void resetStatus() {
|
||||
mCategoryController.reset();
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置嗅探模式请求时间间隔
|
||||
* 璁剧疆鍡呮帰妯″紡璇锋眰鏃堕棿闂撮殧
|
||||
*/
|
||||
public void setSniffTimeInterval(int timeInterval) {
|
||||
mCategoryController.setSniffTimeInterval(timeInterval);
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置 SDNS 全局参数(当前服务端不使用,保留兼容)
|
||||
*/
|
||||
* 璁剧疆 SDNS 鍏ㄥ眬鍙傛暟锛堝綋鍓嶆湇鍔$涓嶄娇鐢紝淇濈暀鍏煎锛? */
|
||||
public void setSdnsGlobalParams(Map<String, String> params) {
|
||||
this.mGlobalParams.clear();
|
||||
if (params != null) {
|
||||
@@ -219,9 +217,10 @@ public class ResolveHostRequestHandler {
|
||||
}
|
||||
|
||||
/**
|
||||
* 清除 SDNS 全局参数
|
||||
* 娓呴櫎 SDNS 鍏ㄥ眬鍙傛暟
|
||||
*/
|
||||
public void clearSdnsGlobalParams() {
|
||||
this.mGlobalParams.clear();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -14,7 +14,7 @@ import java.util.HashMap;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 解析的结果
|
||||
* 瑙f瀽鐨勭粨鏋?
|
||||
*/
|
||||
public class ResolveHostResponse {
|
||||
|
||||
@@ -182,3 +182,4 @@ public class ResolveHostResponse {
|
||||
return new ResolveHostResponse(list, "");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user