带阿里标识的版本
This commit is contained in:
165
EdgeHttpDNS/Android SDK集成文档.md
Normal file
165
EdgeHttpDNS/Android SDK集成文档.md
Normal file
@@ -0,0 +1,165 @@
|
||||
# Android SDK 集成文档(Edge HTTPDNS)
|
||||
|
||||
## 1. 版本与依赖
|
||||
|
||||
- SDK 模块:`EdgeHttpDNS/sdk/android/httpdns-sdk`
|
||||
- `minSdkVersion`:19
|
||||
- `targetSdkVersion`:33
|
||||
- `compileSdk`:33
|
||||
|
||||
将发布包中的 `jar/aar` 放到应用模块 `libs/`,在 `app/build.gradle` 中添加:
|
||||
|
||||
```gradle
|
||||
dependencies {
|
||||
implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar'])
|
||||
implementation 'androidx.appcompat:appcompat:1.6.1'
|
||||
}
|
||||
```
|
||||
|
||||
## 2. SNI 行为说明(关键)
|
||||
|
||||
当前 SDK 行为与代码一致:
|
||||
|
||||
1. `/resolve` 请求链路(SDK -> 你的 HTTPDNS 服务域名)
|
||||
- 走域名 HTTPS
|
||||
- 默认 TLS 行为(会带 SNI)
|
||||
|
||||
2. 业务请求链路(拿到 CDN IP 后发起业务 HTTPS)
|
||||
- 使用 `HttpDnsHttpAdapter`:按 IP 建连,`Host` 保留原域名,并清空 SNI(No-SNI)
|
||||
|
||||
## 3. 初始化 SDK(推荐用 V1 客户端)
|
||||
|
||||
### Kotlin
|
||||
|
||||
```kotlin
|
||||
import com.new.sdk.android.httpdns.HttpDnsV1Client
|
||||
import com.new.sdk.android.httpdns.HttpDnsService
|
||||
|
||||
val service: HttpDnsService = HttpDnsV1Client.init(
|
||||
context = applicationContext,
|
||||
appId = "your-app-id",
|
||||
primaryServiceHost = "httpdns.example.com",
|
||||
backupServiceHost = "httpdns-backup.example.com", // 可空字符串
|
||||
servicePort = 443,
|
||||
signSecret = "your-sign-secret" // 可空字符串
|
||||
)
|
||||
```
|
||||
|
||||
### Java
|
||||
|
||||
```java
|
||||
import com.new.sdk.android.httpdns.HttpDnsService;
|
||||
import com.new.sdk.android.httpdns.HttpDnsV1Client;
|
||||
|
||||
HttpDnsService service = HttpDnsV1Client.init(
|
||||
getApplicationContext(),
|
||||
"your-app-id",
|
||||
"httpdns.example.com",
|
||||
"httpdns-backup.example.com", // 可传 ""
|
||||
443,
|
||||
"your-sign-secret" // 可传 ""
|
||||
);
|
||||
```
|
||||
|
||||
## 4. 解析域名获取 CDN IP
|
||||
|
||||
### Kotlin
|
||||
|
||||
```kotlin
|
||||
import com.new.sdk.android.httpdns.HTTPDNSResult
|
||||
|
||||
val result: HTTPDNSResult = HttpDnsV1Client.resolveHost(
|
||||
service = service,
|
||||
host = "api.example.com",
|
||||
qtype = "A", // "A" 或 "AAAA"
|
||||
cip = null // 可选,客户端 IP 透传
|
||||
)
|
||||
|
||||
val ips = result.ips ?: emptyArray()
|
||||
```
|
||||
|
||||
### Java
|
||||
|
||||
```java
|
||||
import com.new.sdk.android.httpdns.HTTPDNSResult;
|
||||
|
||||
HTTPDNSResult result = HttpDnsV1Client.resolveHost(
|
||||
service,
|
||||
"api.example.com",
|
||||
"A",
|
||||
null
|
||||
);
|
||||
|
||||
String[] ips = result.getIps();
|
||||
```
|
||||
|
||||
## 5. 业务请求接入方式
|
||||
|
||||
#使用 `HttpDnsHttpAdapter`(IP 直连 + No-SNI)
|
||||
|
||||
业务请求侧做“隐匿 SNI”。该适配器仅支持 HTTPS URL。
|
||||
|
||||
```kotlin
|
||||
import com.new.sdk.android.httpdns.HttpDnsV1Client
|
||||
import com.new.sdk.android.httpdns.network.HttpDnsAdapterOptions
|
||||
import com.new.sdk.android.httpdns.network.HttpDnsAdapterRequest
|
||||
|
||||
val adapter = HttpDnsV1Client.buildHttpClientAdapter(
|
||||
service,
|
||||
HttpDnsAdapterOptions.Builder()
|
||||
.setConnectTimeoutMillis(3000)
|
||||
.setReadTimeoutMillis(5000)
|
||||
.setRequestIpType(com.new.sdk.android.httpdns.RequestIpType.auto)
|
||||
.build()
|
||||
)
|
||||
|
||||
val req = HttpDnsAdapterRequest(
|
||||
"GET",
|
||||
"https://api.example.com/path?x=1"
|
||||
)
|
||||
|
||||
val resp = adapter.execute(req)
|
||||
val code = resp.statusCode
|
||||
val bodyBytes = resp.body
|
||||
val usedIp = resp.usedIp
|
||||
```
|
||||
|
||||
## 6. 预解析与常用接口
|
||||
|
||||
```kotlin
|
||||
service.setPreResolveHosts(listOf("api.example.com", "img.example.com"))
|
||||
|
||||
val r1 = service.getHttpDnsResultForHostSync("api.example.com", com.new.sdk.android.httpdns.RequestIpType.auto)
|
||||
val r2 = service.getHttpDnsResultForHostSyncNonBlocking("api.example.com", com.new.sdk.android.httpdns.RequestIpType.auto)
|
||||
```
|
||||
|
||||
- `Sync`:允许阻塞等待刷新结果(上限受 timeout 等配置影响)
|
||||
- `NonBlocking`:快速返回当前可用缓存/结果,不阻塞等待
|
||||
|
||||
## 7. 验证建议
|
||||
|
||||
1. 验证 `/resolve`
|
||||
- 抓包看目标应为 `https://<serviceHost>:<servicePort>/resolve...`
|
||||
|
||||
2. 验证业务请求(若使用 `HttpDnsHttpAdapter`)
|
||||
- 目标地址应是 CDN IP
|
||||
- HTTP `Host` 应为原域名
|
||||
- TLS ClientHello 不应携带 SNI(No-SNI)
|
||||
|
||||
## 8. 混淆配置
|
||||
|
||||
```proguard
|
||||
-keep class com.new.sdk.android.** { *; }
|
||||
```
|
||||
|
||||
## 9. 常见问题
|
||||
|
||||
1. HTTPDNS 没生效
|
||||
- 检查是否真正使用了 SDK 返回 IP(或用了 `HttpDnsHttpAdapter`)
|
||||
- 检查失败回退逻辑是否总是直接走了系统 DNS
|
||||
|
||||
2. 使用 `HttpDnsHttpAdapter` 仍失败
|
||||
- 只支持 HTTPS URL
|
||||
|
||||
3. 线上不要开启不安全证书
|
||||
- `HttpDnsAdapterOptions.Builder#setAllowInsecureCertificatesForDebugOnly(true)` 仅限调试环境
|
||||
64
EdgeHttpDNS/Changelog及升级指南_v1.4.8.txt
Normal file
64
EdgeHttpDNS/Changelog及升级指南_v1.4.8.txt
Normal file
@@ -0,0 +1,64 @@
|
||||
1.4.8版本Changelog(HTTPDNS功能全量发布)
|
||||
|
||||
1、通过智能解析把用户就近调度到最优节点,显著降低首包时延与连接抖动。
|
||||
2、支持按地域、运营商、国内/海外精细分流,提升弱网与跨网访问稳定性。
|
||||
3、解析链路内置签名鉴权与请求追踪,增强安全性与可观测性。
|
||||
4、无命中规则时自动回源兜底,保障解析连续可用。
|
||||
5、支持 A/AAAA 双栈与多记录返回,兼容不同终端网络环境。
|
||||
6、提供Android、iOS、Flutter 多端SDK 开箱可用,支持预解析、缓存与同步/非阻塞解析。
|
||||
7、提供 IP 直连适配能力(含 Host 保留与 No-SNI 模式),适配复杂 HTTPS 场景。
|
||||
8、控制台支持应用/域名/规则全流程配置与在线验证,缩短问题定位和发布周期。
|
||||
9、节点支持在线安装升级与日志上报,降低运维复杂度并提升可维护性。
|
||||
|
||||
1.4.8版本升级步骤
|
||||
|
||||
1、备份现有配置与数据:
|
||||
将 edge-api、edge-admin、edge-user 等组件目录下的 configs 文件夹,以及平台的 MySQL 数据库进行全量备份;
|
||||
|
||||
2、停止旧版本进程(管理端各组件):
|
||||
killall -9 edge-api
|
||||
killall -9 edge-admin
|
||||
killall -9 edge-user
|
||||
|
||||
3、上传并解压新版本包(以 Linux x64 环境为例):
|
||||
unzip -o edge-admin-linux-amd64-v1.4.8.zip -d /data/
|
||||
unzip -o edge-user-linux-amd64-v1.4.8.zip -d /data/
|
||||
|
||||
4、依次运行edge-api、edge-admin、edge-user
|
||||
|
||||
# 启动 API 服务
|
||||
cd /data/edge-api/bin
|
||||
chmod +x edge-api
|
||||
nohup ./edge-api 2>&1 &
|
||||
|
||||
# 启动管理后台
|
||||
cd /data/edge-admin/bin
|
||||
chmod +x edge-admin
|
||||
nohup ./edge-admin 2>&1 &
|
||||
|
||||
# 启动租户控制台
|
||||
cd /data/edge-user/bin
|
||||
chmod +x edge-user
|
||||
nohup ./edge-user 2>&1 &
|
||||
|
||||
5、检查版本状态:
|
||||
登录管理后台,确认系统版本显示为 1.4.8;
|
||||
|
||||
6、配置主备集群:
|
||||
进入“HTTPDNS -> 集群列表 -> 集群设置”,按需勾选“默认主集群”或“默认备用集群”角色,以便后续应用自动关联;
|
||||
|
||||
7、在线升级 HTTPDNS 节点:
|
||||
进入“HTTPDNS -> 节点列表”,点击对应节点的“详情”,在“安装信息”页面点击 **[在线安装]** 或 **[升级]**。系统会自动下发最新的 edge-httpdns 二进制文件并完成重启。
|
||||
|
||||
8、验证节点在线状态:
|
||||
等待 30 秒左右,确认节点状态恢复为“在线”,并验证硬件负载监控数据是否正常上报。
|
||||
|
||||
9、业务解析验证:
|
||||
使用控制台“解析测试”工具,验证域名在当前环境下是否能正确返回调度的 IP 地址。
|
||||
|
||||
10、完成升级。
|
||||
|
||||
特别说明:
|
||||
1、在线升级模式:Edge HTTPDNS 节点支持通过管理平台一键在线升级,无需手动上传文件和重启进程。
|
||||
2、离线安装模式:如节点服务器无法连接控制台,可手动上传 edge-httpdns 压缩包并解压,更新 bin 目录下的程序文件后手动执行 `./edge-httpdns restart` 即可。
|
||||
3、SNI 隐匿功能:请确保关联的 CDN 边缘节点也已同步更新至配套版本(会自动升级)。
|
||||
133
EdgeHttpDNS/Flutter SDK集成文档.md
Normal file
133
EdgeHttpDNS/Flutter SDK集成文档.md
Normal file
@@ -0,0 +1,133 @@
|
||||
# Flutter SDK 集成文档(Edge HTTPDNS)
|
||||
|
||||
## 1. 版本与依赖
|
||||
|
||||
- SDK 插件:`EdgeHttpDNS/sdk/flutter/new_httpdns`
|
||||
- 环境要求:Flutter 2.15+ / Dart 2.15+
|
||||
|
||||
在 `pubspec.yaml` 中引用本地插件:
|
||||
|
||||
```yaml
|
||||
dependencies:
|
||||
new_httpdns:
|
||||
path: path/to/sdk/flutter/new_httpdns
|
||||
```
|
||||
|
||||
执行 `flutter pub get` 完成安装。
|
||||
|
||||
## 2. SNI 行为说明(关键)
|
||||
|
||||
1. **/resolve 请求链路**(SDK -> 你的 HTTPDNS 服务域名)
|
||||
- 走标准 HTTPS,默认携带 SNI(用于路由到边缘控制节点)。
|
||||
|
||||
2. **业务请求链路**(拿到 CDN IP 后发起业务 HTTPS)
|
||||
- **IP 直连 + No-SNI**:使用 `TrustAPPHttpdnsHttpAdapter` 进行请求。
|
||||
- 逻辑:解析域名 -> 拿到 IP 列表 -> `uri.replace(host: ip)` -> `req.headers.host = uri.host` -> **清空 SNI**。
|
||||
- 仅支持 HTTPS URL。
|
||||
|
||||
## 3. 初始化 SDK(推荐用 TrustAPP 封装)
|
||||
|
||||
### Dart
|
||||
|
||||
```dart
|
||||
import 'package:new_httpdns/new_httpdns.dart';
|
||||
|
||||
bool ok = await TrustAPPHttpdns.init(
|
||||
appId: "your-app-id",
|
||||
primaryServiceHost: "httpdns.example.com",
|
||||
backupServiceHost: "httpdns-backup.example.com",
|
||||
servicePort: 443,
|
||||
secretKey: "your-sign-secret" // 可选,开启签名校验需传入
|
||||
);
|
||||
|
||||
if (ok) {
|
||||
print("Edge HTTPDNS 初始化成功");
|
||||
}
|
||||
```
|
||||
|
||||
## 4. 解析域名获取 CDN IP
|
||||
|
||||
### Dart
|
||||
|
||||
```dart
|
||||
// V1 风格解析接口
|
||||
Map<String, dynamic> result = await TrustAPPHttpdns.resolveHost(
|
||||
"api.example.com",
|
||||
qtype: 'A', // 可选 'A' 或 'AAAA'
|
||||
cip: '1.2.3.4' // 可选,模拟客户端 IP
|
||||
);
|
||||
|
||||
List<String> ipv4s = result['ipv4'];
|
||||
int ttl = result['ttl'];
|
||||
```
|
||||
|
||||
## 5. 业务请求接入方式
|
||||
|
||||
使用 `TrustAPPHttpdnsHttpAdapter` 实现“SNI 隐匿”业务请求。
|
||||
|
||||
### Dart
|
||||
|
||||
```dart
|
||||
final adapter = TrustAPPHttpdns.createHttpAdapter(
|
||||
options: const TrustAPPHttpdnsAdapterOptions(
|
||||
connectTimeoutMs: 3000,
|
||||
readTimeoutMs: 5000,
|
||||
ipType: 'auto', // auto/ipv4/ipv6
|
||||
)
|
||||
);
|
||||
|
||||
try {
|
||||
final res = await adapter.request(
|
||||
Uri.parse("https://api.example.com/path?x=1"),
|
||||
method: 'GET',
|
||||
headers: {'Custom-Header': 'Value'},
|
||||
body: null
|
||||
);
|
||||
|
||||
print("Status Code: ${res.statusCode}");
|
||||
print("Body Length: ${res.body.length}");
|
||||
print("Used IP: ${res.usedIp}");
|
||||
} catch (e) {
|
||||
print("请求失败: $e");
|
||||
}
|
||||
```
|
||||
|
||||
## 6. 其他常用接口
|
||||
|
||||
```dart
|
||||
// 1. 设置预解析域名
|
||||
await TrustAPPHttpdns.setPreResolveHosts(["api.example.com", "img.example.com"]);
|
||||
|
||||
// 2. 只有开启缓存时可用
|
||||
Map<String, List<String>> cacheRes = await TrustAPPHttpdns.resolveHostSyncNonBlocking("api.example.com");
|
||||
|
||||
// 3. 开启持久化缓存(重启 App 后任然可用)
|
||||
await TrustAPPHttpdns.setPersistentCacheIPEnabled(true);
|
||||
|
||||
// 4. 控制台日志(建议仅调试开启)
|
||||
await TrustAPPHttpdns.setLogEnabled(true);
|
||||
```
|
||||
|
||||
## 7. 验证建议
|
||||
|
||||
1. **验证 /resolve**
|
||||
- 观察控制台日志或抓包工具,解析请求应指向 `https://<serviceHost>:<servicePort>/resolve...`。
|
||||
|
||||
2. **验证业务请求**
|
||||
- 如果使用 `TrustAPPHttpdnsHttpAdapter`,观察抓包:
|
||||
- TCP 连接 IP 为 CDN 私有/边缘 IP。
|
||||
- HTTP `Host` 为原始域名。
|
||||
- TLS ClientHello 中 **无 SNI** 扩展。
|
||||
|
||||
## 8. 平台配置事项
|
||||
|
||||
- **Android**: 参照 Android SDK 文档配置混淆。
|
||||
- **iOS**: 如果是手动集成 Flutter 插件,请确保 iOS 模块已包含依赖的静态库,并设置 `Allow Arbitrary Loads` (如果启用 HTTP)。
|
||||
|
||||
## 9. 常见问题
|
||||
|
||||
1. **Flutter 端报错:NO_IP_AVAILABLE**
|
||||
- SDK 尚未解析出有效结果,请确认域名是否已在控制台添加并配置规则。
|
||||
|
||||
2. **请求报错:TLS_EMPTY_SNI_FAILED**
|
||||
- 仅支持 HTTPS 网站。如果所有 IP 尝试均失败,请检查网络权限及服务端防火墙。
|
||||
98
EdgeHttpDNS/HTTPDNS用户使用手册.md
Normal file
98
EdgeHttpDNS/HTTPDNS用户使用手册.md
Normal file
@@ -0,0 +1,98 @@
|
||||
# Edge HTTPDNS 用户使用手册
|
||||
|
||||
欢迎使用 Edge HTTPDNS 服务。本文档旨在帮助您快速完成应用创建、域名配置及解析测试,实现精准、安全的业务调度。
|
||||
|
||||
---
|
||||
|
||||
## 1. 快速入门流程
|
||||
1. **创建应用**:获取接入凭证(AppId 和 SecretKey)。
|
||||
2. **添加域名**:登记需要通过 HTTPDNS 解析的业务域名。
|
||||
3. **自定义解析规则**:设置域名对应的 IP 地址及智能分流规则。
|
||||
4. **解析测试**:通过沙箱工具验证解析是否生效。
|
||||
5. **集成 SDK**:将解析功能集成至您的 App 中。
|
||||
|
||||
---
|
||||
|
||||
## 2. 应用管理
|
||||
|
||||
应用是您接入 HTTPDNS 的基础单元。
|
||||
|
||||
### 2.1 创建应用
|
||||
1. 登录用户控制台,点击 **HTTPDNS -> 应用列表**。
|
||||
2. 点击 **创建应用**。
|
||||
3. 填写应用名称(如“我的安卓App”)。
|
||||
4. 系统会自动关联默认的服务域名,无需手动选择。
|
||||
|
||||
### 2.2 获取接入凭证
|
||||
在应用详情页面,您可以找到:
|
||||
* **AppId**:应用的唯一识别 ID。
|
||||
* **SecretKey**:签名密钥。**请务必妥善保管,切勿泄露。** 在 SDK 初始化时使用此密钥可开启“签名鉴权”,防止解析接口被他人盗刷。
|
||||
|
||||
---
|
||||
|
||||
## 3. 域名与记录配置
|
||||
|
||||
### 3.1 添加域名
|
||||
1. 进入应用详情页,切换至 **域名管理** 标签。
|
||||
2. 点击 **添加域名**,输入您的业务域名(如 `api.example.com`)。
|
||||
|
||||
### 3.2 自定义解析规则
|
||||
**作用**:自定义解析规则允许您根据终端用户的网络环境(如运营商)或物理位置,为其分配最优的访问地址。通过精细化的线路调度,可以有效降低跨境或跨网访问带来的延迟,提升 App 的响应速度。
|
||||
|
||||
点击域名后的 **解析规则**,进入详细设置:
|
||||
* **解析类型**:支持 **A 记录 (IPv4)** 和 **AAAA 记录 (IPv6)**。
|
||||
* **线路选择**:可选择针对特定运营商(如:移动、电信、联通)或特定地域(如:浙江省、海外)进行精准匹配。若不选择则代表全局默认配置。
|
||||
* **解析结果**:填写您的服务器目标 IP 地址。
|
||||
* **TTL**:解析结果在客户端缓存的时间。默认为 30 秒,建议保持默认以兼顾调度灵活性。
|
||||
|
||||
---
|
||||
|
||||
## 4. 配合 CDN 实现网络加速与安全
|
||||
|
||||
Edge HTTPDNS 不仅仅提供域名解析功能,更通过与 CDN 节点的深度集成,解决了移动端常见的 **HTTPS SNI 隐匿访问**及 **跨运营商加速**问题。
|
||||
|
||||
### 4.1 自动获取 CDN 边缘节点
|
||||
如果您在系统内开通了 **CDN 加速服务**,只需将业务域名配置在 CDN 平台中,并将其 CNAME 解析指向 CDN 提供的地址:
|
||||
* **智能调度**:HTTPDNS 会自动识别该域名已接入 CDN,并针对终端用户的地理位置和运营商,智能返回最优的 **CDN 边缘节点 IP**。
|
||||
* **无感知兜底**:如果域名未接入 CDN 或未配置解析规则,HTTPDNS 将自动回源查询 **权威 DNS**,并返回业务真实的源站 IP,确保解析永不中断。
|
||||
|
||||
### 4.2 解决 HTTPS SNI 隐匿问题
|
||||
在使用 IP 直连(如 `https://1.2.3.4/path`)访问 HTTPS 业务时,传统的网络库会因为无法获取正确的 Host 导致 SSL 握手失败。
|
||||
|
||||
**我们的方案:**
|
||||
* **配合 CDN 节点**:我们的 CDN 节点已针对 HTTPDNS 进行了特殊适配。
|
||||
* **SDK 自动适配**:SDK 内部集成了标准适配器。在您的代码中,只需配合解析出的 IP 设置 HTTP 请求头的 `Host` 字段,即可透明地完成 SNI 握手,无需复杂的 SSL 改写逻辑。
|
||||
* **稳定性保障**:通过 CDN 节点的全局负载均衡,即使某个节点异常,HTTPDNS 也会实时踢除并将流量导向其他可用节点,确保业务高可用。
|
||||
|
||||
---
|
||||
|
||||
## 4. 调试与验证
|
||||
|
||||
### 4.1 在线解析测试
|
||||
在左侧菜单进入 **解析测试**:
|
||||
1. 选择您创建的 **应用**、**HTTPDNS 服务域名** 和 **待解析域名**。
|
||||
2. **模拟客户端 IP**(可选):输入特定地区的 IP,验证该地区的解析结果是否符合预期(地域调度验证)。
|
||||
3. 点击 **在线解析**,查看返回的具体 IP 列表。
|
||||
|
||||
### 4.2 访问日志查询
|
||||
在 **访问日志** 中,您可以实时监控解析请求:
|
||||
* 查看各个 AppId 下域名的解析成功率。
|
||||
* 查看请求的来源 IP、耗时以及命中的路由规则。
|
||||
|
||||
---
|
||||
|
||||
## 5. 获取 SDK
|
||||
在 **应用详情 -> SDK下载** 中:
|
||||
* 您可以下载最新版本的 Android、iOS 或 Flutter SDK 压缩包。
|
||||
* 查看配套的 **SDK 集成文档**。
|
||||
|
||||
---
|
||||
|
||||
## 6. 常见问题 (FAQ)
|
||||
|
||||
* **Q:为什么我设置了记录,解析测试却返回为空?**
|
||||
* A:请检查记录是否已启用;或者检查该域名是否已被添加到对应的 AppId 允许列表下。
|
||||
* **Q:如何应对冷启动时的解析延迟?**
|
||||
* A:建议在 SDK 初始化后调用“解析预热”接口,提前将热点域名加载至缓存。
|
||||
* **Q:SecretKey 泄露了怎么办?**
|
||||
* A:请在应用设置中重置 SecretKey,并在 App 代码中同步更新。
|
||||
82
EdgeHttpDNS/HTTPDNS管理员配置手册.md
Normal file
82
EdgeHttpDNS/HTTPDNS管理员配置手册.md
Normal file
@@ -0,0 +1,82 @@
|
||||
# Edge HTTPDNS 管理员配置手册
|
||||
|
||||
本文档汇总了 Edge HTTPDNS 的核心配置流程,重点介绍了集群管理、节点在线安装以及多集群调度的详细操作。
|
||||
|
||||
---
|
||||
|
||||
## 1. 集群管理
|
||||
|
||||
集群是 HTTPDNS 服务的基本组织单元。通过设置“默认”角色,可以实现应用配置的自动关联与 SDK 侧的高可用容灾。
|
||||
|
||||
### 1.1 默认集群角色定义
|
||||
在“集群设置”中,您可以将集群开启为 **“设为默认集群”**,并指派以下角色:
|
||||
|
||||
* **默认主集群**:
|
||||
* **自动关联**:当在控制台“添加应用”时,系统会自动将该应用关联到此默认主集群。
|
||||
* **服务首选**:SDK 初始化后,会优先使用该集群的服务域名进行解析请求。
|
||||
* **默认备用集群**:
|
||||
* **自动容灾**:当默认主集群的节点全部宕机或网络不可达时,SDK 会自动切换至默认备用集群进行解析,确保业务不中断。
|
||||
* **自动关联**:与主集群一样,新应用创建时也会自动关联此备用集群信息。
|
||||
|
||||
> **注意**:同一时刻,系统内仅允许存在一个“默认主集群”和一个“默认备用集群”。新设置的默认集群会自动取消之前的旧设置。
|
||||
|
||||
### 1.2 核心参数配置
|
||||
* **服务域名**:该集群对外提供 HTTPDNS 服务的接入地址。
|
||||
* **降级超时容忍度**:指节点回源查询上游 DNS 时的最大等待时间(单位:毫秒)。若超过此阈值未获得结果,将视作解析失败。该选项可在“集群设置”中统一调整。
|
||||
* **默认 TTL**:解析结果在客户端缓存的缺省时长(默认 30s)。
|
||||
* **TLS 设置**:
|
||||
* **端口绑定**:通常绑定 `443`。
|
||||
* **SSL 证书**:必须配置合法证书,否则 SDK 的 HTTPS 请求将失败。
|
||||
* **TLS 版本**:默认支持 TLS 1.1 及以上版本。
|
||||
|
||||
---
|
||||
|
||||
## 2. 节点安装与维护
|
||||
|
||||
节点是处理解析请求的实体。Edge HTTPDNS 支持“在线安装”。
|
||||
|
||||
### 2.1 在线安装
|
||||
1. **创建节点**:在集群下点击“创建节点”,填写名称及公网 IP。
|
||||
2. **配置 SSH**:在节点详情中点击“设置 SSH”,输入服务器的 Host、Port 及登录授权。
|
||||
3. **启动安装**:在“安装信息”页面点击 **[开始安装]**。
|
||||
* 自动下发二进制文件及服务脚本。
|
||||
* 自动生成 `configs/api_httpdns.yaml`(包含节点识别需要的 `nodeId` 和 `secret`)。
|
||||
4. **实时状态**:安装成功后,节点状态变为 **[在线]**,控制台每 30 秒更新一次节点的 CPU、内存及负载数据。
|
||||
|
||||
---
|
||||
|
||||
## 3. 应用与解析规则
|
||||
|
||||
### 3.1 接入应用管理
|
||||
* **AppId/SecretKey**:创建应用后生成的凭证。应用在创建时已根据上述“默认集群”设定自动关联了服务入口。
|
||||
* **鉴权配置**:开启“签名鉴权”可配合 SDK 的 `setSecretKey` 接口,杜绝接口被盗刷风险。
|
||||
|
||||
### 3.2 智能解析策略
|
||||
* **线路/地域匹配**:根据来源运营商和地理位置返回最优 IP。
|
||||
|
||||
---
|
||||
|
||||
## 4. 调试与监控
|
||||
|
||||
### 4.1 解析测试
|
||||
在 **调试工具 -> 解析测试** 中,您可以模拟客户端请求:
|
||||
* 支持指定 **目标应用** 与 **所属集群**。
|
||||
* 支持模拟 **客户端 IP** 以验证 ECS 掩码及地域调度效果。
|
||||
* 实时展示请求 URL、客户端归属地、命中线路以及解析结果(IP 列表与 TTL)。
|
||||
|
||||
### 4.2 访问日志
|
||||
在 **访问日志** 菜单中,可实时查阅所有终端发起的解析请求:
|
||||
* 记录包括:请求时间、客户端 IP/操作系统、SDK 版本、解析域名、耗时以及最终返回的 IP 结果。
|
||||
* 支持按 AppID、域名、状态(成功/失败)或关键字搜索排查。
|
||||
|
||||
### 4.3 运行日志
|
||||
记录服务端及节点的底层运行事件:
|
||||
* 包括节点心跳、SSL 证书加载、API 连接状态等系统级信息。
|
||||
* 分为 Error、Warning、Info 等级别,是排查节点离线或连接故障的首要工具。
|
||||
|
||||
---
|
||||
|
||||
## 5. 常见问题
|
||||
|
||||
* **节点与 API 时间偏离**:若节点时间与 API Server 相差超过 30s,会导致鉴权失败(SIGN_INVALID)。请务必开启 NTP 时间同步。
|
||||
* **SDK 无法连接备用集群**:请检查默认备用集群的 SSL 证书是否有效,以及防火墙端口是否开放。
|
||||
BIN
EdgeHttpDNS/bin/edge-httpdns.exe
Normal file
BIN
EdgeHttpDNS/bin/edge-httpdns.exe
Normal file
Binary file not shown.
124
EdgeHttpDNS/iOS SDK集成文档.md
Normal file
124
EdgeHttpDNS/iOS SDK集成文档.md
Normal file
@@ -0,0 +1,124 @@
|
||||
# iOS SDK 集成文档(Edge HTTPDNS)
|
||||
|
||||
## 1. 版本与依赖
|
||||
|
||||
- SDK 模块:`EdgeHttpDNS/sdk/ios/NewHttpDNS`
|
||||
- 支持系统:iOS 11.0+
|
||||
- 集成方式:
|
||||
- **CocoaPods**:在 `Podfile` 中添加 `pod 'NewHTTPDNS', :path => 'path/to/sdk/ios'`
|
||||
- **手动集成**:将 `NewHttpDNS` 源码或编译后的静态库导入项目,并添加依赖的系统库(Foundation, CFNetwork, SystemConfiguration)。
|
||||
|
||||
## 2. SNI 行为说明(关键)
|
||||
|
||||
1. **/resolve 请求链路**(SDK -> 你的 HTTPDNS 服务域名)
|
||||
- 使用标准 HTTPS 请求。
|
||||
- 默认携带 SNI(用于通过 WAF/CDN 识别服务域名)。
|
||||
|
||||
2. **业务请求链路**(拿到 CDN IP 后通过 `HttpdnsEdgeService` 发起业务 HTTPS)
|
||||
- **IP 直连 + No-SNI**:SDK 会建立与 IP 的连接,并将 `NSURLRequest` 的 `URL` 替换为 IP,同时保留 `Host` 头部为原域名。
|
||||
- **证书校验**:由于清空了 SNI,常规 SNI 校验会跳过,需确保后端节点支持 Host 匹配证书。
|
||||
|
||||
## 3. 初始化 SDK(推荐用 EdgeService 封装)
|
||||
|
||||
### Objective-C
|
||||
|
||||
```objective-c
|
||||
#import <NewHttpDNS/HttpdnsEdgeService.h>
|
||||
|
||||
HttpdnsEdgeService *service = [[HttpdnsEdgeService alloc] initWithAppId:@"your-app-id"
|
||||
primaryServiceHost:@"httpdns.example.com"
|
||||
backupServiceHost:@"httpdns-backup.example.com"
|
||||
servicePort:443
|
||||
signSecret:@"your-sign-secret"];
|
||||
```
|
||||
|
||||
### Swift
|
||||
|
||||
```swift
|
||||
import NewHttpDNS
|
||||
|
||||
let service = HttpdnsEdgeService(appId: "your-app-id",
|
||||
primaryServiceHost: "httpdns.example.com",
|
||||
backupServiceHost: "httpdns-backup.example.com",
|
||||
servicePort: 443,
|
||||
signSecret: "your-sign-secret")
|
||||
```
|
||||
|
||||
## 4. 解析域名获取 CDN IP
|
||||
|
||||
### Objective-C
|
||||
|
||||
```objective-c
|
||||
[service resolveHost:@"api.example.com"
|
||||
queryType:@"A"
|
||||
completion:^(HttpdnsEdgeResolveResult * _Nullable result, NSError * _Nullable error) {
|
||||
if (result) {
|
||||
NSLog(@"IPv4s: %@", result.ipv4s);
|
||||
NSLog(@"TTL: %ld", (long)result.ttl);
|
||||
}
|
||||
}];
|
||||
```
|
||||
|
||||
### Swift
|
||||
|
||||
```swift
|
||||
service.resolveHost("api.example.com", queryType: "A") { result, error in
|
||||
if let ips = result?.ipv4s {
|
||||
print("Resolved IPs: \(ips)")
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 5. 业务请求接入方式
|
||||
|
||||
使用 `HttpdnsEdgeService` 提供的 `requestURL` 方法,自动处理 IP 直连与 SNI 隐藏。
|
||||
|
||||
### Objective-C
|
||||
|
||||
```objective-c
|
||||
NSURL *url = [NSURL URLWithString:@"https://api.example.com/path?x=1"];
|
||||
[service requestURL:url
|
||||
method:@"GET"
|
||||
headers:@{@"Custom-Header": @"Value"}
|
||||
body:nil
|
||||
completion:^(NSData * _Nullable data, NSHTTPURLResponse * _Nullable response, NSError * _Nullable error) {
|
||||
if (!error) {
|
||||
NSLog(@"Status Code: %ld", (long)response.statusCode);
|
||||
// 处理 data
|
||||
}
|
||||
}];
|
||||
```
|
||||
|
||||
### Swift
|
||||
|
||||
```swift
|
||||
let url = URL(string: "https://api.example.com/path?x=1")!
|
||||
service.requestURL(url, method: "GET", headers: ["Custom-Header": "Value"], body: nil) { data, response, error in
|
||||
if let resp = response {
|
||||
print("Status Code: \(resp.statusCode)")
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 6. 验证建议
|
||||
|
||||
1. **验证 /resolve**
|
||||
- 观察网络请求,应指向 `https://httpdns.example.com/resolve?appId=...&dn=...`。
|
||||
- 确认返回 JSON 包含 `code: "SUCCESS"`。
|
||||
|
||||
2. **验证业务请求**
|
||||
- 确认请求握手阶段不携带 SNI 扩展。
|
||||
- 确认请求的 TCP 连接目标为解析出的私有 IP/CDN IP。
|
||||
|
||||
## 7. 常见问题
|
||||
|
||||
1. **编译报错:找不到头文件**
|
||||
- 请确认 `Header Search Paths` 包含 SDK 路径。
|
||||
- 如果使用 CocoaPods,请确保执行 `pod install` 并打开 `.xcworkspace`。
|
||||
|
||||
2. **请求返回 403 (Sign Invalid)**
|
||||
- 确认控制台已开启“签名校验”,且本地传入的 `signSecret` 与控制台一致。
|
||||
- 确认系统时间正常(差值超过 30s 可能导致签名失效)。
|
||||
|
||||
3. **HTTPS 证书验证失败**
|
||||
- 检查 `HttpdnsEdgeService` 是否能正确匹配证书,通常是在 No-SNI 模式下通过 `Host` 字段匹配。
|
||||
@@ -130,8 +130,14 @@ func NewResolveServer(quitCh <-chan struct{}, snapshotManager *SnapshotManager)
|
||||
IdleTimeout: 75 * time.Second,
|
||||
MaxHeaderBytes: 8 * 1024,
|
||||
TLSConfig: &tls.Config{
|
||||
MinVersion: tls.VersionTLS12,
|
||||
MinVersion: tls.VersionTLS11,
|
||||
// /resolve is a small JSON API; pin to HTTP/1.1 to avoid ALPN/h2 handshake variance
|
||||
// across some clients and middleboxes.
|
||||
NextProtos: []string{"http/1.1"},
|
||||
},
|
||||
// Disable automatic HTTP/2 upgrade on TLS listeners. This keeps handshake behavior
|
||||
// deterministic for SDK resolve calls.
|
||||
TLSNextProto: map[string]func(*http.Server, *tls.Conn, http.Handler){},
|
||||
}
|
||||
|
||||
return instance
|
||||
|
||||
77
EdgeHttpDNS/sdk/.tmp_android_bundle/README.md
Normal file
77
EdgeHttpDNS/sdk/.tmp_android_bundle/README.md
Normal file
@@ -0,0 +1,77 @@
|
||||
# HTTPDNS Android SDK (SNI Hidden v1.0.0)
|
||||
|
||||
## 1. Init
|
||||
|
||||
```java
|
||||
import com.Trust.sdk.android.httpdns.HttpDns;
|
||||
import com.Trust.sdk.android.httpdns.HttpDnsService;
|
||||
import com.Trust.sdk.android.httpdns.InitConfig;
|
||||
|
||||
String appId = "app1f1ndpo9";
|
||||
|
||||
new InitConfig.Builder()
|
||||
.setContext(context)
|
||||
.setPrimaryServiceHost("httpdns-a.example.com")
|
||||
.setBackupServiceHost("httpdns-b.example.com")
|
||||
.setServicePort(443)
|
||||
.setSecretKey("your-sign-secret") // optional if sign is enabled
|
||||
.setEnableHttps(true)
|
||||
.buildFor(appId);
|
||||
|
||||
HttpDnsService httpDnsService = HttpDns.getService(appId);
|
||||
```
|
||||
|
||||
## 2. Resolve
|
||||
|
||||
```java
|
||||
HTTPDNSResult result = httpDnsService.getHttpDnsResultForHostSyncNonBlocking(
|
||||
"api.business.com",
|
||||
RequestIpType.auto,
|
||||
null,
|
||||
null
|
||||
);
|
||||
```
|
||||
|
||||
## 3. Official HTTP Adapter (IP + Empty-SNI + Host)
|
||||
|
||||
```java
|
||||
import com.Trust.sdk.android.httpdns.network.HttpDnsAdapterOptions;
|
||||
import com.Trust.sdk.android.httpdns.network.HttpDnsAdapterRequest;
|
||||
import com.Trust.sdk.android.httpdns.network.HttpDnsAdapterResponse;
|
||||
import com.Trust.sdk.android.httpdns.network.HttpDnsHttpAdapter;
|
||||
|
||||
HttpDnsHttpAdapter adapter = HttpDns.buildHttpClientAdapter(
|
||||
httpDnsService,
|
||||
new HttpDnsAdapterOptions.Builder()
|
||||
.setConnectTimeoutMillis(3000)
|
||||
.setReadTimeoutMillis(5000)
|
||||
.setRequestIpType(RequestIpType.auto)
|
||||
.setAllowInsecureCertificatesForDebugOnly(false)
|
||||
.build()
|
||||
);
|
||||
|
||||
HttpDnsAdapterResponse response = adapter.execute(
|
||||
new HttpDnsAdapterRequest("GET", "https://api.business.com/v1/ping")
|
||||
);
|
||||
```
|
||||
|
||||
Behavior is fixed:
|
||||
- Resolve by `/resolve`.
|
||||
- Connect to resolved IP over HTTPS.
|
||||
- Keep `Host` header as business domain.
|
||||
- No fallback to domain direct request.
|
||||
|
||||
## 4. Public Errors
|
||||
|
||||
- `NO_IP_AVAILABLE`
|
||||
- `TLS_EMPTY_SNI_FAILED`
|
||||
- `HOST_ROUTE_REJECTED`
|
||||
- `RESOLVE_SIGN_INVALID`
|
||||
|
||||
## 5. Removed Public Params
|
||||
|
||||
Do not use legacy public parameters:
|
||||
- `accountId`
|
||||
- `serviceDomain`
|
||||
- `endpoint`
|
||||
- `aesSecretKey`
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
68
EdgeHttpDNS/sdk/.tmp_android_bundle/proguard-rules.pro
vendored
Normal file
68
EdgeHttpDNS/sdk/.tmp_android_bundle/proguard-rules.pro
vendored
Normal file
@@ -0,0 +1,68 @@
|
||||
# Add project specific ProGuard rules here.
|
||||
# By default, the flags in this file are appended to flags specified
|
||||
# in /Users/ryan/Downloads/adt-bundle-mac-x86_64-20131030/sdk/tools/proguard/proguard-android.txt
|
||||
# You can edit the include path and order by changing the proguardFiles
|
||||
# directive in build.gradle.
|
||||
#
|
||||
# For more details, see
|
||||
# http://developer.android.com/guide/developing/tools/proguard.html
|
||||
|
||||
# Add any project specific keep options here:
|
||||
|
||||
# If your project uses WebView with JS, uncomment the following
|
||||
# and specify the fully qualified class name to the JavaScript interface
|
||||
# class:
|
||||
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
|
||||
# public *;
|
||||
#}
|
||||
-optimizationpasses 3
|
||||
-dontoptimize
|
||||
-dontusemixedcaseclassnames
|
||||
-dontskipnonpubliclibraryclasses
|
||||
-verbose
|
||||
-overloadaggressively
|
||||
#-allowaccessmodification
|
||||
-useuniqueclassmembernames
|
||||
|
||||
-dontwarn com.alibaba.sdk.android.httpdns.net.HttpDnsNetworkDetector
|
||||
|
||||
-keeppackagenames com.alibaba.sdk.android.httpdns
|
||||
-flattenpackagehierarchy com.alibaba.sdk.android.httpdns
|
||||
-keep class com.alibaba.sdk.android.httpdns.HttpDns{*;}
|
||||
-keep interface com.alibaba.sdk.android.httpdns.HttpDnsService{*;}
|
||||
-keep class com.alibaba.sdk.android.httpdns.impl.ErrorImpl{*;}
|
||||
-keep interface com.alibaba.sdk.android.httpdns.SyncService{*;}
|
||||
-keep class com.alibaba.sdk.android.httpdns.InitConfig{*;}
|
||||
-keep class com.alibaba.sdk.android.httpdns.InitConfig$Builder{*;}
|
||||
-keep class com.alibaba.sdk.android.httpdns.RequestIpType{*;}
|
||||
-keep interface com.alibaba.sdk.android.httpdns.DegradationFilter{*;}
|
||||
-keep interface com.alibaba.sdk.android.httpdns.NotUseHttpDnsFilter{*;}
|
||||
-keep interface com.alibaba.sdk.android.httpdns.HttpDnsCallback{*;}
|
||||
-keep class com.alibaba.sdk.android.httpdns.ranking.IPRankingBean{*;}
|
||||
-keep interface com.alibaba.sdk.android.httpdns.ILogger{*;}
|
||||
-keep interface com.alibaba.sdk.android.httpdns.CacheTtlChanger{*;}
|
||||
-keep class com.alibaba.sdk.android.httpdns.NetType{*;}
|
||||
-keepclasseswithmembers class com.alibaba.sdk.android.httpdns.log.HttpDnsLog {
|
||||
public static *** setLogger(***);
|
||||
public static *** removeLogger(***);
|
||||
public static *** enable(***);
|
||||
}
|
||||
-keep class com.alibaba.sdk.android.httpdns.HTTPDNSResult{*;}
|
||||
-keepclasseswithmembers class com.alibaba.sdk.android.httpdns.HttpDnsSettings {
|
||||
public static *** setDailyReport(***);
|
||||
public static *** setNetworkChecker(***);
|
||||
}
|
||||
|
||||
-keep class com.alibaba.sdk.android.httpdns.net.HttpDnsNetworkDetector {
|
||||
public <methods>;
|
||||
public <fields>;
|
||||
}
|
||||
|
||||
-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{
|
||||
public <methods>;
|
||||
public <fields>;
|
||||
}
|
||||
-keep enum com.alibaba.sdk.android.httpdns.Region {*;}
|
||||
-keep class com.alibaba.sdk.android.httpdns.exception.InitException{*;}
|
||||
@@ -6,20 +6,20 @@ Fetched at (UTC): `2026-02-18T09:31:28Z`
|
||||
|
||||
## Android SDK
|
||||
|
||||
- Upstream repository: `https://github.com/aliyun/alibabacloud-httpdns-android-sdk`
|
||||
- Upstream repository: `https://github.com/TrustAPP/Trustcloud-httpdns-android-sdk`
|
||||
- Locked commit: `eeb17d677161ec94b5f41a9d6437501ddc24e6d2`
|
||||
- Local path: `EdgeHttpDNS/sdk/android`
|
||||
|
||||
## iOS SDK
|
||||
|
||||
- Upstream repository: `https://github.com/aliyun/alibabacloud-httpdns-ios-sdk`
|
||||
- Upstream repository: `https://github.com/TrustAPP/Trustcloud-httpdns-ios-sdk`
|
||||
- Locked commit: `19f5bacd1d1399a00ba654bb72ababb3e91d0a3a`
|
||||
- Local path: `EdgeHttpDNS/sdk/ios`
|
||||
|
||||
## Flutter Plugin SDK
|
||||
|
||||
- Upstream repository: `https://github.com/aliyun/alicloud-flutter-demo`
|
||||
- Upstream repository: `https://github.com/TrustAPP/Trust-flutter-demo`
|
||||
- Locked commit: `588b807e5480d8592c57d439a6b1c52e8c313569`
|
||||
- Imported subtree: `httpdns_flutter_demo/packages/aliyun_httpdns`
|
||||
- Local path: `EdgeHttpDNS/sdk/flutter/aliyun_httpdns`
|
||||
- Imported subtree: `httpdns_flutter_demo/packages/TrustAPP_httpdns`
|
||||
- Local path: `EdgeHttpDNS/sdk/flutter/TrustAPP_httpdns`
|
||||
|
||||
|
||||
@@ -1,27 +1,27 @@
|
||||
# Third-Party Notices for EdgeHttpDNS SDK Sources
|
||||
|
||||
This directory includes third-party source snapshots imported from Alibaba Cloud open-source repositories.
|
||||
This directory includes third-party source snapshots imported from Trust Cloud open-source repositories.
|
||||
|
||||
## 1) Android SDK (`EdgeHttpDNS/sdk/android`)
|
||||
|
||||
- Source: `https://github.com/aliyun/alibabacloud-httpdns-android-sdk`
|
||||
- Source: `https://github.com/TrustAPP/Trustcloud-httpdns-android-sdk`
|
||||
- Commit: `eeb17d677161ec94b5f41a9d6437501ddc24e6d2`
|
||||
- License file in imported source:
|
||||
- `EdgeHttpDNS/sdk/android/LICENSE`
|
||||
- Observed license: MIT License
|
||||
|
||||
## 2) Flutter plugin (`EdgeHttpDNS/sdk/flutter/aliyun_httpdns`)
|
||||
## 2) Flutter plugin (`EdgeHttpDNS/sdk/flutter/TrustAPP_httpdns`)
|
||||
|
||||
- Source: `https://github.com/aliyun/alicloud-flutter-demo`
|
||||
- Source: `https://github.com/TrustAPP/Trust-flutter-demo`
|
||||
- Commit: `588b807e5480d8592c57d439a6b1c52e8c313569`
|
||||
- Imported subtree: `httpdns_flutter_demo/packages/aliyun_httpdns`
|
||||
- Imported subtree: `httpdns_flutter_demo/packages/TrustAPP_httpdns`
|
||||
- License file in imported source:
|
||||
- `EdgeHttpDNS/sdk/flutter/aliyun_httpdns/LICENSE`
|
||||
- `EdgeHttpDNS/sdk/flutter/TrustAPP_httpdns/LICENSE`
|
||||
- Observed license: MIT License
|
||||
|
||||
## 3) iOS SDK (`EdgeHttpDNS/sdk/ios`)
|
||||
|
||||
- Source: `https://github.com/aliyun/alibabacloud-httpdns-ios-sdk`
|
||||
- Source: `https://github.com/TrustAPP/Trustcloud-httpdns-ios-sdk`
|
||||
- Commit: `19f5bacd1d1399a00ba654bb72ababb3e91d0a3a`
|
||||
- Current status:
|
||||
- No standalone top-level `LICENSE` file was found in the upstream repository snapshot imported here.
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
# HTTPDNS Android SDK (SNI Hidden v1.0.0)
|
||||
# HTTPDNS Android SDK (SNI Hidden v1.0.0)
|
||||
|
||||
## 1. Init
|
||||
|
||||
```java
|
||||
import com.alibaba.sdk.android.httpdns.HttpDns;
|
||||
import com.alibaba.sdk.android.httpdns.HttpDnsService;
|
||||
import com.alibaba.sdk.android.httpdns.InitConfig;
|
||||
import com.Trust.sdk.android.httpdns.HttpDns;
|
||||
import com.Trust.sdk.android.httpdns.HttpDnsService;
|
||||
import com.Trust.sdk.android.httpdns.InitConfig;
|
||||
|
||||
String appId = "app1f1ndpo9";
|
||||
|
||||
@@ -35,10 +35,10 @@ HTTPDNSResult result = httpDnsService.getHttpDnsResultForHostSyncNonBlocking(
|
||||
## 3. Official HTTP Adapter (IP + Empty-SNI + Host)
|
||||
|
||||
```java
|
||||
import com.alibaba.sdk.android.httpdns.network.HttpDnsAdapterOptions;
|
||||
import com.alibaba.sdk.android.httpdns.network.HttpDnsAdapterRequest;
|
||||
import com.alibaba.sdk.android.httpdns.network.HttpDnsAdapterResponse;
|
||||
import com.alibaba.sdk.android.httpdns.network.HttpDnsHttpAdapter;
|
||||
import com.Trust.sdk.android.httpdns.network.HttpDnsAdapterOptions;
|
||||
import com.Trust.sdk.android.httpdns.network.HttpDnsAdapterRequest;
|
||||
import com.Trust.sdk.android.httpdns.network.HttpDnsAdapterResponse;
|
||||
import com.Trust.sdk.android.httpdns.network.HttpDnsHttpAdapter;
|
||||
|
||||
HttpDnsHttpAdapter adapter = HttpDns.buildHttpClientAdapter(
|
||||
httpDnsService,
|
||||
|
||||
@@ -26,7 +26,7 @@ android {
|
||||
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
|
||||
}
|
||||
forTest {
|
||||
// 注意这里的配置,并不是需要编译forTest的app,而是避免httpdns-sdk在AndroidStudio改为end2end运行测试时 BuildVariants报错
|
||||
// 娉ㄦ剰杩欓噷鐨勯厤缃紝骞朵笉鏄渶瑕佺紪璇慺orTest鐨刟pp锛岃€屾槸閬垮厤httpdns-sdk鍦ˋndroidStudio鏀逛负end2end杩愯娴嬭瘯鏃?BuildVariants鎶ラ敊
|
||||
initWith release
|
||||
debuggable true
|
||||
}
|
||||
@@ -67,7 +67,7 @@ android {
|
||||
}
|
||||
|
||||
end2end {
|
||||
// 注意这里的配置,并不是需要编译end2end的app,而是避免httpdns-sdk在AndroidStudio改为end2end运行测试时 BuildVariants报错
|
||||
// 娉ㄦ剰杩欓噷鐨勯厤缃紝骞朵笉鏄渶瑕佺紪璇慹nd2end鐨刟pp锛岃€屾槸閬垮厤httpdns-sdk鍦ˋndroidStudio鏀逛负end2end杩愯娴嬭瘯鏃?BuildVariants鎶ラ敊
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -33,10 +33,10 @@ public class HttpDnsActivity extends BaseActivity {
|
||||
public static final String SCHEMA_HTTP = "http://";
|
||||
|
||||
public static final String TAOBAO_URL = "www.taobao.com";
|
||||
public static final String ALIYUN_URL = "www.aliyun.com";
|
||||
public static final String Aliyun_URL = "www.Aliyun.com";
|
||||
|
||||
public static final String[] hosts = new String[]{
|
||||
TAOBAO_URL, ALIYUN_URL
|
||||
TAOBAO_URL, Aliyun_URL
|
||||
};
|
||||
|
||||
public static String getUrl(String schema, String host) {
|
||||
@@ -44,15 +44,15 @@ public class HttpDnsActivity extends BaseActivity {
|
||||
}
|
||||
|
||||
/**
|
||||
* 要请求的schema
|
||||
* 瑕佽姹傜殑schema
|
||||
*/
|
||||
private String schema = SCHEMA_HTTPS;
|
||||
/**
|
||||
* 要请求的域名
|
||||
* 瑕佽姹傜殑鍩熷悕
|
||||
*/
|
||||
private String host = ALIYUN_URL;
|
||||
private String host = Aliyun_URL;
|
||||
/**
|
||||
* 要解析的ip类型
|
||||
* 瑕佽В鏋愮殑ip绫诲瀷
|
||||
*/
|
||||
private RequestIpType requestIpType = RequestIpType.v4;
|
||||
|
||||
@@ -69,77 +69,77 @@ public class HttpDnsActivity extends BaseActivity {
|
||||
okHttpRequest = new OkHttpRequest(this);
|
||||
networkRequest = httpUrlConnectionRequest;
|
||||
|
||||
addFourButton("切换实例", v -> {
|
||||
addFourButton("鍒囨崲瀹炰緥", v -> {
|
||||
MyApp.getInstance().changeHolder();
|
||||
sendLog("httpdns实例已切换");
|
||||
}, "获取配置", v -> {
|
||||
sendLog("httpdns瀹炰緥宸插垏鎹?);
|
||||
}, "鑾峰彇閰嶇疆", v -> {
|
||||
sendLog(MyApp.getInstance().getCurrentHolder().getCurrentConfig());
|
||||
sendLog("要解析的域名是" + host);
|
||||
sendLog("要解析的ip类型是" + requestIpType.name());
|
||||
sendLog("要模拟请求的url是" + getUrl(schema, host));
|
||||
sendLog("模拟请求的网络框架是" + (networkRequest == httpUrlConnectionRequest ? " HttpUrlConnection" : "OkHttp"));
|
||||
}, "清除配置缓存", v -> {
|
||||
sendLog("瑕佽В鏋愮殑鍩熷悕鏄? + host);
|
||||
sendLog("瑕佽В鏋愮殑ip绫诲瀷鏄? + requestIpType.name());
|
||||
sendLog("瑕佹ā鎷熻姹傜殑url鏄? + getUrl(schema, host));
|
||||
sendLog("妯℃嫙璇锋眰鐨勭綉缁滄鏋舵槸" + (networkRequest == httpUrlConnectionRequest ? " HttpUrlConnection" : "OkHttp"));
|
||||
}, "娓呴櫎閰嶇疆缂撳瓨", v -> {
|
||||
MyApp.getInstance().getCurrentHolder().cleanSp();
|
||||
sendLog(MyApp.getInstance().getCurrentHolder().getAccountId() + "配置缓存清除, 重启生效");
|
||||
}, "清除日志", v -> cleanLog());
|
||||
sendLog(MyApp.getInstance().getCurrentHolder().getAccountId() + "閰嶇疆缂撳瓨娓呴櫎, 閲嶅惎鐢熸晥");
|
||||
}, "娓呴櫎鏃ュ織", v -> cleanLog());
|
||||
|
||||
addTwoButton("开启https", v -> {
|
||||
addTwoButton("寮€鍚痟ttps", v -> {
|
||||
MyApp.getInstance().getCurrentHolder().setEnableHttps(true);
|
||||
sendLog(MyApp.getInstance().getCurrentHolder().getAccountId() + "开启https");
|
||||
}, "关闭https", v -> {
|
||||
sendLog(MyApp.getInstance().getCurrentHolder().getAccountId() + "寮€鍚痟ttps");
|
||||
}, "鍏抽棴https", v -> {
|
||||
MyApp.getInstance().getCurrentHolder().setEnableHttps(false);
|
||||
sendLog(MyApp.getInstance().getCurrentHolder().getAccountId() + "关闭https");
|
||||
sendLog(MyApp.getInstance().getCurrentHolder().getAccountId() + "鍏抽棴https");
|
||||
});
|
||||
|
||||
addTwoButton("允许过期IP", v -> {
|
||||
addTwoButton("鍏佽杩囨湡IP", v -> {
|
||||
MyApp.getInstance().getCurrentHolder().setEnableExpiredIp(true);
|
||||
sendLog(MyApp.getInstance().getCurrentHolder().getAccountId() + "允许过期IP");
|
||||
}, "不允许过期IP", v -> {
|
||||
sendLog(MyApp.getInstance().getCurrentHolder().getAccountId() + "鍏佽杩囨湡IP");
|
||||
}, "涓嶅厑璁歌繃鏈烮P", v -> {
|
||||
MyApp.getInstance().getCurrentHolder().setEnableExpiredIp(false);
|
||||
sendLog(MyApp.getInstance().getCurrentHolder().getAccountId() + "不允许过期IP");
|
||||
sendLog(MyApp.getInstance().getCurrentHolder().getAccountId() + "涓嶅厑璁歌繃鏈烮P");
|
||||
});
|
||||
|
||||
|
||||
addTwoButton("允许持久化缓存", v -> {
|
||||
addTwoButton("鍏佽鎸佷箙鍖栫紦瀛?, v -> {
|
||||
MyApp.getInstance().getCurrentHolder().setEnableCacheIp(true);
|
||||
sendLog(MyApp.getInstance().getCurrentHolder().getAccountId() + "允许持久化缓存");
|
||||
}, "不允许持久化缓存", v -> {
|
||||
sendLog(MyApp.getInstance().getCurrentHolder().getAccountId() + "鍏佽鎸佷箙鍖栫紦瀛?);
|
||||
}, "涓嶅厑璁告寔涔呭寲缂撳瓨", v -> {
|
||||
MyApp.getInstance().getCurrentHolder().setEnableCacheIp(false);
|
||||
sendLog(MyApp.getInstance().getCurrentHolder().getAccountId() + "不允许持久化缓存");
|
||||
sendLog(MyApp.getInstance().getCurrentHolder().getAccountId() + "涓嶅厑璁告寔涔呭寲缂撳瓨");
|
||||
});
|
||||
|
||||
addThreeButton("设置中国大陆", v -> {
|
||||
addThreeButton("璁剧疆涓浗澶ч檰", v -> {
|
||||
MyApp.getInstance().getCurrentHolder().setRegion(null);
|
||||
sendLog(MyApp.getInstance().getCurrentHolder().getAccountId() + "切换到中国大陆");
|
||||
}, "设置中国香港", v -> {
|
||||
sendLog(MyApp.getInstance().getCurrentHolder().getAccountId() + "鍒囨崲鍒颁腑鍥藉ぇ闄?);
|
||||
}, "璁剧疆涓浗棣欐腐", v -> {
|
||||
MyApp.getInstance().getCurrentHolder().setRegion("hk");
|
||||
sendLog(MyApp.getInstance().getCurrentHolder().getAccountId() + "切换到中国香港");
|
||||
}, "设置新加坡", v -> {
|
||||
sendLog(MyApp.getInstance().getCurrentHolder().getAccountId() + "鍒囨崲鍒颁腑鍥介娓?);
|
||||
}, "璁剧疆鏂板姞鍧?, v -> {
|
||||
MyApp.getInstance().getCurrentHolder().setRegion("sg");
|
||||
sendLog(MyApp.getInstance().getCurrentHolder().getAccountId() + "切换到新加坡");
|
||||
sendLog(MyApp.getInstance().getCurrentHolder().getAccountId() + "鍒囨崲鍒版柊鍔犲潯");
|
||||
});
|
||||
|
||||
addEditTextButton("超时时长 ms", "设置超时ms", view -> {
|
||||
addEditTextButton("瓒呮椂鏃堕暱 ms", "璁剧疆瓒呮椂ms", view -> {
|
||||
EditText et = (EditText) view;
|
||||
int timeout = Integer.parseInt(et.getEditableText().toString());
|
||||
MyApp.getInstance().getCurrentHolder().setTimeout(timeout);
|
||||
sendLog(MyApp.getInstance().getCurrentHolder().getAccountId() + "设置超时 " + timeout);
|
||||
sendLog(MyApp.getInstance().getCurrentHolder().getAccountId() + "璁剧疆瓒呮椂 " + timeout);
|
||||
});
|
||||
|
||||
addTwoButton("开启降级", v -> {
|
||||
// 注意:降级过滤器现在需要通过InitConfig设置,重启应用生效
|
||||
sendLog(MyApp.getInstance().getCurrentHolder().getAccountId() + "降级功能需要通过InitConfig配置");
|
||||
}, "关闭降级", v -> {
|
||||
// 注意:降级过滤器现在需要通过InitConfig设置,重启应用生效
|
||||
sendLog(MyApp.getInstance().getCurrentHolder().getAccountId() + "降级功能需要通过InitConfig配置");
|
||||
addTwoButton("寮€鍚檷绾?, v -> {
|
||||
// 娉ㄦ剰锛氶檷绾ц繃婊ゅ櫒鐜板湪闇€瑕侀€氳繃InitConfig璁剧疆锛岄噸鍚簲鐢ㄧ敓鏁?
|
||||
sendLog(MyApp.getInstance().getCurrentHolder().getAccountId() + "闄嶇骇鍔熻兘闇€瑕侀€氳繃InitConfig閰嶇疆");
|
||||
}, "鍏抽棴闄嶇骇", v -> {
|
||||
// 娉ㄦ剰锛氶檷绾ц繃婊ゅ櫒鐜板湪闇€瑕侀€氳繃InitConfig璁剧疆锛岄噸鍚簲鐢ㄧ敓鏁?
|
||||
sendLog(MyApp.getInstance().getCurrentHolder().getAccountId() + "闄嶇骇鍔熻兘闇€瑕侀€氳繃InitConfig閰嶇疆");
|
||||
});
|
||||
|
||||
addTwoButton("开启网络变化后预解析", v -> {
|
||||
// 注意:此功能现在需要通过InitConfig设置,重启应用生效
|
||||
sendLog(MyApp.getInstance().getCurrentHolder().getAccountId() + "网络变化后预解析需要通过InitConfig配置");
|
||||
}, "关闭网络变化后预解析", v -> {
|
||||
// 注意:此功能现在需要通过InitConfig设置,重启应用生效
|
||||
sendLog(MyApp.getInstance().getCurrentHolder().getAccountId() + "网络变化后预解析需要通过InitConfig配置");
|
||||
addTwoButton("寮€鍚綉缁滃彉鍖栧悗棰勮В鏋?, v -> {
|
||||
// 娉ㄦ剰锛氭鍔熻兘鐜板湪闇€瑕侀€氳繃InitConfig璁剧疆锛岄噸鍚簲鐢ㄧ敓鏁?
|
||||
sendLog(MyApp.getInstance().getCurrentHolder().getAccountId() + "缃戠粶鍙樺寲鍚庨瑙f瀽闇€瑕侀€氳繃InitConfig閰嶇疆");
|
||||
}, "鍏抽棴缃戠粶鍙樺寲鍚庨瑙f瀽", v -> {
|
||||
// 娉ㄦ剰锛氭鍔熻兘鐜板湪闇€瑕侀€氳繃InitConfig璁剧疆锛岄噸鍚簲鐢ㄧ敓鏁?
|
||||
sendLog(MyApp.getInstance().getCurrentHolder().getAccountId() + "缃戠粶鍙樺寲鍚庨瑙f瀽闇€瑕侀€氳繃InitConfig閰嶇疆");
|
||||
});
|
||||
|
||||
addView(R.layout.item_autocomplete_edittext_button, view -> {
|
||||
@@ -147,21 +147,21 @@ public class HttpDnsActivity extends BaseActivity {
|
||||
final EditText etOne = view.findViewById(R.id.etOne);
|
||||
Button btnOne = view.findViewById(R.id.btnOne);
|
||||
|
||||
actvOne.setHint("请输入域名");
|
||||
actvOne.setHint("璇疯緭鍏ュ煙鍚?);
|
||||
ArrayAdapter<String> adapter = new ArrayAdapter<String>(getApplicationContext(),
|
||||
android.R.layout.simple_dropdown_item_1line, hosts);
|
||||
actvOne.setAdapter(adapter);
|
||||
|
||||
etOne.setHint("请输入自定义ttl");
|
||||
etOne.setHint("璇疯緭鍏ヨ嚜瀹氫箟ttl");
|
||||
|
||||
btnOne.setText("指定域名ttl s");
|
||||
btnOne.setText("鎸囧畾鍩熷悕ttl s");
|
||||
btnOne.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
String host = actvOne.getEditableText().toString();
|
||||
int ttl = Integer.parseInt(etOne.getEditableText().toString());
|
||||
MyApp.getInstance().getCurrentHolder().setHostTtl(host, ttl);
|
||||
sendLog("指定域名" + host + "的ttl为" + ttl + "秒");
|
||||
sendLog("鎸囧畾鍩熷悕" + host + "鐨則tl涓? + ttl + "绉?);
|
||||
}
|
||||
});
|
||||
});
|
||||
@@ -171,124 +171,124 @@ public class HttpDnsActivity extends BaseActivity {
|
||||
final EditText etOne = view.findViewById(R.id.etOne);
|
||||
Button btnOne = view.findViewById(R.id.btnOne);
|
||||
|
||||
actvOne.setHint("域名");
|
||||
actvOne.setHint("鍩熷悕");
|
||||
ArrayAdapter<String> adapter = new ArrayAdapter<>(getApplicationContext(),
|
||||
android.R.layout.simple_dropdown_item_1line, hosts);
|
||||
actvOne.setAdapter(adapter);
|
||||
|
||||
etOne.setHint("请输入端口");
|
||||
etOne.setHint("璇疯緭鍏ョ鍙?);
|
||||
|
||||
btnOne.setText("添加ipRanking配置");
|
||||
btnOne.setText("娣诲姞ipRanking閰嶇疆");
|
||||
btnOne.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
String host = actvOne.getEditableText().toString();
|
||||
int port = Integer.parseInt(etOne.getEditableText().toString());
|
||||
MyApp.getInstance().getCurrentHolder().addIpProbeItem(new IPRankingBean(host, port));
|
||||
sendLog("添加域名" + host + " 探测");
|
||||
sendLog("娣诲姞鍩熷悕" + host + " 鎺㈡祴");
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
addAutoCompleteTextViewButton(hosts, "主站域名", "添加主站域名", view -> {
|
||||
addAutoCompleteTextViewButton(hosts, "涓荤珯鍩熷悕", "娣诲姞涓荤珯鍩熷悕", view -> {
|
||||
AutoCompleteTextView actvOne = (AutoCompleteTextView) view;
|
||||
String host = actvOne.getEditableText().toString();
|
||||
MyApp.getInstance().getCurrentHolder().addHostWithFixedIp(host);
|
||||
sendLog("添加主站域名" + host);
|
||||
sendLog("娣诲姞涓荤珯鍩熷悕" + host);
|
||||
});
|
||||
|
||||
addAutoCompleteTextViewButton(hosts, "域名", "删除指定域名的缓存", view -> {
|
||||
addAutoCompleteTextViewButton(hosts, "鍩熷悕", "鍒犻櫎鎸囧畾鍩熷悕鐨勭紦瀛?, view -> {
|
||||
AutoCompleteTextView actvOne = (AutoCompleteTextView) view;
|
||||
String host = actvOne.getEditableText().toString();
|
||||
ArrayList<String> list = new ArrayList<>();
|
||||
list.add(host);
|
||||
MyApp.getInstance().getService().cleanHostCache(list);
|
||||
sendLog("清除指定host的缓存" + host);
|
||||
sendLog("娓呴櫎鎸囧畾host鐨勭紦瀛? + host);
|
||||
});
|
||||
|
||||
addOneButton("清除所有缓存", v -> {
|
||||
addOneButton("娓呴櫎鎵€鏈夌紦瀛?, v -> {
|
||||
MyApp.getInstance().getService().cleanHostCache(null);
|
||||
sendLog("清除所有缓存");
|
||||
sendLog("娓呴櫎鎵€鏈夌紦瀛?);
|
||||
});
|
||||
|
||||
addFourButton("获取当前网络状态", v -> {
|
||||
addFourButton("鑾峰彇褰撳墠缃戠粶鐘舵€?, v -> {
|
||||
NetType type = HttpDnsNetworkDetector.getInstance().getNetType(getApplicationContext());
|
||||
sendLog("获取网络状态 " + type.name());
|
||||
}, "禁用网络状态缓存", v -> {
|
||||
sendLog("鑾峰彇缃戠粶鐘舵€?" + type.name());
|
||||
}, "绂佺敤缃戠粶鐘舵€佺紦瀛?, v -> {
|
||||
HttpDnsNetworkDetector.getInstance().disableCache(true);
|
||||
sendLog("网络状态 禁用缓存 ");
|
||||
}, "开启网络状态缓存", v -> {
|
||||
sendLog("缃戠粶鐘舵€?绂佺敤缂撳瓨 ");
|
||||
}, "寮€鍚綉缁滅姸鎬佺紦瀛?, v -> {
|
||||
HttpDnsNetworkDetector.getInstance().disableCache(false);
|
||||
sendLog("网络状态 开启缓存 ");
|
||||
}, "清除网络状态缓存", v -> {
|
||||
sendLog("缃戠粶鐘舵€?寮€鍚紦瀛?");
|
||||
}, "娓呴櫎缃戠粶鐘舵€佺紦瀛?, v -> {
|
||||
HttpDnsNetworkDetector.getInstance().cleanCache(false);
|
||||
sendLog("网络状态清除缓存 ");
|
||||
sendLog("缃戠粶鐘舵€佹竻闄ょ紦瀛?");
|
||||
});
|
||||
|
||||
addTwoButton("禁止读取IP", v -> {
|
||||
addTwoButton("绂佹璇诲彇IP", v -> {
|
||||
HttpDnsNetworkDetector.getInstance().setCheckInterface(false);
|
||||
sendLog("查询网络状态时 禁止读取IP");
|
||||
}, "允许读取IP", v -> {
|
||||
sendLog("鏌ヨ缃戠粶鐘舵€佹椂 绂佹璇诲彇IP");
|
||||
}, "鍏佽璇诲彇IP", v -> {
|
||||
HttpDnsNetworkDetector.getInstance().setCheckInterface(true);
|
||||
sendLog("查询网络状态时 允许读取IP");
|
||||
sendLog("鏌ヨ缃戠粶鐘舵€佹椂 鍏佽璇诲彇IP");
|
||||
});
|
||||
|
||||
addAutoCompleteTextViewButton(hosts, "域名", "设置检测网络使用的域名", view -> {
|
||||
addAutoCompleteTextViewButton(hosts, "鍩熷悕", "璁剧疆妫€娴嬬綉缁滀娇鐢ㄧ殑鍩熷悕", view -> {
|
||||
AutoCompleteTextView actvOne = (AutoCompleteTextView) view;
|
||||
String host = actvOne.getEditableText().toString();
|
||||
HttpDnsNetworkDetector.getInstance().setHostToCheckNetType(host);
|
||||
sendLog("设置检测网络状态使用的域名为" + host);
|
||||
sendLog("璁剧疆妫€娴嬬綉缁滅姸鎬佷娇鐢ㄧ殑鍩熷悕涓? + host);
|
||||
});
|
||||
|
||||
addTwoButton("模拟请求使用https请求", v -> {
|
||||
addTwoButton("妯℃嫙璇锋眰浣跨敤https璇锋眰", v -> {
|
||||
schema = SCHEMA_HTTPS;
|
||||
sendLog("测试url使用https");
|
||||
}, "模拟请求使用http请求", v -> {
|
||||
sendLog("娴嬭瘯url浣跨敤https");
|
||||
}, "妯℃嫙璇锋眰浣跨敤http璇锋眰", v -> {
|
||||
schema = SCHEMA_HTTP;
|
||||
sendLog("测试url使用http");
|
||||
sendLog("娴嬭瘯url浣跨敤http");
|
||||
});
|
||||
|
||||
addTwoButton("HttpUrlConnection", v -> {
|
||||
networkRequest = httpUrlConnectionRequest;
|
||||
sendLog("指定网络实现方式为HttpUrlConnection");
|
||||
sendLog("鎸囧畾缃戠粶瀹炵幇鏂瑰紡涓篐ttpUrlConnection");
|
||||
}, "Okhttp", v -> {
|
||||
networkRequest = okHttpRequest;
|
||||
sendLog("指定网络实现方式为okhttp");
|
||||
sendLog("鎸囧畾缃戠粶瀹炵幇鏂瑰紡涓簅khttp");
|
||||
});
|
||||
|
||||
|
||||
addFourButton("指定v4", v -> {
|
||||
addFourButton("鎸囧畾v4", v -> {
|
||||
requestIpType = RequestIpType.v4;
|
||||
sendLog("要解析的IP类型指定为ipv4");
|
||||
}, "指定v6", v -> {
|
||||
sendLog("瑕佽В鏋愮殑IP绫诲瀷鎸囧畾涓篿pv4");
|
||||
}, "鎸囧畾v6", v -> {
|
||||
requestIpType = RequestIpType.v6;
|
||||
sendLog("要解析的IP类型指定为ipv6");
|
||||
}, "都解析", v -> {
|
||||
sendLog("瑕佽В鏋愮殑IP绫诲瀷鎸囧畾涓篿pv6");
|
||||
}, "閮借В鏋?, v -> {
|
||||
requestIpType = RequestIpType.both;
|
||||
sendLog("要解析的IP类型指定为ipv4和ipv6");
|
||||
}, "自动判断", v -> {
|
||||
sendLog("瑕佽В鏋愮殑IP绫诲瀷鎸囧畾涓篿pv4鍜宨pv6");
|
||||
}, "鑷姩鍒ゆ柇", v -> {
|
||||
requestIpType = RequestIpType.auto;
|
||||
sendLog("要解析的IP类型根据网络情况自动判断");
|
||||
sendLog("瑕佽В鏋愮殑IP绫诲瀷鏍规嵁缃戠粶鎯呭喌鑷姩鍒ゆ柇");
|
||||
});
|
||||
|
||||
addAutoCompleteTextViewButton(hosts, "域名", "指定要解析的域名", new OnButtonClick() {
|
||||
addAutoCompleteTextViewButton(hosts, "鍩熷悕", "鎸囧畾瑕佽В鏋愮殑鍩熷悕", new OnButtonClick() {
|
||||
@Override
|
||||
public void onBtnClick(View view) {
|
||||
AutoCompleteTextView actvOne = (AutoCompleteTextView) view;
|
||||
host = actvOne.getEditableText().toString();
|
||||
sendLog("要解析的域名" + host);
|
||||
sendLog("瑕佽В鏋愮殑鍩熷悕" + host);
|
||||
}
|
||||
});
|
||||
|
||||
addTwoButton("异步解析", v -> worker.execute(new Runnable() {
|
||||
addTwoButton("寮傛瑙f瀽", v -> worker.execute(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
sendLog("开始发起网络请求");
|
||||
sendLog("网络实现方式为" + (networkRequest == httpUrlConnectionRequest ? "HttpUrlConnection" : "okhttp"));
|
||||
sendLog("寮€濮嬪彂璧风綉缁滆姹?);
|
||||
sendLog("缃戠粶瀹炵幇鏂瑰紡涓? + (networkRequest == httpUrlConnectionRequest ? "HttpUrlConnection" : "okhttp"));
|
||||
String url = getUrl(schema, host);
|
||||
sendLog("url is " + url);
|
||||
sendLog("httpdns 使用 异步解析api");
|
||||
sendLog("指定解析ip类型为" + requestIpType.name());
|
||||
sendLog("httpdns 浣跨敤 寮傛瑙f瀽api");
|
||||
sendLog("鎸囧畾瑙f瀽ip绫诲瀷涓? + requestIpType.name());
|
||||
networkRequest.updateHttpDnsConfig(true, requestIpType);
|
||||
try {
|
||||
String response = networkRequest.httpGet(url);
|
||||
@@ -298,40 +298,40 @@ public class HttpDnsActivity extends BaseActivity {
|
||||
response = response.substring(0, 30) + "...";
|
||||
}
|
||||
}
|
||||
sendLog("请求结束 response is " + response + " 完整记录请看logcat日志");
|
||||
sendLog("璇锋眰缁撴潫 response is " + response + " 瀹屾暣璁板綍璇风湅logcat鏃ュ織");
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
sendLog("请求结束 发生异常 " + e.getClass().getName() + e.getMessage() + " 完整记录请看logcat日志");
|
||||
sendLog("璇锋眰缁撴潫 鍙戠敓寮傚父 " + e.getClass().getName() + e.getMessage() + " 瀹屾暣璁板綍璇风湅logcat鏃ュ織");
|
||||
}
|
||||
|
||||
}
|
||||
}), "同步解析", v -> worker.execute(() -> {
|
||||
sendLog("开始发起网络请求");
|
||||
sendLog("网络实现方式为" + (networkRequest == httpUrlConnectionRequest ? "HttpUrlConnection" : "okhttp"));
|
||||
}), "鍚屾瑙f瀽", v -> worker.execute(() -> {
|
||||
sendLog("寮€濮嬪彂璧风綉缁滆姹?);
|
||||
sendLog("缃戠粶瀹炵幇鏂瑰紡涓? + (networkRequest == httpUrlConnectionRequest ? "HttpUrlConnection" : "okhttp"));
|
||||
String url = getUrl(schema, host);
|
||||
sendLog("url is " + url);
|
||||
sendLog("httpdns 使用 同步解析api");
|
||||
sendLog("指定解析ip类型为" + requestIpType.name());
|
||||
sendLog("httpdns 浣跨敤 鍚屾瑙f瀽api");
|
||||
sendLog("鎸囧畾瑙f瀽ip绫诲瀷涓? + requestIpType.name());
|
||||
networkRequest.updateHttpDnsConfig(false, requestIpType);
|
||||
try {
|
||||
String response = networkRequest.httpGet(url);
|
||||
if (response != null && response.length() > 30) {
|
||||
response = response.substring(0, 30) + "...";
|
||||
}
|
||||
sendLog("请求结束 response is " + response + " 完整记录请看logcat日志");
|
||||
sendLog("璇锋眰缁撴潫 response is " + response + " 瀹屾暣璁板綍璇风湅logcat鏃ュ織");
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
sendLog("请求结束 发生异常 " + e.getClass().getName() + e.getMessage() + " 完整记录请看logcat日志");
|
||||
sendLog("璇锋眰缁撴潫 鍙戠敓寮傚父 " + e.getClass().getName() + e.getMessage() + " 瀹屾暣璁板綍璇风湅logcat鏃ュ織");
|
||||
}
|
||||
}));
|
||||
|
||||
addThreeButton("发起预解析", v -> worker.execute(() -> {
|
||||
addThreeButton("鍙戣捣棰勮В鏋?, v -> worker.execute(() -> {
|
||||
ArrayList<String> tmp = new ArrayList<>();
|
||||
Collections.addAll(tmp, hosts);
|
||||
MyApp.getInstance().getService().setPreResolveHosts(tmp, requestIpType);
|
||||
sendLog("已发起预解析请求");
|
||||
}), "跳转SDNS测试界面",
|
||||
v -> startActivity(new Intent(HttpDnsActivity.this, SDNSActivity.class)), "跳转Webview测试界面", new View.OnClickListener() {
|
||||
sendLog("宸插彂璧烽瑙f瀽璇锋眰");
|
||||
}), "璺宠浆SDNS娴嬭瘯鐣岄潰",
|
||||
v -> startActivity(new Intent(HttpDnsActivity.this, SDNSActivity.class)), "璺宠浆Webview娴嬭瘯鐣岄潰", new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
startActivity(new Intent(HttpDnsActivity.this, WebViewActivity.class));
|
||||
@@ -340,17 +340,18 @@ public class HttpDnsActivity extends BaseActivity {
|
||||
|
||||
|
||||
final String[] validHosts = new String[]{
|
||||
"www.aliyun.com",
|
||||
"www.Aliyun.com",
|
||||
"www.taobao.com"
|
||||
};
|
||||
|
||||
addTwoButton("并发异步请求", v -> {
|
||||
addTwoButton("骞跺彂寮傛璇锋眰", v -> {
|
||||
ThreadUtil.multiThreadTest(validHosts, 100, 20, 10 * 60 * 1000, true, requestIpType);
|
||||
sendLog("异步api并发测试开始,大约耗时10分钟,请最后查看logcat日志,确认结果,建议关闭httpdns日志,避免日志量过大");
|
||||
}, "并发同步请求", v -> {
|
||||
sendLog("寮傛api骞跺彂娴嬭瘯寮€濮嬶紝澶х害鑰楁椂10鍒嗛挓锛岃鏈€鍚庢煡鐪媗ogcat鏃ュ織锛岀‘璁ょ粨鏋滐紝寤鸿鍏抽棴httpdns鏃ュ織锛岄伩鍏嶆棩蹇楅噺杩囧ぇ");
|
||||
}, "骞跺彂鍚屾璇锋眰", v -> {
|
||||
ThreadUtil.multiThreadTest(validHosts, 100, 20, 10 * 60 * 1000, false, requestIpType);
|
||||
sendLog("同步api并发测试开始,大约耗时10分钟,请最后查看logcat日志,确认结果,建议关闭httpdns日志,避免日志量过大");
|
||||
sendLog("鍚屾api骞跺彂娴嬭瘯寮€濮嬶紝澶х害鑰楁椂10鍒嗛挓锛岃鏈€鍚庢煡鐪媗ogcat鏃ュ織锛岀‘璁ょ粨鏋滐紝寤鸿鍏抽棴httpdns鏃ュ織锛岄伩鍏嶆棩蹇楅噺杩囧ぇ");
|
||||
});
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -21,8 +21,8 @@ import java.util.Iterator;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 保存Httpdns 及 相关配置,
|
||||
* 方便修改
|
||||
* 淇濆瓨Httpdns 鍙?鐩稿叧閰嶇疆锛?
|
||||
* 鏂逛究淇敼
|
||||
*/
|
||||
public class HttpDnsHolder {
|
||||
|
||||
@@ -74,7 +74,7 @@ public class HttpDnsHolder {
|
||||
}
|
||||
|
||||
/**
|
||||
* 初始化httpdns的配置
|
||||
* 鍒濆鍖杊ttpdns鐨勯厤缃?
|
||||
*
|
||||
* @param context
|
||||
*/
|
||||
@@ -94,7 +94,7 @@ public class HttpDnsHolder {
|
||||
}
|
||||
});
|
||||
|
||||
// 初始化httpdns 的配置,此步骤需要在第一次获取HttpDnsService实例之前
|
||||
// 鍒濆鍖杊ttpdns 鐨勯厤缃紝姝ゆ楠ら渶瑕佸湪绗竴娆¤幏鍙朒ttpDnsService瀹炰緥涔嬪墠
|
||||
new InitConfig.Builder()
|
||||
.setEnableExpiredIp(enableExpiredIp)
|
||||
.setEnableCacheIp(enableCacheIp)
|
||||
@@ -126,7 +126,7 @@ public class HttpDnsHolder {
|
||||
|
||||
public void setEnableExpiredIp(final boolean enableExpiredIp) {
|
||||
this.enableExpiredIp = enableExpiredIp;
|
||||
// 注意:此配置需要重启应用生效,因为现在通过InitConfig设置
|
||||
// 娉ㄦ剰锛氭閰嶇疆闇€瑕侀噸鍚簲鐢ㄧ敓鏁堬紝鍥犱负鐜板湪閫氳繃InitConfig璁剧疆
|
||||
SpUtil.writeSp(context, getSpName(accountId), new SpUtil.OnGetSpEditor() {
|
||||
@Override
|
||||
public void onGetSpEditor(SharedPreferences.Editor editor) {
|
||||
@@ -137,7 +137,7 @@ public class HttpDnsHolder {
|
||||
|
||||
public void setEnableCacheIp(final boolean enableCacheIp) {
|
||||
this.enableCacheIp = enableCacheIp;
|
||||
// 注意:此配置需要重启应用生效,因为现在通过InitConfig设置
|
||||
// 娉ㄦ剰锛氭閰嶇疆闇€瑕侀噸鍚簲鐢ㄧ敓鏁堬紝鍥犱负鐜板湪閫氳繃InitConfig璁剧疆
|
||||
SpUtil.writeSp(context, getSpName(accountId), new SpUtil.OnGetSpEditor() {
|
||||
@Override
|
||||
public void onGetSpEditor(SharedPreferences.Editor editor) {
|
||||
@@ -148,7 +148,7 @@ public class HttpDnsHolder {
|
||||
|
||||
public void setTimeout(final int timeout) {
|
||||
this.timeout = timeout;
|
||||
// 注意:此配置需要重启应用生效,因为现在通过InitConfig设置
|
||||
// 娉ㄦ剰锛氭閰嶇疆闇€瑕侀噸鍚簲鐢ㄧ敓鏁堬紝鍥犱负鐜板湪閫氳繃InitConfig璁剧疆
|
||||
SpUtil.writeSp(context, getSpName(accountId), new SpUtil.OnGetSpEditor() {
|
||||
@Override
|
||||
public void onGetSpEditor(SharedPreferences.Editor editor) {
|
||||
@@ -159,7 +159,7 @@ public class HttpDnsHolder {
|
||||
|
||||
public void setEnableHttps(final boolean enableHttps) {
|
||||
this.enableHttps = enableHttps;
|
||||
// 注意:此配置需要重启应用生效,因为现在通过InitConfig设置
|
||||
// 娉ㄦ剰锛氭閰嶇疆闇€瑕侀噸鍚簲鐢ㄧ敓鏁堬紝鍥犱负鐜板湪閫氳繃InitConfig璁剧疆
|
||||
SpUtil.writeSp(context, getSpName(accountId), new SpUtil.OnGetSpEditor() {
|
||||
@Override
|
||||
public void onGetSpEditor(SharedPreferences.Editor editor) {
|
||||
@@ -184,7 +184,7 @@ public class HttpDnsHolder {
|
||||
this.hostListWithFixedIp = new ArrayList<>();
|
||||
}
|
||||
this.hostListWithFixedIp.add(host);
|
||||
// 重启生效
|
||||
// 閲嶅惎鐢熸晥
|
||||
SpUtil.writeSp(context, getSpName(accountId), new SpUtil.OnGetSpEditor() {
|
||||
@Override
|
||||
public void onGetSpEditor(SharedPreferences.Editor editor) {
|
||||
@@ -198,7 +198,7 @@ public class HttpDnsHolder {
|
||||
this.ipRankingList = new ArrayList<>();
|
||||
}
|
||||
this.ipRankingList.add(ipProbeItem);
|
||||
// 注意:此配置需要重启应用生效,因为现在通过InitConfig设置
|
||||
// 娉ㄦ剰锛氭閰嶇疆闇€瑕侀噸鍚簲鐢ㄧ敓鏁堬紝鍥犱负鐜板湪閫氳繃InitConfig璁剧疆
|
||||
SpUtil.writeSp(context, getSpName(accountId), new SpUtil.OnGetSpEditor() {
|
||||
@Override
|
||||
public void onGetSpEditor(SharedPreferences.Editor editor) {
|
||||
@@ -232,15 +232,15 @@ public class HttpDnsHolder {
|
||||
|
||||
public String getCurrentConfig() {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.append("当前配置 accountId : ").append(accountId).append("\n")
|
||||
.append("是否允许过期IP : ").append(enableExpiredIp).append("\n")
|
||||
.append("是否开启本地缓存 : ").append(enableCacheIp).append("\n")
|
||||
.append("是否开启HTTPS : ").append(enableHttps).append("\n")
|
||||
.append("当前region设置 : ").append(region).append("\n")
|
||||
.append("当前超时设置 : ").append(timeout).append("\n")
|
||||
.append("当前探测配置 : ").append(convertProbeList(ipRankingList)).append("\n")
|
||||
.append("当前缓存配置 : ").append(convertTtlCache(ttlCache)).append("\n")
|
||||
.append("当前主站域名配置 : ").append(convertHostList(hostListWithFixedIp)).append("\n")
|
||||
sb.append("褰撳墠閰嶇疆 accountId : ").append(accountId).append("\n")
|
||||
.append("鏄惁鍏佽杩囨湡IP : ").append(enableExpiredIp).append("\n")
|
||||
.append("鏄惁寮€鍚湰鍦扮紦瀛?: ").append(enableCacheIp).append("\n")
|
||||
.append("鏄惁寮€鍚疕TTPS : ").append(enableHttps).append("\n")
|
||||
.append("褰撳墠region璁剧疆 : ").append(region).append("\n")
|
||||
.append("褰撳墠瓒呮椂璁剧疆 : ").append(timeout).append("\n")
|
||||
.append("褰撳墠鎺㈡祴閰嶇疆 : ").append(convertProbeList(ipRankingList)).append("\n")
|
||||
.append("褰撳墠缂撳瓨閰嶇疆 : ").append(convertTtlCache(ttlCache)).append("\n")
|
||||
.append("褰撳墠涓荤珯鍩熷悕閰嶇疆 : ").append(convertHostList(hostListWithFixedIp)).append("\n")
|
||||
;
|
||||
return sb.toString();
|
||||
}
|
||||
@@ -340,3 +340,4 @@ public class HttpDnsHolder {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -23,8 +23,8 @@ public class MyApp extends Application {
|
||||
return instance;
|
||||
}
|
||||
|
||||
private final HttpDnsHolder holderA = new HttpDnsHolder("请替换为测试用A实例的accountId", "请替换为测试用A实例的secret");
|
||||
private final HttpDnsHolder holderB = new HttpDnsHolder("请替换为测试用B实例的accountId", null);
|
||||
private final HttpDnsHolder holderA = new HttpDnsHolder("璇锋浛鎹负娴嬭瘯鐢ˋ瀹炰緥鐨刟ccountId", "璇锋浛鎹负娴嬭瘯鐢ˋ瀹炰緥鐨剆ecret");
|
||||
private final HttpDnsHolder holderB = new HttpDnsHolder("璇锋浛鎹负娴嬭瘯鐢˙瀹炰緥鐨刟ccountId", null);
|
||||
|
||||
private HttpDnsHolder current = holderA;
|
||||
|
||||
@@ -33,9 +33,9 @@ public class MyApp extends Application {
|
||||
super.onCreate();
|
||||
instance = this;
|
||||
|
||||
// 开启logcat 日志 默认关闭, 开发测试过程中可以开启
|
||||
// 寮€鍚痩ogcat 鏃ュ織 榛樿鍏抽棴, 寮€鍙戞祴璇曡繃绋嬩腑鍙互寮€鍚?
|
||||
HttpDnsLog.enable(true);
|
||||
// 注入日志接口,接受httpdns的日志,开发测试过程中可以开启, 基础日志需要先enable才生效,一些错误日志不需要
|
||||
// 娉ㄥ叆鏃ュ織鎺ュ彛锛屾帴鍙梙ttpdns鐨勬棩蹇楋紝寮€鍙戞祴璇曡繃绋嬩腑鍙互寮€鍚? 鍩虹鏃ュ織闇€瑕佸厛enable鎵嶇敓鏁堬紝涓€浜涢敊璇棩蹇椾笉闇€瑕?
|
||||
HttpDnsLog.setLogger(new ILogger() {
|
||||
@Override
|
||||
public void log(String msg) {
|
||||
@@ -43,7 +43,7 @@ public class MyApp extends Application {
|
||||
}
|
||||
});
|
||||
|
||||
// 初始化httpdns的配置
|
||||
// 鍒濆鍖杊ttpdns鐨勯厤缃?
|
||||
holderA.init(this);
|
||||
holderB.init(this);
|
||||
|
||||
@@ -90,3 +90,4 @@ public class MyApp extends Application {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -5,12 +5,12 @@ import com.alibaba.sdk.android.httpdns.RequestIpType;
|
||||
public interface NetworkRequest {
|
||||
|
||||
/**
|
||||
* 设置httpdns的配置
|
||||
* 璁剧疆httpdns鐨勯厤缃?
|
||||
*/
|
||||
void updateHttpDnsConfig(boolean async, RequestIpType requestIpType);
|
||||
|
||||
/**
|
||||
* get请求
|
||||
* get璇锋眰
|
||||
*
|
||||
* @param url
|
||||
* @return
|
||||
@@ -18,3 +18,4 @@ public interface NetworkRequest {
|
||||
String httpGet(String url) throws Exception;
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -11,17 +11,17 @@ import com.aliyun.ams.httpdns.demo.base.BaseActivity;
|
||||
|
||||
import java.util.HashMap;
|
||||
|
||||
import static com.aliyun.ams.httpdns.demo.HttpDnsActivity.ALIYUN_URL;
|
||||
import static com.aliyun.ams.httpdns.demo.HttpDnsActivity.Aliyun_URL;
|
||||
|
||||
public class SDNSActivity extends BaseActivity {
|
||||
|
||||
private final HashMap<String, String> globalParams = new HashMap<>();
|
||||
/**
|
||||
* 要请求的域名
|
||||
* 瑕佽姹傜殑鍩熷悕
|
||||
*/
|
||||
private String host = HttpDnsActivity.ALIYUN_URL;
|
||||
private String host = HttpDnsActivity.Aliyun_URL;
|
||||
/**
|
||||
* 要解析的ip类型
|
||||
* 瑕佽В鏋愮殑ip绫诲瀷
|
||||
*/
|
||||
private RequestIpType requestIpType = RequestIpType.v4;
|
||||
|
||||
@@ -29,7 +29,7 @@ public class SDNSActivity extends BaseActivity {
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
|
||||
addEditTextEditTextButton("key", "value", "添加全局配置", new OnButtonClickMoreView() {
|
||||
addEditTextEditTextButton("key", "value", "娣诲姞鍏ㄥ眬閰嶇疆", new OnButtonClickMoreView() {
|
||||
@Override
|
||||
public void onBtnClick(View[] views) {
|
||||
EditText etOne = (EditText) views[0];
|
||||
@@ -40,56 +40,56 @@ public class SDNSActivity extends BaseActivity {
|
||||
|
||||
globalParams.put(key, value);
|
||||
|
||||
// 注意:SDNS全局参数现在需要通过InitConfig设置,重启应用生效
|
||||
sendLog("添加全局参数 " + key + " : " + value);
|
||||
// 娉ㄦ剰锛歋DNS鍏ㄥ眬鍙傛暟鐜板湪闇€瑕侀€氳繃InitConfig璁剧疆锛岄噸鍚簲鐢ㄧ敓鏁?
|
||||
sendLog("娣诲姞鍏ㄥ眬鍙傛暟 " + key + " : " + value);
|
||||
}
|
||||
});
|
||||
|
||||
addOneButton("清除全局配置", new View.OnClickListener() {
|
||||
addOneButton("娓呴櫎鍏ㄥ眬閰嶇疆", new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
globalParams.clear();
|
||||
// 注意:SDNS全局参数现在需要通过InitConfig设置,重启应用生效
|
||||
sendLog("清除全局参数");
|
||||
// 娉ㄦ剰锛歋DNS鍏ㄥ眬鍙傛暟鐜板湪闇€瑕侀€氳繃InitConfig璁剧疆锛岄噸鍚簲鐢ㄧ敓鏁?
|
||||
sendLog("娓呴櫎鍏ㄥ眬鍙傛暟");
|
||||
}
|
||||
});
|
||||
|
||||
addFourButton("指定v4", new View.OnClickListener() {
|
||||
addFourButton("鎸囧畾v4", new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
requestIpType = RequestIpType.v4;
|
||||
sendLog("要解析的IP类型指定为ipv4");
|
||||
sendLog("瑕佽В鏋愮殑IP绫诲瀷鎸囧畾涓篿pv4");
|
||||
}
|
||||
}, "指定v6", new View.OnClickListener() {
|
||||
}, "鎸囧畾v6", new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
requestIpType = RequestIpType.v6;
|
||||
sendLog("要解析的IP类型指定为ipv6");
|
||||
sendLog("瑕佽В鏋愮殑IP绫诲瀷鎸囧畾涓篿pv6");
|
||||
}
|
||||
}, "都解析", new View.OnClickListener() {
|
||||
}, "閮借В鏋?, new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
requestIpType = RequestIpType.both;
|
||||
sendLog("要解析的IP类型指定为ipv4和ipv6");
|
||||
sendLog("瑕佽В鏋愮殑IP绫诲瀷鎸囧畾涓篿pv4鍜宨pv6");
|
||||
}
|
||||
}, "自动判断", new View.OnClickListener() {
|
||||
}, "鑷姩鍒ゆ柇", new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
requestIpType = RequestIpType.auto;
|
||||
sendLog("要解析的IP类型根据网络情况自动判断");
|
||||
sendLog("瑕佽В鏋愮殑IP绫诲瀷鏍规嵁缃戠粶鎯呭喌鑷姩鍒ゆ柇");
|
||||
}
|
||||
});
|
||||
|
||||
addAutoCompleteTextViewButton(HttpDnsActivity.hosts, "域名", "指定要解析的域名", new OnButtonClick() {
|
||||
addAutoCompleteTextViewButton(HttpDnsActivity.hosts, "鍩熷悕", "鎸囧畾瑕佽В鏋愮殑鍩熷悕", new OnButtonClick() {
|
||||
@Override
|
||||
public void onBtnClick(View view) {
|
||||
AutoCompleteTextView actvOne = (AutoCompleteTextView) view;
|
||||
host = actvOne.getEditableText().toString();
|
||||
sendLog("要解析的域名" + host);
|
||||
sendLog("瑕佽В鏋愮殑鍩熷悕" + host);
|
||||
}
|
||||
});
|
||||
|
||||
addEditTextEditTextButton("key", "value", "发起请求", new OnButtonClickMoreView() {
|
||||
addEditTextEditTextButton("key", "value", "鍙戣捣璇锋眰", new OnButtonClickMoreView() {
|
||||
@Override
|
||||
public void onBtnClick(View[] views) {
|
||||
EditText etOne = (EditText) views[0];
|
||||
@@ -102,31 +102,32 @@ public class SDNSActivity extends BaseActivity {
|
||||
|
||||
map.put(key, value);
|
||||
|
||||
sendLog("发起SDNS请求 requestIpType is " + requestIpType.name());
|
||||
HTTPDNSResult result = MyApp.getInstance().getService().getIpsByHostAsync(host, requestIpType, map, "测试SDNS");
|
||||
sendLog("结果 " + result);
|
||||
sendLog("鍙戣捣SDNS璇锋眰 requestIpType is " + requestIpType.name());
|
||||
HTTPDNSResult result = MyApp.getInstance().getService().getIpsByHostAsync(host, requestIpType, map, "娴嬭瘯SDNS");
|
||||
sendLog("缁撴灉 " + result);
|
||||
}
|
||||
});
|
||||
|
||||
addTwoButton("scale1参数请求", new View.OnClickListener() {
|
||||
addTwoButton("scale1鍙傛暟璇锋眰", new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
HashMap<String, String> map = new HashMap<>();
|
||||
map.put("scale", "scale1");
|
||||
sendLog("发起SDNS请求 requestIpType is " + requestIpType.name() + " scale : scale1");
|
||||
HTTPDNSResult result = MyApp.getInstance().getService().getIpsByHostAsync(host, requestIpType, map, "测试1");
|
||||
sendLog("结果 " + result);
|
||||
sendLog("鍙戣捣SDNS璇锋眰 requestIpType is " + requestIpType.name() + " scale : scale1");
|
||||
HTTPDNSResult result = MyApp.getInstance().getService().getIpsByHostAsync(host, requestIpType, map, "娴嬭瘯1");
|
||||
sendLog("缁撴灉 " + result);
|
||||
}
|
||||
}, "scale2参数请求", new View.OnClickListener() {
|
||||
}, "scale2鍙傛暟璇锋眰", new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
HashMap<String, String> map = new HashMap<>();
|
||||
map.put("scale", "scale2");
|
||||
sendLog("发起SDNS请求 requestIpType is " + requestIpType.name() + " scale : scale2");
|
||||
HTTPDNSResult result = MyApp.getInstance().getService().getIpsByHostAsync(host, requestIpType, map, "测试2");
|
||||
sendLog("结果 " + result);
|
||||
sendLog("鍙戣捣SDNS璇锋眰 requestIpType is " + requestIpType.name() + " scale : scale2");
|
||||
HTTPDNSResult result = MyApp.getInstance().getService().getIpsByHostAsync(host, requestIpType, map, "娴嬭瘯2");
|
||||
sendLog("缁撴灉 " + result);
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -55,10 +55,10 @@ public class WebViewActivity extends Activity {
|
||||
public boolean
|
||||
onKeyDown(int keyCode, KeyEvent event) {
|
||||
if (keyCode == KeyEvent.KEYCODE_BACK && webView.canGoBack()) {
|
||||
webView.goBack();//返回上个页面
|
||||
webView.goBack();//杩斿洖涓婁釜椤甸潰
|
||||
return true;
|
||||
}
|
||||
return super.onKeyDown(keyCode, event);//退出Activity
|
||||
return super.onKeyDown(keyCode, event);//閫€鍑篈ctivity
|
||||
}
|
||||
|
||||
private void initBar() {
|
||||
@@ -86,7 +86,7 @@ public class WebViewActivity extends Activity {
|
||||
Map<String, String> headerFields = request.getRequestHeaders();
|
||||
String url = request.getUrl().toString();
|
||||
Log.e(TAG, "url:" + url);
|
||||
// 无法拦截body,拦截方案只能正常处理不带body的请求;
|
||||
// 鏃犳硶鎷︽埅body锛屾嫤鎴柟妗堝彧鑳芥甯稿鐞嗕笉甯ody鐨勮姹傦紱
|
||||
if ((scheme.equalsIgnoreCase("http") || scheme.equalsIgnoreCase("https"))
|
||||
&& method.equalsIgnoreCase("get")) {
|
||||
try {
|
||||
@@ -97,7 +97,7 @@ public class WebViewActivity extends Activity {
|
||||
return super.shouldInterceptRequest(view, request);
|
||||
}
|
||||
|
||||
// 注*:对于POST请求的Body数据,WebResourceRequest接口中并没有提供,这里无法处理
|
||||
// 娉?锛氬浜嶱OST璇锋眰鐨凚ody鏁版嵁锛學ebResourceRequest鎺ュ彛涓苟娌℃湁鎻愪緵锛岃繖閲屾棤娉曞鐞?
|
||||
String contentType = connection.getContentType();
|
||||
String mime = getMime(contentType);
|
||||
String charset = getCharset(contentType);
|
||||
@@ -110,18 +110,18 @@ public class WebViewActivity extends Activity {
|
||||
Log.e(TAG, "mime:" + mime + "; charset:" + charset);
|
||||
|
||||
|
||||
// 无mime类型的请求不拦截
|
||||
// 鏃爉ime绫诲瀷鐨勮姹備笉鎷︽埅
|
||||
if (TextUtils.isEmpty(mime)) {
|
||||
Log.e(TAG, "no MIME");
|
||||
return super.shouldInterceptRequest(view, request);
|
||||
} else {
|
||||
// 二进制资源无需编码信息
|
||||
// 浜岃繘鍒惰祫婧愭棤闇€缂栫爜淇℃伅
|
||||
if (!TextUtils.isEmpty(charset) || (isBinaryRes(mime))) {
|
||||
WebResourceResponse resourceResponse = new WebResourceResponse(mime, charset, httpURLConnection.getInputStream());
|
||||
resourceResponse.setStatusCodeAndReasonPhrase(statusCode, response);
|
||||
Map<String, String> responseHeader = new HashMap<String, String>();
|
||||
for (String key : headerKeySet) {
|
||||
// HttpUrlConnection可能包含key为null的报头,指向该http请求状态码
|
||||
// HttpUrlConnection鍙兘鍖呭惈key涓簄ull鐨勬姤澶达紝鎸囧悜璇ttp璇锋眰鐘舵€佺爜
|
||||
responseHeader.put(key, httpURLConnection.getHeaderField(key));
|
||||
}
|
||||
resourceResponse.setResponseHeaders(responseHeader);
|
||||
@@ -142,7 +142,7 @@ public class WebViewActivity extends Activity {
|
||||
|
||||
@Override
|
||||
public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
|
||||
// API < 21 只能拦截URL参数
|
||||
// API < 21 鍙兘鎷︽埅URL鍙傛暟
|
||||
return super.shouldInterceptRequest(view, url);
|
||||
}
|
||||
});
|
||||
@@ -153,7 +153,7 @@ public class WebViewActivity extends Activity {
|
||||
|
||||
|
||||
/**
|
||||
* 从contentType中获取MIME类型
|
||||
* 浠巆ontentType涓幏鍙朚IME绫诲瀷
|
||||
*
|
||||
* @param contentType
|
||||
* @return
|
||||
@@ -166,7 +166,7 @@ public class WebViewActivity extends Activity {
|
||||
}
|
||||
|
||||
/**
|
||||
* 从contentType中获取编码信息
|
||||
* 浠巆ontentType涓幏鍙栫紪鐮佷俊鎭?
|
||||
*
|
||||
* @param contentType
|
||||
* @return
|
||||
@@ -191,7 +191,7 @@ public class WebViewActivity extends Activity {
|
||||
|
||||
|
||||
/**
|
||||
* 是否是二进制资源,二进制资源可以不需要编码信息
|
||||
* 鏄惁鏄簩杩涘埗璧勬簮锛屼簩杩涘埗璧勬簮鍙互涓嶉渶瑕佺紪鐮佷俊鎭?
|
||||
*/
|
||||
private boolean isBinaryRes(String mime) {
|
||||
if (mime.startsWith("image")
|
||||
@@ -209,10 +209,10 @@ public class WebViewActivity extends Activity {
|
||||
URL url = null;
|
||||
try {
|
||||
url = new URL(path);
|
||||
// 异步接口获取IP
|
||||
// 寮傛鎺ュ彛鑾峰彇IP
|
||||
String ip = MyApp.getInstance().getService().getIpByHostAsync(url.getHost());
|
||||
if (ip != null) {
|
||||
// 通过HTTPDNS获取IP成功,进行URL替换和HOST头设置
|
||||
// 閫氳繃HTTPDNS鑾峰彇IP鎴愬姛锛岃繘琛孶RL鏇挎崲鍜孒OST澶磋缃?
|
||||
Log.d(TAG, "Get IP: " + ip + " for host: " + url.getHost() + " from HTTPDNS successfully!");
|
||||
String newUrl = path.replaceFirst(url.getHost(), ip);
|
||||
conn = (HttpURLConnection) new URL(newUrl).openConnection();
|
||||
@@ -222,7 +222,7 @@ public class WebViewActivity extends Activity {
|
||||
conn.setRequestProperty(field.getKey(), field.getValue());
|
||||
}
|
||||
}
|
||||
// 设置HTTP请求头Host域
|
||||
// 璁剧疆HTTP璇锋眰澶碒ost鍩?
|
||||
conn.setRequestProperty("Host", url.getHost());
|
||||
} else {
|
||||
return null;
|
||||
@@ -235,9 +235,9 @@ public class WebViewActivity extends Activity {
|
||||
WebviewTlsSniSocketFactory sslSocketFactory = new WebviewTlsSniSocketFactory(
|
||||
(HttpsURLConnection)conn);
|
||||
|
||||
// sni场景,创建SSLScocket
|
||||
// sni鍦烘櫙锛屽垱寤篠SLScocket
|
||||
httpsURLConnection.setSSLSocketFactory(sslSocketFactory);
|
||||
// https场景,证书校验
|
||||
// https鍦烘櫙锛岃瘉涔︽牎楠?
|
||||
httpsURLConnection.setHostnameVerifier(new HostnameVerifier() {
|
||||
@Override
|
||||
public boolean verify(String hostname, SSLSession session) {
|
||||
@@ -251,7 +251,7 @@ public class WebViewActivity extends Activity {
|
||||
}
|
||||
int code = conn.getResponseCode();// Network block
|
||||
if (needRedirect(code)) {
|
||||
// 原有报头中含有cookie,放弃拦截
|
||||
// 鍘熸湁鎶ュご涓惈鏈塩ookie锛屾斁寮冩嫤鎴?
|
||||
if (containCookie(headers)) {
|
||||
return null;
|
||||
}
|
||||
@@ -264,7 +264,7 @@ public class WebViewActivity extends Activity {
|
||||
if (location != null) {
|
||||
if (!(location.startsWith("http://") || location
|
||||
.startsWith("https://"))) {
|
||||
//某些时候会省略host,只返回后面的path,所以需要补全url
|
||||
//鏌愪簺鏃跺€欎細鐪佺暐host锛屽彧杩斿洖鍚庨潰鐨刾ath锛屾墍浠ラ渶瑕佽ˉ鍏╱rl
|
||||
URL originalUrl = new URL(path);
|
||||
location = originalUrl.getProtocol() + "://"
|
||||
+ originalUrl.getHost() + location;
|
||||
@@ -272,7 +272,7 @@ public class WebViewActivity extends Activity {
|
||||
Log.e(TAG, "code: " + code + "; location: " + location + "; path " + path);
|
||||
return recursiveRequest(location, headers, path);
|
||||
} else {
|
||||
// 无法获取location信息,让浏览器获取
|
||||
// 鏃犳硶鑾峰彇location淇℃伅锛岃娴忚鍣ㄨ幏鍙?
|
||||
return null;
|
||||
}
|
||||
} else {
|
||||
@@ -297,7 +297,7 @@ public class WebViewActivity extends Activity {
|
||||
|
||||
|
||||
/**
|
||||
* header中是否含有cookie
|
||||
* header涓槸鍚﹀惈鏈塩ookie
|
||||
*/
|
||||
private boolean containCookie(Map<String, String> headers) {
|
||||
for (Map.Entry<String, String> headerField : headers.entrySet()) {
|
||||
@@ -400,3 +400,4 @@ public class WebViewActivity extends Activity {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -66,7 +66,7 @@ public class BaseActivity extends Activity {
|
||||
}
|
||||
|
||||
/**
|
||||
* 发送日志到界面
|
||||
* 鍙戦€佹棩蹇楀埌鐣岄潰
|
||||
*
|
||||
* @param log
|
||||
*/
|
||||
@@ -261,3 +261,4 @@ public class BaseActivity extends Activity {
|
||||
void onBtnClick(View[] views);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -33,7 +33,7 @@ import javax.net.ssl.SSLSocket;
|
||||
import javax.net.ssl.SSLSocketFactory;
|
||||
|
||||
/**
|
||||
* 使用HttpUrlConnection 实现请求
|
||||
* 浣跨敤HttpUrlConnection 瀹炵幇璇锋眰
|
||||
*/
|
||||
public class HttpUrlConnectionRequest implements NetworkRequest {
|
||||
|
||||
@@ -55,7 +55,7 @@ public class HttpUrlConnectionRequest implements NetworkRequest {
|
||||
|
||||
@Override
|
||||
public String httpGet(String url) throws Exception {
|
||||
Log.d(TAG, "使用httpUrlConnection 请求" + url + " 异步接口 " + async + " ip类型 " + type.name());
|
||||
Log.d(TAG, "浣跨敤httpUrlConnection 璇锋眰" + url + " 寮傛鎺ュ彛 " + async + " ip绫诲瀷 " + type.name());
|
||||
|
||||
HttpURLConnection conn = getConnection(url);
|
||||
InputStream in = null;
|
||||
@@ -67,13 +67,13 @@ public class HttpUrlConnectionRequest implements NetworkRequest {
|
||||
streamReader = new BufferedReader(new InputStreamReader(in, "UTF-8"));
|
||||
errStr = readStringFrom(streamReader).toString();
|
||||
}
|
||||
Log.d(TAG, "请求失败 " + conn.getResponseCode() + " err " + errStr);
|
||||
Log.d(TAG, "璇锋眰澶辫触 " + conn.getResponseCode() + " err " + errStr);
|
||||
throw new Exception("Status Code : " + conn.getResponseCode() + " Msg : " + errStr);
|
||||
} else {
|
||||
in = conn.getInputStream();
|
||||
streamReader = new BufferedReader(new InputStreamReader(in, "UTF-8"));
|
||||
String responseStr = readStringFrom(streamReader).toString();
|
||||
Log.d(TAG, "请求成功 " + responseStr);
|
||||
Log.d(TAG, "璇锋眰鎴愬姛 " + responseStr);
|
||||
return responseStr;
|
||||
}
|
||||
}
|
||||
@@ -82,29 +82,29 @@ public class HttpUrlConnectionRequest implements NetworkRequest {
|
||||
final String host = new URL(url).getHost();
|
||||
HttpURLConnection conn = null;
|
||||
HTTPDNSResult result;
|
||||
/* 切换为新版标准api */
|
||||
/* 鍒囨崲涓烘柊鐗堟爣鍑哸pi */
|
||||
if (async) {
|
||||
result = MyApp.getInstance().getService().getHttpDnsResultForHostAsync(host, type);
|
||||
} else {
|
||||
result = MyApp.getInstance().getService().getHttpDnsResultForHostSync(host, type);
|
||||
}
|
||||
Log.d(TAG, "httpdns 解析 " + host + " 结果为 " + result + " ttl is " + Util.getTtl(result));
|
||||
Log.d(TAG, "httpdns 瑙f瀽 " + host + " 缁撴灉涓?" + result + " ttl is " + Util.getTtl(result));
|
||||
|
||||
// 这里需要根据实际情况选择使用ipv6地址 还是 ipv4地址, 下面示例的代码优先使用了ipv6地址
|
||||
// 杩欓噷闇€瑕佹牴鎹疄闄呮儏鍐甸€夋嫨浣跨敤ipv6鍦板潃 杩樻槸 ipv4鍦板潃锛?涓嬮潰绀轰緥鐨勪唬鐮佷紭鍏堜娇鐢ㄤ簡ipv6鍦板潃
|
||||
if (result.getIpv6s() != null && result.getIpv6s().length > 0 && HttpDnsNetworkDetector.getInstance().getNetType(context) != NetType.v4) {
|
||||
String newUrl = url.replace(host, "[" + result.getIpv6s()[0] + "]");
|
||||
conn = (HttpURLConnection) new URL(newUrl).openConnection();
|
||||
conn.setRequestProperty("Host", host);
|
||||
Log.d(TAG, "使用ipv6地址 " + newUrl);
|
||||
Log.d(TAG, "浣跨敤ipv6鍦板潃 " + newUrl);
|
||||
} else if (result.getIps() != null && result.getIps().length > 0 && HttpDnsNetworkDetector.getInstance().getNetType(context) != NetType.v6) {
|
||||
String newUrl = url.replace(host, result.getIps()[0]);
|
||||
conn = (HttpURLConnection) new URL(newUrl).openConnection();
|
||||
conn.setRequestProperty("Host", host);
|
||||
Log.d(TAG, "使用ipv4地址 " + newUrl);
|
||||
Log.d(TAG, "浣跨敤ipv4鍦板潃 " + newUrl);
|
||||
}
|
||||
|
||||
if (conn == null) {
|
||||
Log.d(TAG, "httpdns 未返回解析结果,走localdns");
|
||||
Log.d(TAG, "httpdns 鏈繑鍥炶В鏋愮粨鏋滐紝璧發ocaldns");
|
||||
conn = (HttpURLConnection) new URL(url).openConnection();
|
||||
}
|
||||
conn.setConnectTimeout(30000);
|
||||
@@ -115,9 +115,9 @@ public class HttpUrlConnectionRequest implements NetworkRequest {
|
||||
WebviewTlsSniSocketFactory sslSocketFactory = new WebviewTlsSniSocketFactory(
|
||||
(HttpsURLConnection)conn);
|
||||
|
||||
// sni场景,创建SSLSocket
|
||||
// sni鍦烘櫙锛屽垱寤篠SLSocket
|
||||
httpsURLConnection.setSSLSocketFactory(sslSocketFactory);
|
||||
// https场景,证书校验
|
||||
// https鍦烘櫙锛岃瘉涔︽牎楠?
|
||||
httpsURLConnection.setHostnameVerifier(new HostnameVerifier() {
|
||||
@Override
|
||||
public boolean verify(String hostname, SSLSession session) {
|
||||
@@ -131,14 +131,14 @@ public class HttpUrlConnectionRequest implements NetworkRequest {
|
||||
}
|
||||
int code = conn.getResponseCode();// Network block
|
||||
if (needRedirect(code)) {
|
||||
//临时重定向和永久重定向location的大小写有区分
|
||||
//涓存椂閲嶅畾鍚戝拰姘镐箙閲嶅畾鍚憀ocation鐨勫ぇ灏忓啓鏈夊尯鍒?
|
||||
String location = conn.getHeaderField("Location");
|
||||
if (location == null) {
|
||||
location = conn.getHeaderField("location");
|
||||
}
|
||||
if (!(location.startsWith("http://") || location
|
||||
.startsWith("https://"))) {
|
||||
//某些时候会省略host,只返回后面的path,所以需要补全url
|
||||
//鏌愪簺鏃跺€欎細鐪佺暐host锛屽彧杩斿洖鍚庨潰鐨刾ath锛屾墍浠ラ渶瑕佽ˉ鍏╱rl
|
||||
URL originalUrl = new URL(url);
|
||||
location = originalUrl.getProtocol() + "://"
|
||||
+ originalUrl.getHost() + location;
|
||||
@@ -255,3 +255,4 @@ public class HttpUrlConnectionRequest implements NetworkRequest {
|
||||
return sb;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -27,7 +27,7 @@ import okhttp3.Request;
|
||||
import okhttp3.Response;
|
||||
|
||||
/**
|
||||
* okhttp实现网络请求
|
||||
* okhttp瀹炵幇缃戠粶璇锋眰
|
||||
*/
|
||||
public class OkHttpRequest implements NetworkRequest {
|
||||
|
||||
@@ -39,35 +39,35 @@ public class OkHttpRequest implements NetworkRequest {
|
||||
|
||||
public OkHttpRequest(final Context context) {
|
||||
client = new OkHttpClient.Builder()
|
||||
// 这里配置连接池,是为了方便测试httpdns能力,正式代码请不要配置
|
||||
// 杩欓噷閰嶇疆杩炴帴姹狅紝鏄负浜嗘柟渚挎祴璇昲ttpdns鑳藉姏锛屾寮忎唬鐮佽涓嶈閰嶇疆
|
||||
.connectionPool(new ConnectionPool(0, 10 * 1000, TimeUnit.MICROSECONDS))
|
||||
.dns(new Dns() {
|
||||
@Override
|
||||
public List<InetAddress> lookup(String hostname) throws UnknownHostException {
|
||||
HTTPDNSResult result;
|
||||
/* 切换为新版标准api */
|
||||
/* 鍒囨崲涓烘柊鐗堟爣鍑哸pi */
|
||||
if (async) {
|
||||
result = MyApp.getInstance().getService().getHttpDnsResultForHostAsync(hostname, type);
|
||||
} else {
|
||||
result = MyApp.getInstance().getService().getHttpDnsResultForHostSync(hostname, type);
|
||||
}
|
||||
Log.d(TAG, "httpdns 解析 " + hostname + " 结果为 " + result + " ttl is " + Util.getTtl(result));
|
||||
Log.d(TAG, "httpdns 瑙f瀽 " + hostname + " 缁撴灉涓?" + result + " ttl is " + Util.getTtl(result));
|
||||
List<InetAddress> inetAddresses = new ArrayList<>();
|
||||
// 这里需要根据实际情况选择使用ipv6地址 还是 ipv4地址, 下面示例的代码优先使用了ipv6地址
|
||||
// 杩欓噷闇€瑕佹牴鎹疄闄呮儏鍐甸€夋嫨浣跨敤ipv6鍦板潃 杩樻槸 ipv4鍦板潃锛?涓嬮潰绀轰緥鐨勪唬鐮佷紭鍏堜娇鐢ㄤ簡ipv6鍦板潃
|
||||
Log.d(TAG, "netType is: " + HttpDnsNetworkDetector.getInstance().getNetType(context));
|
||||
if (result.getIpv6s() != null && result.getIpv6s().length > 0 && HttpDnsNetworkDetector.getInstance().getNetType(context) != NetType.v4) {
|
||||
for (int i = 0; i < result.getIpv6s().length; i++) {
|
||||
inetAddresses.addAll(Arrays.asList(InetAddress.getAllByName(result.getIpv6s()[i])));
|
||||
}
|
||||
Log.d(TAG, "使用ipv6地址" + inetAddresses);
|
||||
Log.d(TAG, "浣跨敤ipv6鍦板潃" + inetAddresses);
|
||||
} else if (result.getIps() != null && result.getIps().length > 0 && HttpDnsNetworkDetector.getInstance().getNetType(context) != NetType.v6) {
|
||||
for (int i = 0; i < result.getIps().length; i++) {
|
||||
inetAddresses.addAll(Arrays.asList(InetAddress.getAllByName(result.getIps()[i])));
|
||||
}
|
||||
Log.d(TAG, "使用ipv4地址" + inetAddresses);
|
||||
Log.d(TAG, "浣跨敤ipv4鍦板潃" + inetAddresses);
|
||||
}
|
||||
if (inetAddresses.size() == 0) {
|
||||
Log.d(TAG, "httpdns 未返回IP,走localdns");
|
||||
Log.d(TAG, "httpdns 鏈繑鍥濱P锛岃蛋localdns");
|
||||
return Dns.SYSTEM.lookup(hostname);
|
||||
}
|
||||
return inetAddresses;
|
||||
@@ -84,14 +84,15 @@ public class OkHttpRequest implements NetworkRequest {
|
||||
|
||||
@Override
|
||||
public String httpGet(String url) throws Exception {
|
||||
Log.d(TAG, "使用okhttp 请求" + url + " 异步接口 " + async + " ip类型 " + type.name());
|
||||
Log.d(TAG, "浣跨敤okhttp 璇锋眰" + url + " 寮傛鎺ュ彛 " + async + " ip绫诲瀷 " + type.name());
|
||||
Response response = client.newCall(new Request.Builder().url(url).build()).execute();
|
||||
int code = response.code();
|
||||
String body = response.body().string();
|
||||
Log.d(TAG, "使用okhttp 请求结果 code " + code + " body " + body);
|
||||
Log.d(TAG, "浣跨敤okhttp 璇锋眰缁撴灉 code " + code + " body " + body);
|
||||
if (code != HttpURLConnection.HTTP_OK) {
|
||||
throw new Exception("请求失败 code " + code + " body " + body);
|
||||
throw new Exception("璇锋眰澶辫触 code " + code + " body " + body);
|
||||
}
|
||||
return body;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -25,3 +25,4 @@ public class SpUtil {
|
||||
void onGetSpEditor(SharedPreferences.Editor editor);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -26,14 +26,14 @@ public class ThreadUtil {
|
||||
}
|
||||
final int tmpValidCount = validCount;
|
||||
Log.d(MyApp.TAG,
|
||||
threadCount + "线程并发,执行" + executeTime + ", 总域名" + hostCount + "个,有效"
|
||||
+ validCount + "个");
|
||||
threadCount + "绾跨▼骞跺彂锛屾墽琛? + executeTime + ", 鎬诲煙鍚? + hostCount + "涓紝鏈夋晥"
|
||||
+ validCount + "涓?);
|
||||
new Thread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
final ArrayList<String> hosts = new ArrayList<>(hostCount);
|
||||
for (int i = 0; i < hostCount - tmpValidCount; i++) {
|
||||
hosts.add("test" + i + ".aliyun.com");
|
||||
hosts.add("test" + i + ".Aliyun.com");
|
||||
}
|
||||
hosts.addAll(Arrays.asList(validHosts).subList(0, tmpValidCount));
|
||||
|
||||
@@ -125,3 +125,4 @@ public class ThreadUtil {
|
||||
}).start();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -6,8 +6,8 @@ import java.lang.reflect.Field;
|
||||
|
||||
public class Util {
|
||||
/**
|
||||
* 获取ttl,
|
||||
* 此方法是用于测试自定义ttl是否生效
|
||||
* 鑾峰彇ttl锛?
|
||||
* 姝ゆ柟娉曟槸鐢ㄤ簬娴嬭瘯鑷畾涔塼tl鏄惁鐢熸晥
|
||||
*/
|
||||
public static int getTtl(HTTPDNSResult result) {
|
||||
try {
|
||||
@@ -22,3 +22,4 @@ public class Util {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
android:id="@+id/bar_more"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:text="更多"
|
||||
android:text="鏇村"
|
||||
android:textSize="16sp"
|
||||
android:gravity="center"
|
||||
android:paddingLeft="10dp"
|
||||
|
||||
@@ -1,31 +1,31 @@
|
||||
<resources>
|
||||
<string name="app_name">【阿里云HttpDns】Demo程序</string>
|
||||
<string name="app_name">銆愰樋閲屼簯HttpDns銆慏emo绋嬪簭</string>
|
||||
<string name="action_settings">Settings</string>
|
||||
<string name="normal_parse">普通解析</string>
|
||||
<string name="request_taobao">解析淘宝域名</string>
|
||||
<string name="request_apple">解析apple域名</string>
|
||||
<string name="request_douban">解析豆瓣域名</string>
|
||||
<string name="https_parse">HTTPS开关</string>
|
||||
<string name="timeout">设置超时</string>
|
||||
<string name="set_expired">允许过期域名</string>
|
||||
<string name="set_cache">开启持久化缓存</string>
|
||||
<string name="set_degration_filter">降级策略</string>
|
||||
<string name="set_pre_resolve">预解析</string>
|
||||
<string name="normal_parse">鏅€氳В鏋?/string>
|
||||
<string name="request_taobao">瑙f瀽娣樺疂鍩熷悕</string>
|
||||
<string name="request_apple">瑙f瀽apple鍩熷悕</string>
|
||||
<string name="request_douban">瑙f瀽璞嗙摚鍩熷悕</string>
|
||||
<string name="https_parse">HTTPS寮€鍏?/string>
|
||||
<string name="timeout">璁剧疆瓒呮椂</string>
|
||||
<string name="set_expired">鍏佽杩囨湡鍩熷悕</string>
|
||||
<string name="set_cache">寮€鍚寔涔呭寲缂撳瓨</string>
|
||||
<string name="set_degration_filter">闄嶇骇绛栫暐</string>
|
||||
<string name="set_pre_resolve">棰勮В鏋?/string>
|
||||
<string name="set_region">region</string>
|
||||
<string name="sync_request">同步解析</string>
|
||||
<string name="multi_sync_request">同步解析并发</string>
|
||||
<string name="multi_request">并发解析</string>
|
||||
<string name="sync_request">鍚屾瑙f瀽</string>
|
||||
<string name="multi_sync_request">鍚屾瑙f瀽骞跺彂</string>
|
||||
<string name="multi_request">骞跺彂瑙f瀽</string>
|
||||
|
||||
<string name="main_about_us">关于我们</string>
|
||||
<string name="main_helper">帮助中心</string>
|
||||
<string name="main_clear_text">清除当前消息</string>
|
||||
<string name="main_about_us">鍏充簬鎴戜滑</string>
|
||||
<string name="main_helper">甯姪涓績</string>
|
||||
<string name="main_clear_text">娓呴櫎褰撳墠娑堟伅</string>
|
||||
|
||||
<!--关于我们页面-->
|
||||
<!--鍏充簬鎴戜滑椤甸潰-->
|
||||
<string name="layout_aboutus_arr">All Rights Reserved.</string>
|
||||
<string name="layout_aboutus_company">阿里云(软件)有限公司版权所有</string>
|
||||
<string name="layout_aboutus_copyright">Copyright © 2009 - 2016 Aliyun.com</string>
|
||||
<string name="layout_aboutus_company">闃块噷浜?杞欢)鏈夐檺鍏徃鐗堟潈鎵€鏈?/string>
|
||||
<string name="layout_aboutus_copyright">Copyright 漏 2009 - 2016 Aliyun.com</string>
|
||||
<string name="layout_aboutus_app_version">1.1.3</string>
|
||||
<!--帮助中心页面-->
|
||||
<string name="layout_helpus_content">Q : 什么是用户体验Demo?\nA : 用户体验Demo就是阿里云平台为您自动创建的、用来体验HttpDns服务和反馈建议用的一个小Demo,让您体验便捷、高效的HttpDns服务。\n\nQ : 如何联系我们?\nA : App Demo相关问题,请搜索钉钉群号:11777313</string>
|
||||
<!--甯姪涓績椤甸潰-->
|
||||
<string name="layout_helpus_content">Q : 浠€涔堟槸鐢ㄦ埛浣撻獙Demo锛焅nA : 鐢ㄦ埛浣撻獙Demo灏辨槸闃块噷浜戝钩鍙颁负鎮ㄨ嚜鍔ㄥ垱寤虹殑銆佺敤鏉ヤ綋楠孒ttpDns鏈嶅姟鍜屽弽棣堝缓璁敤鐨勪竴涓皬Demo锛岃鎮ㄤ綋楠屼究鎹枫€侀珮鏁堢殑HttpDns鏈嶅姟銆俓n\nQ : 濡備綍鑱旂郴鎴戜滑锛焅nA : App Demo鐩稿叧闂锛岃鎼滅储閽夐拤缇ゅ彿锛?1777313</string>
|
||||
|
||||
</resources>
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<network-security-config>
|
||||
<base-config cleartextTrafficPermitted="true">
|
||||
<trust-anchors>
|
||||
<Alibaba-anchors>
|
||||
<certificates src="system" />
|
||||
</trust-anchors>
|
||||
</Alibaba-anchors>
|
||||
</base-config>
|
||||
</network-security-config>
|
||||
</network-security-config>
|
||||
|
||||
@@ -22,9 +22,9 @@ android {
|
||||
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
|
||||
|
||||
buildConfigField "String", "HTTPDNS_VERSION", "\"${gradle.httpVersion}\""
|
||||
buildConfigField "String", "ACCOUNT_ID", "\"请替换为测试用实例的accountId\""
|
||||
buildConfigField "String", "SECRET_KEY", "\"请替换为测试用实例的secret\""
|
||||
buildConfigField "String", "AES_SECRET_KEY", "\"请替换为测试用实例的aes\""
|
||||
buildConfigField "String", "ACCOUNT_ID", "\"璇锋浛鎹负娴嬭瘯鐢ㄥ疄渚嬬殑accountId\""
|
||||
buildConfigField "String", "SECRET_KEY", "\"璇锋浛鎹负娴嬭瘯鐢ㄥ疄渚嬬殑secret\""
|
||||
buildConfigField "String", "AES_SECRET_KEY", "\"璇锋浛鎹负娴嬭瘯鐢ㄥ疄渚嬬殑aes\""
|
||||
}
|
||||
|
||||
buildTypes {
|
||||
@@ -40,7 +40,7 @@ android {
|
||||
}
|
||||
|
||||
forTest {
|
||||
// 注意这里的配置,并不是需要编译forTest的app,而是避免httpdns-sdk在AndroidStudio改为end2end运行测试时 BuildVariants报错
|
||||
// 娉ㄦ剰杩欓噷鐨勯厤缃紝骞朵笉鏄渶瑕佺紪璇慺orTest鐨刟pp锛岃€屾槸閬垮厤httpdns-sdk鍦ˋndroidStudio鏀逛负end2end杩愯娴嬭瘯鏃?BuildVariants鎶ラ敊
|
||||
initWith release
|
||||
debuggable true
|
||||
}
|
||||
@@ -92,7 +92,7 @@ android {
|
||||
}
|
||||
|
||||
end2end {
|
||||
// 注意这里的配置,并不是需要编译end2end的app,而是避免httpdns-sdk在AndroidStudio改为end2end运行测试时 BuildVariants报错
|
||||
// 娉ㄦ剰杩欓噷鐨勯厤缃紝骞朵笉鏄渶瑕佺紪璇慹nd2end鐨刟pp锛岃€屾槸閬垮厤httpdns-sdk鍦ˋndroidStudio鏀逛负end2end杩愯娴嬭瘯鏃?BuildVariants鎶ラ敊
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -21,4 +21,5 @@ class ExampleInstrumentedTest {
|
||||
val appContext = InstrumentationRegistry.getInstrumentation().targetContext
|
||||
assertEquals("com.alibaba.ams.emas.demo", appContext.packageName)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@ object BatchResolveCacheHolder {
|
||||
if (cacheData == null) {
|
||||
batchResolveBothList.add("www.baidu.com")
|
||||
batchResolveBothList.add("m.baidu.com")
|
||||
batchResolveBothList.add("www.aliyun.com")
|
||||
batchResolveBothList.add("www.Aliyun.com")
|
||||
batchResolveBothList.add("www.taobao.com")
|
||||
batchResolveBothList.add("www.163.com")
|
||||
batchResolveBothList.add("www.sohu.com")
|
||||
@@ -88,4 +88,5 @@ object BatchResolveCacheHolder {
|
||||
jsonObject.put("auto", autoArray)
|
||||
return jsonObject.toString()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -13,4 +13,5 @@ class HttpDnsApplication : Application() {
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -34,4 +34,5 @@ object HttpDnsServiceHolder {
|
||||
return dnsService
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -48,4 +48,5 @@ class MainActivity : AppCompatActivity() {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -89,4 +89,5 @@ object PreResolveCacheHolder {
|
||||
|
||||
return jsonObject.toString()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -45,3 +45,4 @@ class SingleLiveData<T> : MutableLiveData<T>() {
|
||||
value = null
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -47,4 +47,5 @@ object TtlCacheHolder {
|
||||
return jsonObject.toString()
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -113,7 +113,7 @@ fun String?.toBlackList(): MutableList<String>? {
|
||||
|
||||
fun getAccountPreference(context: Context): SharedPreferences {
|
||||
return context.getSharedPreferences(
|
||||
"aliyun_httpdns_${BuildConfig.ACCOUNT_ID}",
|
||||
"Aliyun_httpdns_${BuildConfig.ACCOUNT_ID}",
|
||||
Context.MODE_PRIVATE
|
||||
)
|
||||
}
|
||||
@@ -138,3 +138,4 @@ fun readStringFrom(streamReader: BufferedReader): StringBuilder {
|
||||
}
|
||||
return sb
|
||||
}
|
||||
|
||||
|
||||
@@ -51,4 +51,5 @@ const val KEY_PRE_RESOLVE_HOST_LIST = "pre_resolve_host_list"
|
||||
|
||||
const val KEY_SDNS_GLOBAL_PARAMS = "sdns_global_params"
|
||||
|
||||
const val KEY_BATCH_RESOLVE_HOST_LIST = "batch_resolve_host_list"
|
||||
const val KEY_BATCH_RESOLVE_HOST_LIST = "batch_resolve_host_list"
|
||||
|
||||
|
||||
@@ -52,7 +52,7 @@ class HttpURLConnectionRequest(private val context: Context, private val request
|
||||
|
||||
var ipURL: String? = null
|
||||
dnsService?.let {
|
||||
//替换为最新的api
|
||||
//鏇挎崲涓烘渶鏂扮殑api
|
||||
Log.d("HttpURLConnection", "start lookup $host via $resolveMethod")
|
||||
var httpDnsResult = HTTPDNSResult("", null, null, null, false, false)
|
||||
if (resolveMethod == "getHttpDnsResultForHostSync(String host, RequestIpType type)") {
|
||||
@@ -83,7 +83,7 @@ class HttpURLConnectionRequest(private val context: Context, private val request
|
||||
}
|
||||
}
|
||||
|
||||
Log.d("HttpURLConnection", "httpdns $host 解析结果 $httpDnsResult")
|
||||
Log.d("HttpURLConnection", "httpdns $host 瑙f瀽缁撴灉 $httpDnsResult")
|
||||
val ipStackType = HttpDnsNetworkDetector.getInstance().getNetType(context)
|
||||
val isV6 = ipStackType == NetType.v6 || ipStackType == NetType.both
|
||||
val isV4 = ipStackType == NetType.v4 || ipStackType == NetType.both
|
||||
@@ -104,9 +104,9 @@ class HttpURLConnectionRequest(private val context: Context, private val request
|
||||
|
||||
if (conn is HttpsURLConnection) {
|
||||
val sslSocketFactory = TLSSNISocketFactory(conn)
|
||||
// SNI场景,创建SSLSocket
|
||||
// SNI鍦烘櫙锛屽垱寤篠SLSocket
|
||||
conn.sslSocketFactory = sslSocketFactory
|
||||
// https场景,证书校验
|
||||
// https鍦烘櫙锛岃瘉涔︽牎楠?
|
||||
conn.hostnameVerifier = HostnameVerifier { _, session ->
|
||||
val requestHost = conn.getRequestProperty("Host") ?:conn.getURL().host
|
||||
HttpsURLConnection.getDefaultHostnameVerifier().verify(requestHost, session)
|
||||
@@ -115,13 +115,13 @@ class HttpURLConnectionRequest(private val context: Context, private val request
|
||||
|
||||
val responseCode = conn.responseCode
|
||||
if (needRedirect(responseCode)) {
|
||||
//临时重定向和永久重定向location的大小写有区分
|
||||
//涓存椂閲嶅畾鍚戝拰姘镐箙閲嶅畾鍚憀ocation鐨勫ぇ灏忓啓鏈夊尯鍒?
|
||||
var location = conn.getHeaderField("Location")
|
||||
if (location == null) {
|
||||
location = conn.getHeaderField("location")
|
||||
}
|
||||
if (!(location!!.startsWith("http://") || location.startsWith("https://"))) {
|
||||
//某些时候会省略host,只返回后面的path,所以需要补全url
|
||||
//鏌愪簺鏃跺€欎細鐪佺暐host锛屽彧杩斿洖鍚庨潰鐨刾ath锛屾墍浠ラ渶瑕佽ˉ鍏╱rl
|
||||
val originalUrl = URL(url)
|
||||
location = (originalUrl.protocol + "://"
|
||||
+ originalUrl.host + location)
|
||||
@@ -135,4 +135,5 @@ class HttpURLConnectionRequest(private val context: Context, private val request
|
||||
return code in 300..399
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -8,4 +8,5 @@ import com.alibaba.ams.emas.demo.ui.resolve.Response
|
||||
*/
|
||||
interface IRequest {
|
||||
fun get(url: String): Response
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -74,7 +74,7 @@ import java.util.concurrent.TimeUnit
|
||||
override fun lookup(hostname: String): List<InetAddress> {
|
||||
Log.d(tag, "start lookup $hostname via $mResolveMethod")
|
||||
val dnsService = HttpDnsServiceHolder.getHttpDnsService(mContext.get()!!)
|
||||
//修改为最新的通俗易懂的api
|
||||
//淇敼涓烘渶鏂扮殑閫氫織鏄撴噦鐨刟pi
|
||||
var httpDnsResult: HTTPDNSResult? = null
|
||||
val inetAddresses = mutableListOf<InetAddress>()
|
||||
if (mResolveMethod == "getHttpDnsResultForHostSync(String host, RequestIpType type)") {
|
||||
@@ -113,11 +113,11 @@ import java.util.concurrent.TimeUnit
|
||||
}
|
||||
}
|
||||
|
||||
Log.d(tag, "httpdns $hostname 解析结果 $httpDnsResult")
|
||||
Log.d(tag, "httpdns $hostname 瑙f瀽缁撴灉 $httpDnsResult")
|
||||
httpDnsResult?.let { processDnsResult(it, inetAddresses) }
|
||||
|
||||
if (inetAddresses.isEmpty()) {
|
||||
Log.d(tag, "httpdns 未返回IP,走local dns")
|
||||
Log.d(tag, "httpdns 鏈繑鍥濱P锛岃蛋local dns")
|
||||
return Dns.SYSTEM.lookup(hostname)
|
||||
}
|
||||
return inetAddresses
|
||||
@@ -147,3 +147,4 @@ import java.util.concurrent.TimeUnit
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -7,4 +7,5 @@ class OkHttpLog: HttpLoggingInterceptor.Logger {
|
||||
override fun log(message: String) {
|
||||
Log.d("Okhttp", message)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -23,4 +23,5 @@ class OkHttpRequest constructor(
|
||||
.use { response -> return Response(response.code, response.body?.string()) }
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -80,4 +80,5 @@ class TLSSNISocketFactory(connection: HttpsURLConnection): SSLSocketFactory() {
|
||||
override fun getSupportedCipherSuites(): Array<String?> {
|
||||
return arrayOfNulls(0)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -175,4 +175,5 @@ class BasicSettingFragment : Fragment(), IBasicShowDialog {
|
||||
_binding?.initHttpdns?.isClickable = false
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -37,54 +37,54 @@ class BasicSettingViewModel(application: Application) : AndroidViewModel(applica
|
||||
var secretKeySetByConfig = true
|
||||
|
||||
/**
|
||||
* 是否开启鉴权模式
|
||||
* 鏄惁寮€鍚壌鏉冩ā寮?
|
||||
*/
|
||||
var enableAuthMode = true
|
||||
|
||||
/**
|
||||
* 是否开启加密模式
|
||||
* 鏄惁寮€鍚姞瀵嗘ā寮?
|
||||
*/
|
||||
var enableEncryptMode = true
|
||||
|
||||
/**
|
||||
* 是否允许过期IP
|
||||
* 鏄惁鍏佽杩囨湡IP
|
||||
*/
|
||||
var enableExpiredIP = false
|
||||
|
||||
/**
|
||||
* 是否开启本地缓存
|
||||
* 鏄惁寮€鍚湰鍦扮紦瀛?
|
||||
*/
|
||||
var enableCacheIP = false
|
||||
|
||||
/**
|
||||
* 是否允许HTTPS
|
||||
* 鏄惁鍏佽HTTPS
|
||||
*/
|
||||
var enableHttps = false
|
||||
|
||||
/**
|
||||
* 是否开启降级
|
||||
* 鏄惁寮€鍚檷绾?
|
||||
*/
|
||||
var enableDegrade = false
|
||||
|
||||
/**
|
||||
* 是否允许网络切换自动刷新
|
||||
* 鏄惁鍏佽缃戠粶鍒囨崲鑷姩鍒锋柊
|
||||
*/
|
||||
var enableAutoRefresh = false
|
||||
|
||||
/**
|
||||
* 是否允许打印日志
|
||||
* 鏄惁鍏佽鎵撳嵃鏃ュ織
|
||||
*/
|
||||
var enableLog = false
|
||||
|
||||
/**
|
||||
* 当前Region
|
||||
* 褰撳墠Region
|
||||
*/
|
||||
var currentRegion = SingleLiveData<String>().apply {
|
||||
value = ""
|
||||
}
|
||||
|
||||
/**
|
||||
* 当前超时
|
||||
* 褰撳墠瓒呮椂
|
||||
*/
|
||||
var currentTimeout = SingleLiveData<String>().apply {
|
||||
value = "2000ms"
|
||||
@@ -188,7 +188,7 @@ class BasicSettingViewModel(application: Application) : AndroidViewModel(applica
|
||||
}
|
||||
|
||||
fun setRegion() {
|
||||
//弹窗选择region
|
||||
//寮圭獥閫夋嫨region
|
||||
showDialog?.showSelectRegionDialog()
|
||||
}
|
||||
|
||||
@@ -253,21 +253,21 @@ class BasicSettingViewModel(application: Application) : AndroidViewModel(applica
|
||||
val timeout = preferences.getInt(KEY_TIMEOUT, 2000)
|
||||
val region = preferences.getString(KEY_REGION, "cn")
|
||||
val enableDegradationLocalDns = preferences.getBoolean(KEY_ENABLE_DEGRADE, false);
|
||||
//自定义ttl
|
||||
//鑷畾涔塼tl
|
||||
val ttlCacheStr = preferences.getString(KEY_TTL_CHANGER, null)
|
||||
TtlCacheHolder.convertTtlCacheData(ttlCacheStr)
|
||||
//IP探测
|
||||
//IP鎺㈡祴
|
||||
val ipRankingItemJson = preferences.getString(KEY_IP_RANKING_ITEMS, null)
|
||||
//主站域名
|
||||
//涓荤珯鍩熷悕
|
||||
val hostListWithFixedIpJson =
|
||||
preferences.getString(KEY_HOST_WITH_FIXED_IP, null)
|
||||
val tagsJson = preferences.getString(KEY_TAGS, null)
|
||||
//预解析
|
||||
//棰勮В鏋?
|
||||
val preResolveHostList = preferences.getString(KEY_PRE_RESOLVE_HOST_LIST, null)
|
||||
preResolveHostList?.let { Log.d("httpdns:HttpDnsApplication", "pre resolve list: $it") }
|
||||
PreResolveCacheHolder.convertPreResolveCacheData(preResolveHostList)
|
||||
|
||||
//批量解析
|
||||
//鎵归噺瑙f瀽
|
||||
val batchResolveHostList = preferences.getString(KEY_BATCH_RESOLVE_HOST_LIST, null)
|
||||
BatchResolveCacheHolder.convertBatchResolveCacheData(batchResolveHostList)
|
||||
|
||||
@@ -358,4 +358,5 @@ class BasicSettingViewModel(application: Application) : AndroidViewModel(applica
|
||||
private fun getString(resId: Int, vararg args: String): String {
|
||||
return getApplication<HttpDnsApplication>().getString(resId, *args)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -14,4 +14,5 @@ interface IBasicShowDialog {
|
||||
fun showAddPreResolveDialog()
|
||||
|
||||
fun onHttpDnsInit()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -91,4 +91,5 @@ class InfoFragment : Fragment() {
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -16,14 +16,14 @@ import com.aliyun.ams.httpdns.demo.R
|
||||
class InfoViewModel(application: Application) : AndroidViewModel(application) {
|
||||
|
||||
/**
|
||||
* 账户ID
|
||||
* 璐︽埛ID
|
||||
*/
|
||||
val accountId = SingleLiveData<String>().apply {
|
||||
value = ""
|
||||
}
|
||||
|
||||
/**
|
||||
* 账户secret
|
||||
* 璐︽埛secret
|
||||
*/
|
||||
val secretKey = SingleLiveData<String?>()
|
||||
|
||||
@@ -59,4 +59,5 @@ class InfoViewModel(application: Application) : AndroidViewModel(application) {
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -42,4 +42,5 @@ class SdnsGlobalSettingActivity: AppCompatActivity() {
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -52,7 +52,7 @@ class ListActivity : AppCompatActivity(), ListAdapter.OnDeleteListener {
|
||||
|
||||
binding.infoListToolbar.title = title
|
||||
setSupportActionBar(binding.infoListToolbar)
|
||||
supportActionBar?.setDisplayHomeAsUpEnabled(true)//添加默认的返回图标
|
||||
supportActionBar?.setDisplayHomeAsUpEnabled(true)//娣诲姞榛樿鐨勮繑鍥炲浘鏍?
|
||||
supportActionBar?.setHomeButtonEnabled(true)
|
||||
|
||||
binding.infoListView.layoutManager = LinearLayoutManager(this, RecyclerView.VERTICAL, false)
|
||||
@@ -170,7 +170,7 @@ class ListActivity : AppCompatActivity(), ListAdapter.OnDeleteListener {
|
||||
ipTypeGroup.addView(view)
|
||||
|
||||
view = createIpTypeRadio(this)
|
||||
view.text = "自动判断IP类型"
|
||||
view.text = "鑷姩鍒ゆ柇IP绫诲瀷"
|
||||
view.tag = 3
|
||||
ipTypeGroup.addView(view)
|
||||
|
||||
@@ -214,7 +214,7 @@ class ListActivity : AppCompatActivity(), ListAdapter.OnDeleteListener {
|
||||
view.tag = 2
|
||||
ipTypeGroup.addView(view)
|
||||
view = createIpTypeRadio(this)
|
||||
view.text = "自动判断IP类型"
|
||||
view.text = "鑷姩鍒ゆ柇IP绫诲瀷"
|
||||
view.tag = 3
|
||||
ipTypeGroup.addView(view)
|
||||
val builder = AlertDialog.Builder(this)
|
||||
@@ -325,7 +325,7 @@ class ListActivity : AppCompatActivity(), ListAdapter.OnDeleteListener {
|
||||
}
|
||||
|
||||
override fun onHostWithFixedIPDeleted(position: Int) {
|
||||
//只能重启生效
|
||||
//鍙兘閲嶅惎鐢熸晥
|
||||
viewModel.onHostWithFixedIPDeleted(position)
|
||||
}
|
||||
|
||||
@@ -349,4 +349,5 @@ class ListActivity : AppCompatActivity(), ListAdapter.OnDeleteListener {
|
||||
override fun onBatchResolveDeleted(host: String, intValue: Int) {
|
||||
viewModel.onBatchResolveDeleted(host, intValue)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -109,7 +109,7 @@ class ListAdapter(private val context: Context,
|
||||
0 -> "IPv4"
|
||||
1 -> "IPv6"
|
||||
2 -> "IPv4&IPv6"
|
||||
else -> "自动判断IP类型"
|
||||
else -> "鑷姩鍒ゆ柇IP绫诲瀷"
|
||||
}
|
||||
binding.portOrTtlIndicate.text = context.getString(R.string.ip_type)
|
||||
}
|
||||
@@ -121,7 +121,7 @@ class ListAdapter(private val context: Context,
|
||||
0 -> "IPv4"
|
||||
1 -> "IPv6"
|
||||
2 -> "IPv4&IPv6"
|
||||
else -> "自动判断IP类型"
|
||||
else -> "鑷姩鍒ゆ柇IP绫诲瀷"
|
||||
}
|
||||
binding.portOrTtlIndicate.text = context.getString(R.string.ip_type)
|
||||
}
|
||||
@@ -147,4 +147,5 @@ class ListAdapter(private val context: Context,
|
||||
|
||||
fun onBatchResolveDeleted(host: String, intValue: Int)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -5,4 +5,5 @@ package com.alibaba.ams.emas.demo.ui.info.list
|
||||
* @date 2023/6/5
|
||||
*/
|
||||
|
||||
data class ListItem(var type: Int, var content: String, var intValue: Int)
|
||||
data class ListItem(var type: Int, var content: String, var intValue: Int)
|
||||
|
||||
|
||||
@@ -17,4 +17,5 @@ const val kListItemTypeBlackList = 0x05
|
||||
|
||||
const val kListItemBatchResolve = 0x06
|
||||
|
||||
const val kListItemTag = 0x07
|
||||
const val kListItemTag = 0x07
|
||||
|
||||
|
||||
@@ -354,7 +354,7 @@ class ListViewModel(application: Application) : AndroidViewModel(application) {
|
||||
}
|
||||
|
||||
fun onHostWithFixedIPDeleted(position: Int) {
|
||||
//只能重启生效
|
||||
//鍙兘閲嶅惎鐢熸晥
|
||||
val deletedHost = hostFixedIpList.removeAt(position)
|
||||
saveHostWithFixedIP()
|
||||
}
|
||||
@@ -403,4 +403,5 @@ class ListViewModel(application: Application) : AndroidViewModel(application) {
|
||||
private fun getString(resId: Int, vararg args: String): String {
|
||||
return getApplication<HttpDnsApplication>().getString(resId, *args)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -64,4 +64,5 @@ class BestPracticeFragment : Fragment(), IBestPracticeShowDialog {
|
||||
}
|
||||
builder?.show()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@ import com.alibaba.ams.emas.demo.readStringFrom
|
||||
import com.alibaba.sdk.android.httpdns.NetType
|
||||
import com.alibaba.sdk.android.httpdns.RequestIpType
|
||||
import com.alibaba.sdk.android.httpdns.net.HttpDnsNetworkDetector
|
||||
import com.alibaba.sdk.android.tool.NetworkUtils
|
||||
import com.Alibaba.sdk.android.tool.NetworkUtils
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.withContext
|
||||
@@ -56,7 +56,7 @@ class BestPracticeViewModel(application: Application) : AndroidViewModel(applica
|
||||
val dnsService = HttpDnsServiceHolder.getHttpDnsService(getApplication())
|
||||
dnsService?.let {
|
||||
val httpDnsResult = dnsService.getIpsByHostAsync(host, RequestIpType.both)
|
||||
Log.d("httpdns", "$host 解析结果 $httpDnsResult")
|
||||
Log.d("httpdns", "$host 瑙f瀽缁撴灉 $httpDnsResult")
|
||||
val ipStackType = HttpDnsNetworkDetector.getInstance().getNetType(getApplication())
|
||||
val isV6 = ipStackType == NetType.v6 || ipStackType == NetType.both
|
||||
val isV4 = ipStackType == NetType.v4 || ipStackType == NetType.both
|
||||
@@ -75,9 +75,9 @@ class BestPracticeViewModel(application: Application) : AndroidViewModel(applica
|
||||
conn.readTimeout = 30000
|
||||
conn.instanceFollowRedirects = false
|
||||
|
||||
//设置SNI
|
||||
//璁剧疆SNI
|
||||
val sslSocketFactory = TLSSNISocketFactory(conn)
|
||||
// SNI场景,创建SSLSocket
|
||||
// SNI鍦烘櫙锛屽垱寤篠SLSocket
|
||||
conn.sslSocketFactory = sslSocketFactory
|
||||
conn.hostnameVerifier = HostnameVerifier { _, session ->
|
||||
val requestHost = conn.getRequestProperty("Host") ?: conn.url.host
|
||||
@@ -85,13 +85,13 @@ class BestPracticeViewModel(application: Application) : AndroidViewModel(applica
|
||||
}
|
||||
val code = conn.responseCode
|
||||
if (needRedirect(code)) {
|
||||
//临时重定向和永久重定向location的大小写有区分
|
||||
//涓存椂閲嶅畾鍚戝拰姘镐箙閲嶅畾鍚憀ocation鐨勫ぇ灏忓啓鏈夊尯鍒?
|
||||
var location = conn.getHeaderField("Location")
|
||||
if (location == null) {
|
||||
location = conn.getHeaderField("location")
|
||||
}
|
||||
if (!(location!!.startsWith("http://") || location.startsWith("https://"))) {
|
||||
//某些时候会省略host,只返回后面的path,所以需要补全url
|
||||
//鏌愪簺鏃跺€欎細鐪佺暐host锛屽彧杩斿洖鍚庨潰鐨刾ath锛屾墍浠ラ渶瑕佽ˉ鍏╱rl
|
||||
val originalUrl = URL(url)
|
||||
location = (originalUrl.protocol + "://"
|
||||
+ originalUrl.host + location)
|
||||
@@ -123,4 +123,5 @@ class BestPracticeViewModel(application: Application) : AndroidViewModel(applica
|
||||
return code in 300..399
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -26,7 +26,7 @@ class HttpDnsWebviewGetActivity : AppCompatActivity() {
|
||||
|
||||
binding.webviewToolbar.title = getString(R.string.httpdns_webview_best_practice)
|
||||
setSupportActionBar(binding.webviewToolbar)
|
||||
supportActionBar?.setDisplayHomeAsUpEnabled(true)//添加默认的返回图标
|
||||
supportActionBar?.setDisplayHomeAsUpEnabled(true)//娣诲姞榛樿鐨勮繑鍥炲浘鏍?
|
||||
supportActionBar?.setHomeButtonEnabled(true)
|
||||
|
||||
binding.httpdnsWebview.webViewClient = object : WebViewClient() {
|
||||
@@ -55,7 +55,7 @@ class HttpDnsWebviewGetActivity : AppCompatActivity() {
|
||||
val contentType = urlConnection.contentType
|
||||
val mimeType = contentType?.split(";")?.get(0)
|
||||
if (TextUtils.isEmpty(mimeType)) {
|
||||
//无mimeType得请求不拦截
|
||||
//鏃爉imeType寰楄姹備笉鎷︽埅
|
||||
return super.shouldInterceptRequest(view, request)
|
||||
}
|
||||
val charset = getCharset(contentType)
|
||||
@@ -79,7 +79,7 @@ class HttpDnsWebviewGetActivity : AppCompatActivity() {
|
||||
resourceResponse.setStatusCodeAndReasonPhrase(statusCode, response)
|
||||
val responseHeader: MutableMap<String?, String> = HashMap()
|
||||
for ((key) in headerFields) {
|
||||
// HttpUrlConnection可能包含key为null的报头,指向该http请求状态码
|
||||
// HttpUrlConnection鍙兘鍖呭惈key涓簄ull鐨勬姤澶达紝鎸囧悜璇ttp璇锋眰鐘舵€佺爜
|
||||
responseHeader[key] = httpURLConnection.getHeaderField(key)
|
||||
}
|
||||
resourceResponse.responseHeaders = responseHeader
|
||||
@@ -156,7 +156,7 @@ class HttpDnsWebviewGetActivity : AppCompatActivity() {
|
||||
|
||||
return if (location != null) {
|
||||
if (!(location.startsWith("http://") || location.startsWith("https://"))) {
|
||||
//某些时候会省略host,只返回后面的path,所以需要补全url
|
||||
//鏌愪簺鏃跺€欎細鐪佺暐host锛屽彧杩斿洖鍚庨潰鐨刾ath锛屾墍浠ラ渶瑕佽ˉ鍏╱rl
|
||||
val originalUrl = URL(path)
|
||||
location = (originalUrl.protocol + "://" + originalUrl.host + location)
|
||||
}
|
||||
|
||||
@@ -8,4 +8,5 @@ interface IBestPracticeShowDialog {
|
||||
fun showResponseDialog( message: String)
|
||||
|
||||
fun showNoNetworkDialog()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -79,3 +79,4 @@ class SNISocketFactory(private val conn: HttpsURLConnection) : SSLSocketFactory(
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -14,4 +14,5 @@ interface IResolveShowDialog {
|
||||
fun showResolveMethodDialog()
|
||||
|
||||
fun showRequestNumberDialog()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -8,4 +8,5 @@ enum class NetRequestType {
|
||||
OKHTTP,
|
||||
|
||||
HTTP_URL_CONNECTION
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -68,14 +68,14 @@ class ResolveFragment : Fragment(), IResolveShowDialog {
|
||||
|
||||
binding.startResolve.setOnClickListener {
|
||||
binding.resolveHostInputLayout.error = ""
|
||||
//1. 校验域名是否填写
|
||||
//1. 鏍¢獙鍩熷悕鏄惁濉啓
|
||||
val host = binding.resolveHostInputLayout.editText?.text.toString()
|
||||
if (TextUtils.isEmpty(host)) {
|
||||
binding.resolveHostInputLayout.error = getString(R.string.resolve_host_empty)
|
||||
return@setOnClickListener
|
||||
}
|
||||
var sdnsParams: MutableMap<String, String>? = null
|
||||
//2. 校验sdns参数
|
||||
//2. 鏍¢獙sdns鍙傛暟
|
||||
if (viewModel.isSdns.value!!) {
|
||||
val sdnsParamsStr = binding.sdnsParamsInputLayout.editText?.text.toString()
|
||||
if (!TextUtils.isEmpty(sdnsParamsStr)) {
|
||||
@@ -177,7 +177,7 @@ class ResolveFragment : Fragment(), IResolveShowDialog {
|
||||
val builder = activity?.let { act -> AlertDialog.Builder(act) }
|
||||
builder?.apply {
|
||||
setTitle(R.string.select_resolve_method)
|
||||
val items = arrayOf("同步方法", "异步方法", "同步非阻塞方法")
|
||||
val items = arrayOf("鍚屾鏂规硶", "寮傛鏂规硶", "鍚屾闈為樆濉炴柟娉?)
|
||||
val preferences = activity?.let { getAccountPreference(it) }
|
||||
|
||||
var resolvedMethod = preferences?.getString(KEY_RESOLVE_METHOD, "getHttpDnsResultForHostSync(String host, RequestIpType type)").toString()
|
||||
@@ -229,4 +229,5 @@ class ResolveFragment : Fragment(), IResolveShowDialog {
|
||||
}
|
||||
builder?.show()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -149,4 +149,5 @@ class ResolveViewModel(application: Application) : AndroidViewModel(application)
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -5,3 +5,4 @@ package com.alibaba.ams.emas.demo.ui.resolve
|
||||
* @date 2023/6/14
|
||||
*/
|
||||
data class Response(val code: Int, val body: String?)
|
||||
|
||||
|
||||
@@ -8,4 +8,5 @@ enum class SchemaType {
|
||||
HTTPS,
|
||||
|
||||
HTTP
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -37,18 +37,18 @@ class SwipeLayout(context: Context, attrs: AttributeSet?, defStyleAttr: Int) :
|
||||
constructor(context: Context, attrs: AttributeSet?) : this(context, attrs, 0)
|
||||
|
||||
/**
|
||||
* 初始化方法
|
||||
* 鍒濆鍖栨柟娉?
|
||||
*
|
||||
* @param context
|
||||
* @param attrs
|
||||
* @param defStyleAttr
|
||||
*/
|
||||
private fun init(context: Context, attrs: AttributeSet?, defStyleAttr: Int) {
|
||||
//创建辅助对象
|
||||
//鍒涘缓杈呭姪瀵硅薄
|
||||
val viewConfiguration = ViewConfiguration.get(context)
|
||||
scaledTouchSlop = viewConfiguration.scaledTouchSlop
|
||||
scroller = Scroller(context)
|
||||
//1、获取配置的属性值
|
||||
//1銆佽幏鍙栭厤缃殑灞炴€у€?
|
||||
val typedArray = context.theme
|
||||
.obtainStyledAttributes(attrs, R.styleable.SwipeLayout, defStyleAttr, 0)
|
||||
try {
|
||||
@@ -77,7 +77,7 @@ class SwipeLayout(context: Context, attrs: AttributeSet?, defStyleAttr: Int) :
|
||||
|
||||
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
|
||||
super.onMeasure(widthMeasureSpec, heightMeasureSpec)
|
||||
//获取childView的个数
|
||||
//鑾峰彇childView鐨勪釜鏁?
|
||||
isClickable = true
|
||||
var count = childCount
|
||||
val measureMatchParentChildren =
|
||||
@@ -173,7 +173,7 @@ class SwipeLayout(context: Context, attrs: AttributeSet?, defStyleAttr: Int) :
|
||||
contentView!!.isClickable = true
|
||||
}
|
||||
}
|
||||
//布局contentView
|
||||
//甯冨眬contentView
|
||||
val cRight: Int
|
||||
if (contentView != null) {
|
||||
contentViewLayoutParam = contentView!!.layoutParams as MarginLayoutParams?
|
||||
@@ -227,7 +227,7 @@ class SwipeLayout(context: Context, attrs: AttributeSet?, defStyleAttr: Int) :
|
||||
return@run
|
||||
}
|
||||
scrollBy(distanceX.toInt(), 0)
|
||||
//越界修正
|
||||
//瓒婄晫淇
|
||||
if (scrollX < 0) {
|
||||
scrollTo(0, 0)
|
||||
} else if (scrollX > 0) {
|
||||
@@ -238,7 +238,7 @@ class SwipeLayout(context: Context, attrs: AttributeSet?, defStyleAttr: Int) :
|
||||
)
|
||||
}
|
||||
}
|
||||
//当处于水平滑动时,禁止父类拦截
|
||||
//褰撳浜庢按骞虫粦鍔ㄦ椂锛岀姝㈢埗绫绘嫤鎴?
|
||||
if (abs(distanceX) > scaledTouchSlop) {
|
||||
parent.requestDisallowInterceptTouchEvent(true)
|
||||
}
|
||||
@@ -261,13 +261,13 @@ class SwipeLayout(context: Context, attrs: AttributeSet?, defStyleAttr: Int) :
|
||||
when (event.action) {
|
||||
MotionEvent.ACTION_DOWN -> {}
|
||||
MotionEvent.ACTION_MOVE -> {
|
||||
//滑动时拦截点击时间
|
||||
//婊戝姩鏃舵嫤鎴偣鍑绘椂闂?
|
||||
if (abs(finalDistanceX) > scaledTouchSlop) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> {
|
||||
//滑动后不触发contentView的点击事件
|
||||
//婊戝姩鍚庝笉瑙﹀彂contentView鐨勭偣鍑讳簨浠?
|
||||
if (isSwiping) {
|
||||
isSwiping = false
|
||||
finalDistanceX = 0f
|
||||
@@ -279,7 +279,7 @@ class SwipeLayout(context: Context, attrs: AttributeSet?, defStyleAttr: Int) :
|
||||
}
|
||||
|
||||
/**
|
||||
* 自动设置状态
|
||||
* 鑷姩璁剧疆鐘舵€?
|
||||
*
|
||||
* @param result
|
||||
*/
|
||||
@@ -302,7 +302,7 @@ class SwipeLayout(context: Context, attrs: AttributeSet?, defStyleAttr: Int) :
|
||||
}
|
||||
|
||||
override fun computeScroll() {
|
||||
//判断Scroller是否执行完毕:
|
||||
//鍒ゆ柇Scroller鏄惁鎵ц瀹屾瘯锛?
|
||||
if (scroller!!.computeScrollOffset()) {
|
||||
scrollTo(scroller!!.currX, scroller!!.currY)
|
||||
invalidate()
|
||||
@@ -310,7 +310,7 @@ class SwipeLayout(context: Context, attrs: AttributeSet?, defStyleAttr: Int) :
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据当前的scrollX的值判断松开手后应处于何种状态
|
||||
* 鏍规嵁褰撳墠鐨剆crollX鐨勫€煎垽鏂澗寮€鎵嬪悗搴斿浜庝綍绉嶇姸鎬?
|
||||
*
|
||||
* @param
|
||||
* @param scrollX
|
||||
@@ -321,12 +321,12 @@ class SwipeLayout(context: Context, attrs: AttributeSet?, defStyleAttr: Int) :
|
||||
return mStateCache
|
||||
}
|
||||
if (finalDistanceX < 0) {
|
||||
//关闭右边
|
||||
//鍏抽棴鍙宠竟
|
||||
if (scrollX > 0 && menuView != null) {
|
||||
return State.CLOSE
|
||||
}
|
||||
} else if (finalDistanceX > 0) {
|
||||
//开启右边
|
||||
//寮€鍚彸杈?
|
||||
if (scrollX > 0 && menuView != null) {
|
||||
if (abs(menuView!!.width * fraction) < abs(scrollX)) {
|
||||
return State.RIGHT_OPEN
|
||||
@@ -360,4 +360,5 @@ class SwipeLayout(context: Context, attrs: AttributeSet?, defStyleAttr: Int) :
|
||||
enum class State {
|
||||
RIGHT_OPEN, CLOSE
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,138 +1,138 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="app_name">阿里云HttpDNS官方Demo</string>
|
||||
<string name="title_basic">基础设置</string>
|
||||
<string name="title_resolve">HttpDNS解析</string>
|
||||
<string name="title_best_practice">最佳实践</string>
|
||||
<string name="title_info">信息</string>
|
||||
<string name="app_name">闃块噷浜慔ttpDNS瀹樻柟Demo</string>
|
||||
<string name="title_basic">鍩虹璁剧疆</string>
|
||||
<string name="title_resolve">HttpDNS瑙f瀽</string>
|
||||
<string name="title_best_practice">鏈€浣冲疄璺?/string>
|
||||
<string name="title_info">淇℃伅</string>
|
||||
|
||||
<string name="enable_auth_mode">开启鉴权模式</string>
|
||||
<string name="secret_key_location">SecretKey通过config配置</string>
|
||||
<string name="enable_encrypt_mode">开启加密模式</string>
|
||||
<string name="enable_expired_ip">允许过期IP</string>
|
||||
<string name="enable_local_cache">开启持久化缓存IP</string>
|
||||
<string name="cache_expire_time">缓存过期时间</string>
|
||||
<string name="cache_expire_time_unit">缓存过期时间的单位是天.</string>
|
||||
<string name="enable_https">开启HTTPS</string>
|
||||
<string name="enable_downgrade">允许降级</string>
|
||||
<string name="enable_network_changed_pre_resolve">网络切换自动刷新</string>
|
||||
<string name="enable_httpdns_log">允许SDK打印日志</string>
|
||||
<string name="timeout">超时时间</string>
|
||||
<string name="init_tip">请先初始化HttpDns</string>
|
||||
<string name="inited_httpdns">已经初始化</string>
|
||||
<string name="enable_auth_mode">寮€鍚壌鏉冩ā寮?/string>
|
||||
<string name="secret_key_location">SecretKey閫氳繃config閰嶇疆</string>
|
||||
<string name="enable_encrypt_mode">寮€鍚姞瀵嗘ā寮?/string>
|
||||
<string name="enable_expired_ip">鍏佽杩囨湡IP</string>
|
||||
<string name="enable_local_cache">寮€鍚寔涔呭寲缂撳瓨IP</string>
|
||||
<string name="cache_expire_time">缂撳瓨杩囨湡鏃堕棿</string>
|
||||
<string name="cache_expire_time_unit">缂撳瓨杩囨湡鏃堕棿鐨勫崟浣嶆槸澶?</string>
|
||||
<string name="enable_https">寮€鍚疕TTPS</string>
|
||||
<string name="enable_downgrade">鍏佽闄嶇骇</string>
|
||||
<string name="enable_network_changed_pre_resolve">缃戠粶鍒囨崲鑷姩鍒锋柊</string>
|
||||
<string name="enable_httpdns_log">鍏佽SDK鎵撳嵃鏃ュ織</string>
|
||||
<string name="timeout">瓒呮椂鏃堕棿</string>
|
||||
<string name="init_tip">璇峰厛鍒濆鍖朒ttpDns</string>
|
||||
<string name="inited_httpdns">宸茬粡鍒濆鍖?/string>
|
||||
|
||||
<string name="china">中国</string>
|
||||
<string name="china_hk">中国香港</string>
|
||||
<string name="singapore">新加坡</string>
|
||||
<string name="germany">德国</string>
|
||||
<string name="america">美国</string>
|
||||
<string name="pre">预发</string>
|
||||
<string name="china">涓浗</string>
|
||||
<string name="china_hk">涓浗棣欐腐</string>
|
||||
<string name="singapore">鏂板姞鍧?/string>
|
||||
<string name="germany">寰峰浗</string>
|
||||
<string name="america">缇庡浗</string>
|
||||
<string name="pre">棰勫彂</string>
|
||||
|
||||
<string name="select_region">选择Region</string>
|
||||
<string name="confirm">确认</string>
|
||||
<string name="cancel">取消</string>
|
||||
<string name="timeout_hint">请输入超时时间,毫秒为单位</string>
|
||||
<string name="set_timeout">设置超时</string>
|
||||
<string name="timeout_empty">超时时间为空</string>
|
||||
<string name="select_region">閫夋嫨Region</string>
|
||||
<string name="confirm">纭</string>
|
||||
<string name="cancel">鍙栨秷</string>
|
||||
<string name="timeout_hint">璇疯緭鍏ヨ秴鏃舵椂闂达紝姣涓哄崟浣?/string>
|
||||
<string name="set_timeout">璁剧疆瓒呮椂</string>
|
||||
<string name="timeout_empty">瓒呮椂鏃堕棿涓虹┖</string>
|
||||
|
||||
<string name="ip_probe_list">探测IP列表</string>
|
||||
<string name="ttl_cache_list">自定义TTL缓存列表</string>
|
||||
<string name="host_fixed_ip_list">主站域名列表</string>
|
||||
<string name="host_black_list">域名黑名单列表</string>
|
||||
<string name="sdns_global_params">自定义解析全局参数</string>
|
||||
<string name="batch_resolve">批量解析域名</string>
|
||||
<string name="ip_probe_list">鎺㈡祴IP鍒楄〃</string>
|
||||
<string name="ttl_cache_list">鑷畾涔塗TL缂撳瓨鍒楄〃</string>
|
||||
<string name="host_fixed_ip_list">涓荤珯鍩熷悕鍒楄〃</string>
|
||||
<string name="host_black_list">鍩熷悕榛戝悕鍗曞垪琛?/string>
|
||||
<string name="sdns_global_params">鑷畾涔夎В鏋愬叏灞€鍙傛暟</string>
|
||||
<string name="batch_resolve">鎵归噺瑙f瀽鍩熷悕</string>
|
||||
|
||||
<string name="httpdns_sdk_version">HttpDNS版本号</string>
|
||||
<string name="unknown">未知</string>
|
||||
<string name="ip_stack">当前所连接网络的网络栈类型</string>
|
||||
<string name="clear_host_cache">清空指定域名缓存</string>
|
||||
<string name="clear_cache_hint">请输入要清空缓存的域名</string>
|
||||
<string name="network_request_type">网络请求类型</string>
|
||||
<string name="async_resolve">异步解析获取IP</string>
|
||||
<string name="sdns_resolve">自定义域名解析</string>
|
||||
<string name="ip_type">要解析的IP类型</string>
|
||||
<string name="resolve_method">使用的解析方法</string>
|
||||
<string name="request_num">并发请求次数</string>
|
||||
<string name="httpdns_sdk_version">HttpDNS鐗堟湰鍙?/string>
|
||||
<string name="unknown">鏈煡</string>
|
||||
<string name="ip_stack">褰撳墠鎵€杩炴帴缃戠粶鐨勭綉缁滄爤绫诲瀷</string>
|
||||
<string name="clear_host_cache">娓呯┖鎸囧畾鍩熷悕缂撳瓨</string>
|
||||
<string name="clear_cache_hint">璇疯緭鍏ヨ娓呯┖缂撳瓨鐨勫煙鍚?/string>
|
||||
<string name="network_request_type">缃戠粶璇锋眰绫诲瀷</string>
|
||||
<string name="async_resolve">寮傛瑙f瀽鑾峰彇IP</string>
|
||||
<string name="sdns_resolve">鑷畾涔夊煙鍚嶈В鏋?/string>
|
||||
<string name="ip_type">瑕佽В鏋愮殑IP绫诲瀷</string>
|
||||
<string name="resolve_method">浣跨敤鐨勮В鏋愭柟娉?/string>
|
||||
<string name="request_num">骞跺彂璇锋眰娆℃暟</string>
|
||||
|
||||
<string name="select_resolve_ip_type">选择IP类型</string>
|
||||
<string name="select_resolve_method">选择解析方法</string>
|
||||
<string name="select_request_num">选择并发请求次数</string>
|
||||
<string name="auto_get_ip_type">自动判断IP类型</string>
|
||||
<string name="add_pre_resolve">添加预解析域名</string>
|
||||
<string name="add_pre_resolve_hint">请输入要预解析的域名</string>
|
||||
<string name="pre_resolve_list">预解析域名列表</string>
|
||||
<string name="add_tag">添加Tag</string>
|
||||
<string name="pre_resolve_host_duplicate">%s域名已经被添加至预解析列表,请勿重复添加</string>
|
||||
<string name="init_httpdns">初始化HttpDns</string>
|
||||
<string name="batch_resolve_list">批量解析域名列表</string>
|
||||
<string name="add_batch_resolve_hint">请输入要批量解析的域名</string>
|
||||
<string name="add_batch_resolve">请输入要批量解析的域名</string>
|
||||
<string name="batch_resolve_host_duplicate">%s域名已经被添加至批量解析列表,请勿重复添加</string>
|
||||
<string name="select_resolve_ip_type">閫夋嫨IP绫诲瀷</string>
|
||||
<string name="select_resolve_method">閫夋嫨瑙f瀽鏂规硶</string>
|
||||
<string name="select_request_num">閫夋嫨骞跺彂璇锋眰娆℃暟</string>
|
||||
<string name="auto_get_ip_type">鑷姩鍒ゆ柇IP绫诲瀷</string>
|
||||
<string name="add_pre_resolve">娣诲姞棰勮В鏋愬煙鍚?/string>
|
||||
<string name="add_pre_resolve_hint">璇疯緭鍏ヨ棰勮В鏋愮殑鍩熷悕</string>
|
||||
<string name="pre_resolve_list">棰勮В鏋愬煙鍚嶅垪琛?/string>
|
||||
<string name="add_tag">娣诲姞Tag</string>
|
||||
<string name="pre_resolve_host_duplicate">%s鍩熷悕宸茬粡琚坊鍔犺嚦棰勮В鏋愬垪琛紝璇峰嬁閲嶅娣诲姞</string>
|
||||
<string name="init_httpdns">鍒濆鍖朒ttpDns</string>
|
||||
<string name="batch_resolve_list">鎵归噺瑙f瀽鍩熷悕鍒楄〃</string>
|
||||
<string name="add_batch_resolve_hint">璇疯緭鍏ヨ鎵归噺瑙f瀽鐨勫煙鍚?/string>
|
||||
<string name="add_batch_resolve">璇疯緭鍏ヨ鎵归噺瑙f瀽鐨勫煙鍚?/string>
|
||||
<string name="batch_resolve_host_duplicate">%s鍩熷悕宸茬粡琚坊鍔犺嚦鎵归噺瑙f瀽鍒楄〃锛岃鍕块噸澶嶆坊鍔?/string>
|
||||
|
||||
<string name="host">域名:</string>
|
||||
<string name="port">端口:</string>
|
||||
<string name="ttl">TTL时长: </string>
|
||||
<string name="host">鍩熷悕锛?/string>
|
||||
<string name="port">绔彛锛?/string>
|
||||
<string name="ttl">TTL鏃堕暱: </string>
|
||||
|
||||
<string name="add_host_fixed_ip_hint">请输入主站域名</string>
|
||||
<string name="add_host_fixed_ip">添加主站域名</string>
|
||||
<string name="host_fixed_ip_empty">主站域名为空</string>
|
||||
<string name="host_fixed_ip_duplicate">%s主站域名已经被添加,请勿重复添加</string>
|
||||
<string name="add_host_fixed_ip_hint">璇疯緭鍏ヤ富绔欏煙鍚?/string>
|
||||
<string name="add_host_fixed_ip">娣诲姞涓荤珯鍩熷悕</string>
|
||||
<string name="host_fixed_ip_empty">涓荤珯鍩熷悕涓虹┖</string>
|
||||
<string name="host_fixed_ip_duplicate">%s涓荤珯鍩熷悕宸茬粡琚坊鍔狅紝璇峰嬁閲嶅娣诲姞</string>
|
||||
|
||||
<string name="add_tag_hint">请输入标签</string>
|
||||
<string name="add_tag_hint">璇疯緭鍏ユ爣绛?/string>
|
||||
|
||||
<string name="add_host_to_black_list_hint">请输入不使用HttpDns解析的域名</string>
|
||||
<string name="add_host_to_black_list">添加不使用HttpDns的域名</string>
|
||||
<string name="host_to_black_list_empty">域名为空</string>
|
||||
<string name="host_black_list_duplicate">%s域名已经在黑名单中,请勿重复添加</string>
|
||||
<string name="add_host_to_black_list_hint">璇疯緭鍏ヤ笉浣跨敤HttpDns瑙f瀽鐨勫煙鍚?/string>
|
||||
<string name="add_host_to_black_list">娣诲姞涓嶄娇鐢℉ttpDns鐨勫煙鍚?/string>
|
||||
<string name="host_to_black_list_empty">鍩熷悕涓虹┖</string>
|
||||
<string name="host_black_list_duplicate">%s鍩熷悕宸茬粡鍦ㄩ粦鍚嶅崟涓紝璇峰嬁閲嶅娣诲姞</string>
|
||||
|
||||
<string name="add_ip_probe_host_hint">请输入探测IP的域名</string>
|
||||
<string name="add_ip_probe_port_hint">请输入探测IP的端口</string>
|
||||
<string name="add_ip_probe">添加IP探测</string>
|
||||
<string name="port_is_empty">端口号为空</string>
|
||||
<string name="ip_probe_item_duplicate">%s:%s已经被添加至IP探测列表,请勿重复添加</string>
|
||||
<string name="add_ip_probe_host_hint">璇疯緭鍏ユ帰娴婭P鐨勫煙鍚?/string>
|
||||
<string name="add_ip_probe_port_hint">璇疯緭鍏ユ帰娴婭P鐨勭鍙?/string>
|
||||
<string name="add_ip_probe">娣诲姞IP鎺㈡祴</string>
|
||||
<string name="port_is_empty">绔彛鍙蜂负绌?/string>
|
||||
<string name="ip_probe_item_duplicate">%s:%s宸茬粡琚坊鍔犺嚦IP鎺㈡祴鍒楄〃锛岃鍕块噸澶嶆坊鍔?/string>
|
||||
|
||||
<string name="host_is_empty">域名为空</string>
|
||||
<string name="pre_resolve_host_is_empty">预解析的域名为空</string>
|
||||
<string name="batch_resolve_host_is_empty">批量解析的域名为空</string>
|
||||
<string name="host_is_empty">鍩熷悕涓虹┖</string>
|
||||
<string name="pre_resolve_host_is_empty">棰勮В鏋愮殑鍩熷悕涓虹┖</string>
|
||||
<string name="batch_resolve_host_is_empty">鎵归噺瑙f瀽鐨勫煙鍚嶄负绌?/string>
|
||||
|
||||
<string name="add_ttl_host_hint">请输入缓存的域名</string>
|
||||
<string name="add_ttl_ttl_hint">请输入缓存的ttl时间,单位:秒</string>
|
||||
<string name="add_custom_ttl">添加自定义TTL</string>
|
||||
<string name="ttl_is_empty">TTL时间为空</string>
|
||||
<string name="ttl_is_not_number">请输入正确格式的TTL时长</string>
|
||||
<string name="add_ttl_host_hint">璇疯緭鍏ョ紦瀛樼殑鍩熷悕</string>
|
||||
<string name="add_ttl_ttl_hint">璇疯緭鍏ョ紦瀛樼殑ttl鏃堕棿锛屽崟浣嶏細绉?/string>
|
||||
<string name="add_custom_ttl">娣诲姞鑷畾涔塗TL</string>
|
||||
<string name="ttl_is_empty">TTL鏃堕棿涓虹┖</string>
|
||||
<string name="ttl_is_not_number">璇疯緭鍏ユ纭牸寮忕殑TTL鏃堕暱</string>
|
||||
|
||||
<string name="delete">删除</string>
|
||||
<string name="clear_all_cache">清除所有HttpDNS配置缓存</string>
|
||||
<string name="all_cache_cleared">所有HttpDNS配置缓存都已清除</string>
|
||||
<string name="clear_dns_cache">清空Dns缓存(500次)</string>
|
||||
<string name="delete">鍒犻櫎</string>
|
||||
<string name="clear_all_cache">娓呴櫎鎵€鏈塇ttpDNS閰嶇疆缂撳瓨</string>
|
||||
<string name="all_cache_cleared">鎵€鏈塇ttpDNS閰嶇疆缂撳瓨閮藉凡娓呴櫎</string>
|
||||
<string name="clear_dns_cache">娓呯┖Dns缂撳瓨锛?00娆★級</string>
|
||||
|
||||
<string name="input_the_sdns_params">自定义解析的参数</string>
|
||||
<string name="input_the_sdns_params_help_text">json对象格式</string>
|
||||
<string name="input_the_sdns_params_error">自定义解析的参数必须是json对象</string>
|
||||
<string name="input_the_sdns_params">鑷畾涔夎В鏋愮殑鍙傛暟</string>
|
||||
<string name="input_the_sdns_params_help_text">json瀵硅薄鏍煎紡</string>
|
||||
<string name="input_the_sdns_params_error">鑷畾涔夎В鏋愮殑鍙傛暟蹇呴』鏄痡son瀵硅薄</string>
|
||||
|
||||
<string name="input_the_sdns_cache_key">自定义解析的cache key</string>
|
||||
<string name="input_the_sdns_cache_key_help_text">Cache key用于唯一标识缓存中的解析结果</string>
|
||||
<string name="input_the_sdns_cache_key">鑷畾涔夎В鏋愮殑cache key</string>
|
||||
<string name="input_the_sdns_cache_key_help_text">Cache key鐢ㄤ簬鍞竴鏍囪瘑缂撳瓨涓殑瑙f瀽缁撴灉</string>
|
||||
|
||||
<string name="input_the_resolve_host">要解析的域名</string>
|
||||
<string name="input_the_resolve_host_help_text">例如:help.aliyun.com</string>
|
||||
<string name="input_the_request_api">要请求的接口</string>
|
||||
<string name="input_the_request_api_help_text">例如: /document_detail/434554.html</string>
|
||||
<string name="input_the_resolve_host">瑕佽В鏋愮殑鍩熷悕</string>
|
||||
<string name="input_the_resolve_host_help_text">渚嬪锛歨elp.aliyun.com</string>
|
||||
<string name="input_the_request_api">瑕佽姹傜殑鎺ュ彛</string>
|
||||
<string name="input_the_request_api_help_text">渚嬪: /document_detail/434554.html</string>
|
||||
|
||||
<string name="resolve_and_request">解析并请求</string>
|
||||
<string name="resolve_host_empty">域名不能为空</string>
|
||||
<string name="host_is_ip">域名不能是IP地址</string>
|
||||
<string name="host_illegal">请输入正确格式的域名</string>
|
||||
<string name="schema_type">Schema类型</string>
|
||||
<string name="httpdns_webview_best_practice">HttpDNS WebView 拦截GET请求</string>
|
||||
<string name="httpdns_webview_post_best_practice">HttpDNS WebView POST请求通过Native发送</string>
|
||||
<string name="httpdns_sni">HttpDNS IP直连方案</string>
|
||||
<string name="resolve_and_request">瑙f瀽骞惰姹?/string>
|
||||
<string name="resolve_host_empty">鍩熷悕涓嶈兘涓虹┖</string>
|
||||
<string name="host_is_ip">鍩熷悕涓嶈兘鏄疘P鍦板潃</string>
|
||||
<string name="host_illegal">璇疯緭鍏ユ纭牸寮忕殑鍩熷悕</string>
|
||||
<string name="schema_type">Schema绫诲瀷</string>
|
||||
<string name="httpdns_webview_best_practice">HttpDNS WebView 鎷︽埅GET璇锋眰</string>
|
||||
<string name="httpdns_webview_post_best_practice">HttpDNS WebView POST璇锋眰閫氳繃Native鍙戦€?/string>
|
||||
<string name="httpdns_sni">HttpDNS IP鐩磋繛鏂规</string>
|
||||
|
||||
<string name="ok">好的</string>
|
||||
<string name="response_title">请求结果</string>
|
||||
<string name="body_large_see_log">Body请通过日志查看,关键字为httpdns</string>
|
||||
<string name="sni_request">IP直连方案</string>
|
||||
<string name="ok">濂界殑</string>
|
||||
<string name="response_title">璇锋眰缁撴灉</string>
|
||||
<string name="body_large_see_log">Body璇烽€氳繃鏃ュ織鏌ョ湅锛屽叧閿瓧涓篽ttpdns</string>
|
||||
<string name="sni_request">IP鐩磋繛鏂规</string>
|
||||
|
||||
<string name="tips">提示</string>
|
||||
<string name="network_not_connect">网络未连接,请检查网络</string>
|
||||
<string name="request_exception">请求异常: %s</string>
|
||||
<string name="tips">鎻愮ず</string>
|
||||
<string name="network_not_connect">缃戠粶鏈繛鎺ワ紝璇锋鏌ョ綉缁?/string>
|
||||
<string name="request_exception">璇锋眰寮傚父: %s</string>
|
||||
</resources>
|
||||
@@ -14,4 +14,5 @@ class ExampleUnitTest {
|
||||
fun addition_isCorrect() {
|
||||
assertEquals(4, 2 + 2)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user