diff --git a/.claude/settings.local.json b/.claude/settings.local.json
index 065620b..3fbf7a9 100644
--- a/.claude/settings.local.json
+++ b/.claude/settings.local.json
@@ -22,7 +22,14 @@
"Bash(where protoc:*)",
"Bash(/c/Users/robin/AppData/Local/Temp/protoc-install/bin/protoc.exe:*)",
"Bash(protoc-gen-go:*)",
- "Bash(cp:*)"
+ "Bash(cp:*)",
+ "Bash(ls:*)",
+ "Bash(choco list --local-only)",
+ "Bash(scoop list)",
+ "Bash(go install:*)",
+ "Bash(go env:*)",
+ "Bash(xargs:*)",
+ "Bash(sed:*)"
]
}
}
diff --git a/.gitignore b/.gitignore
index eb9f4ce..05fc878 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,3 +5,9 @@ deploy/fluent-bit/logs.db
deploy/fluent-bit/logs.db-shm
deploy/fluent-bit/logs.db-wal
deploy/fluent-bit/storage/
+pkg/
+.claude
+
+# Local large build artifacts
+EdgeAdmin/edge-admin.exe
+EdgeAPI/deploy/edge-node-linux-amd64-v1.4.9.zip
diff --git a/EdgeAPI/build/sql.sh b/EdgeAPI/build/sql.sh
index 347659a..76fd238 100644
--- a/EdgeAPI/build/sql.sh
+++ b/EdgeAPI/build/sql.sh
@@ -3,5 +3,10 @@
# generate 'internal/setup/sql.json' file
CWD="$(dirname "$0")"
+SQL_JSON="${CWD}/../internal/setup/sql.json"
-go run "${CWD}"/../cmd/sql-dump/main.go -dir="${CWD}"
\ No newline at end of file
+if [ -f "$SQL_JSON" ]; then
+ echo "sql.json already exists, skipping sql-dump (delete it manually to regenerate)"
+else
+ go run "${CWD}"/../cmd/sql-dump/main.go -dir="${CWD}"
+fi
\ No newline at end of file
diff --git a/EdgeAPI/cmd/sql-dump/main.go b/EdgeAPI/cmd/sql-dump/main.go
index d201b43..0b819d0 100644
--- a/EdgeAPI/cmd/sql-dump/main.go
+++ b/EdgeAPI/cmd/sql-dump/main.go
@@ -12,6 +12,8 @@ import (
)
func main() {
+ Tea.Env = "prod"
+
db, err := dbs.Default()
if err != nil {
fmt.Println("[ERROR]" + err.Error())
diff --git a/EdgeAPI/internal/const/const.go b/EdgeAPI/internal/const/const.go
index 14d8d93..c3b3d66 100644
--- a/EdgeAPI/internal/const/const.go
+++ b/EdgeAPI/internal/const/const.go
@@ -1,7 +1,7 @@
package teaconst
const (
- Version = "1.4.8" //1.3.9
+ Version = "1.4.9" //1.3.9
ProductName = "Edge API"
ProcessName = "edge-api"
@@ -17,6 +17,6 @@ const (
// 其他节点版本号,用来检测是否有需要升级的节点
- NodeVersion = "1.4.8" //1.3.8.2
+ NodeVersion = "1.4.9" //1.3.8.2
)
diff --git a/EdgeAPI/internal/const/const_plus.go b/EdgeAPI/internal/const/const_plus.go
index 56e5324..5b679bd 100644
--- a/EdgeAPI/internal/const/const_plus.go
+++ b/EdgeAPI/internal/const/const_plus.go
@@ -4,8 +4,8 @@
package teaconst
const (
- DNSNodeVersion = "1.4.8" //1.3.8.2
- UserNodeVersion = "1.4.8" //1.3.8.2
+ DNSNodeVersion = "1.4.9" //1.3.8.2
+ UserNodeVersion = "1.4.9" //1.3.8.2
ReportNodeVersion = "0.1.5"
DefaultMaxNodes int32 = 50
diff --git a/EdgeAPI/internal/db/models/httpdns_cluster_dao.go b/EdgeAPI/internal/db/models/httpdns_cluster_dao.go
index a184b36..9a5af68 100644
--- a/EdgeAPI/internal/db/models/httpdns_cluster_dao.go
+++ b/EdgeAPI/internal/db/models/httpdns_cluster_dao.go
@@ -34,7 +34,7 @@ func init() {
})
}
-func (this *HTTPDNSClusterDAO) CreateCluster(tx *dbs.Tx, name string, serviceDomain string, defaultTTL int32, fallbackTimeoutMs int32, installDir string, tlsPolicyJSON []byte, isOn bool, isDefault bool, autoRemoteStart bool, accessLogIsOn bool) (int64, error) {
+func (this *HTTPDNSClusterDAO) CreateCluster(tx *dbs.Tx, name string, serviceDomain string, defaultTTL int32, fallbackTimeoutMs int32, installDir string, tlsPolicyJSON []byte, isOn bool, isDefault bool, autoRemoteStart bool, accessLogIsOn bool, timeZone string) (int64, error) {
if isDefault {
err := this.Query(tx).
State(HTTPDNSClusterStateEnabled).
@@ -55,6 +55,7 @@ func (this *HTTPDNSClusterDAO) CreateCluster(tx *dbs.Tx, name string, serviceDom
op.IsDefault = isDefault
op.AutoRemoteStart = autoRemoteStart
op.AccessLogIsOn = accessLogIsOn
+ op.TimeZone = timeZone
op.CreatedAt = time.Now().Unix()
op.UpdatedAt = time.Now().Unix()
op.State = HTTPDNSClusterStateEnabled
@@ -68,7 +69,7 @@ func (this *HTTPDNSClusterDAO) CreateCluster(tx *dbs.Tx, name string, serviceDom
return types.Int64(op.Id), nil
}
-func (this *HTTPDNSClusterDAO) UpdateCluster(tx *dbs.Tx, clusterId int64, name string, serviceDomain string, defaultTTL int32, fallbackTimeoutMs int32, installDir string, tlsPolicyJSON []byte, isOn bool, isDefault bool, autoRemoteStart bool, accessLogIsOn bool) error {
+func (this *HTTPDNSClusterDAO) UpdateCluster(tx *dbs.Tx, clusterId int64, name string, serviceDomain string, defaultTTL int32, fallbackTimeoutMs int32, installDir string, tlsPolicyJSON []byte, isOn bool, isDefault bool, autoRemoteStart bool, accessLogIsOn bool, timeZone string) error {
if isDefault {
err := this.Query(tx).
State(HTTPDNSClusterStateEnabled).
@@ -91,6 +92,7 @@ func (this *HTTPDNSClusterDAO) UpdateCluster(tx *dbs.Tx, clusterId int64, name s
op.IsDefault = isDefault
op.AutoRemoteStart = autoRemoteStart
op.AccessLogIsOn = accessLogIsOn
+ op.TimeZone = timeZone
op.UpdatedAt = time.Now().Unix()
if len(tlsPolicyJSON) > 0 {
op.TLSPolicy = tlsPolicyJSON
diff --git a/EdgeAPI/internal/db/models/httpdns_cluster_model.go b/EdgeAPI/internal/db/models/httpdns_cluster_model.go
index 1fc8517..917c562 100644
--- a/EdgeAPI/internal/db/models/httpdns_cluster_model.go
+++ b/EdgeAPI/internal/db/models/httpdns_cluster_model.go
@@ -15,6 +15,7 @@ type HTTPDNSCluster struct {
TLSPolicy dbs.JSON `field:"tlsPolicy"` // TLS策略
AutoRemoteStart bool `field:"autoRemoteStart"` // 自动远程启动
AccessLogIsOn bool `field:"accessLogIsOn"` // 访问日志是否开启
+ TimeZone string `field:"timeZone"` // 时区
CreatedAt uint64 `field:"createdAt"` // 创建时间
UpdatedAt uint64 `field:"updatedAt"` // 修改时间
State uint8 `field:"state"` // 记录状态
@@ -32,6 +33,7 @@ type HTTPDNSClusterOperator struct {
TLSPolicy any // TLS策略
AutoRemoteStart any // 自动远程启动
AccessLogIsOn any // 访问日志是否开启
+ TimeZone any // 时区
CreatedAt any // 创建时间
UpdatedAt any // 修改时间
State any // 记录状态
diff --git a/EdgeAPI/internal/db/models/httpdns_node_dao.go b/EdgeAPI/internal/db/models/httpdns_node_dao.go
index a5bf0d3..140cc03 100644
--- a/EdgeAPI/internal/db/models/httpdns_node_dao.go
+++ b/EdgeAPI/internal/db/models/httpdns_node_dao.go
@@ -2,6 +2,7 @@ package models
import (
"encoding/json"
+ "github.com/TeaOSLab/EdgeAPI/internal/utils"
"github.com/TeaOSLab/EdgeCommon/pkg/nodeconfigs"
_ "github.com/go-sql-driver/mysql"
"github.com/iwind/TeaGo/Tea"
@@ -12,8 +13,8 @@ import (
)
const (
- HTTPDNSNodeStateEnabled = 1 // 已启用
- HTTPDNSNodeStateDisabled = 0 // 已禁用
+ HTTPDNSNodeStateEnabled = 1
+ HTTPDNSNodeStateDisabled = 0
)
type HTTPDNSNodeDAO dbs.DAO
@@ -37,7 +38,7 @@ func init() {
})
}
-// FindEnabledNodeIdWithUniqueId 根据唯一ID获取启用中的HTTPDNS节点ID
+// FindEnabledNodeIdWithUniqueId 鏍规嵁鍞竴ID鑾峰彇鍚敤涓殑HTTPDNS鑺傜偣ID
func (this *HTTPDNSNodeDAO) FindEnabledNodeIdWithUniqueId(tx *dbs.Tx, uniqueId string) (int64, error) {
return this.Query(tx).
Attr("uniqueId", uniqueId).
@@ -46,7 +47,7 @@ func (this *HTTPDNSNodeDAO) FindEnabledNodeIdWithUniqueId(tx *dbs.Tx, uniqueId s
FindInt64Col(0)
}
-// CreateNode 创建节点
+// CreateNode 鍒涘缓鑺傜偣
func (this *HTTPDNSNodeDAO) CreateNode(tx *dbs.Tx, clusterId int64, name string, installDir string, isOn bool) (int64, error) {
uniqueId := rands.HexString(32)
secret := rands.String(32)
@@ -75,7 +76,7 @@ func (this *HTTPDNSNodeDAO) CreateNode(tx *dbs.Tx, clusterId int64, name string,
return types.Int64(op.Id), nil
}
-// UpdateNode 更新节点
+// UpdateNode 鏇存柊鑺傜偣
func (this *HTTPDNSNodeDAO) UpdateNode(tx *dbs.Tx, nodeId int64, name string, installDir string, isOn bool) error {
var op = NewHTTPDNSNodeOperator()
op.Id = nodeId
@@ -86,7 +87,7 @@ func (this *HTTPDNSNodeDAO) UpdateNode(tx *dbs.Tx, nodeId int64, name string, in
return this.Save(tx, op)
}
-// DisableNode 禁用节点
+// DisableNode 绂佺敤鑺傜偣
func (this *HTTPDNSNodeDAO) DisableNode(tx *dbs.Tx, nodeId int64) error {
node, err := this.FindEnabledNode(tx, nodeId)
if err != nil {
@@ -112,7 +113,7 @@ func (this *HTTPDNSNodeDAO) DisableNode(tx *dbs.Tx, nodeId int64) error {
return err
}
-// FindEnabledNode 查找启用节点
+// FindEnabledNode 鏌ユ壘鍚敤鑺傜偣
func (this *HTTPDNSNodeDAO) FindEnabledNode(tx *dbs.Tx, nodeId int64) (*HTTPDNSNode, error) {
one, err := this.Query(tx).
Pk(nodeId).
@@ -124,7 +125,7 @@ func (this *HTTPDNSNodeDAO) FindEnabledNode(tx *dbs.Tx, nodeId int64) (*HTTPDNSN
return one.(*HTTPDNSNode), nil
}
-// FindNodeClusterId 查询节点所属集群ID
+// FindNodeClusterId 鏌ヨ鑺傜偣鎵€灞為泦缇D
func (this *HTTPDNSNodeDAO) FindNodeClusterId(tx *dbs.Tx, nodeId int64) (int64, error) {
return this.Query(tx).
Pk(nodeId).
@@ -133,7 +134,7 @@ func (this *HTTPDNSNodeDAO) FindNodeClusterId(tx *dbs.Tx, nodeId int64) (int64,
FindInt64Col(0)
}
-// ListEnabledNodes 列出节点
+// ListEnabledNodes 鍒楀嚭鑺傜偣
func (this *HTTPDNSNodeDAO) ListEnabledNodes(tx *dbs.Tx, clusterId int64) (result []*HTTPDNSNode, err error) {
query := this.Query(tx).
State(HTTPDNSNodeStateEnabled).
@@ -145,6 +146,20 @@ func (this *HTTPDNSNodeDAO) ListEnabledNodes(tx *dbs.Tx, clusterId int64) (resul
return
}
+// FindAllInactiveNodesWithClusterId 取得一个集群离线的HTTPDNS节点
+func (this *HTTPDNSNodeDAO) FindAllInactiveNodesWithClusterId(tx *dbs.Tx, clusterId int64) (result []*HTTPDNSNode, err error) {
+ _, err = this.Query(tx).
+ State(HTTPDNSNodeStateEnabled).
+ Attr("clusterId", clusterId).
+ Attr("isOn", true). // 只监控启用的节点
+ Attr("isInstalled", true). // 只监控已经安装的节点
+ Attr("isActive", false). // 当前处于离线状态
+ Result("id", "name").
+ Slice(&result).
+ FindAll()
+ return
+}
+
// UpdateNodeStatus 更新节点状态
func (this *HTTPDNSNodeDAO) UpdateNodeStatus(tx *dbs.Tx, nodeId int64, isUp bool, isInstalled bool, isActive bool, statusJSON []byte, installStatusJSON []byte) error {
var op = NewHTTPDNSNodeOperator()
@@ -261,7 +276,46 @@ func (this *HTTPDNSNodeDAO) FindNodeInstallStatus(tx *dbs.Tx, nodeId int64) (*No
return installStatus, nil
}
-// UpdateNodeIsInstalled 更新节点安装状态位
+// CountAllLowerVersionNodesWithClusterId 璁$畻鍗曚釜闆嗙兢涓墍鏈変綆浜庢煇涓増鏈殑鑺傜偣鏁伴噺
+func (this *HTTPDNSNodeDAO) CountAllLowerVersionNodesWithClusterId(tx *dbs.Tx, clusterId int64, os string, arch string, version string) (int64, error) {
+ return this.Query(tx).
+ State(HTTPDNSNodeStateEnabled).
+ Attr("clusterId", clusterId).
+ Attr("isOn", true).
+ Attr("isUp", true).
+ Attr("isActive", true).
+ Where("status IS NOT NULL").
+ Where("JSON_EXTRACT(status, '$.os')=:os").
+ Where("JSON_EXTRACT(status, '$.arch')=:arch").
+ Where("(JSON_EXTRACT(status, '$.buildVersionCode') IS NULL OR JSON_EXTRACT(status, '$.buildVersionCode')<:version)").
+ Param("os", os).
+ Param("arch", arch).
+ Param("version", utils.VersionToLong(version)).
+ Count()
+}
+
+// FindAllLowerVersionNodesWithClusterId 鏌ユ壘鍗曚釜闆嗙兢涓墍鏈変綆浜庢煇涓増鏈殑鑺傜偣
+func (this *HTTPDNSNodeDAO) FindAllLowerVersionNodesWithClusterId(tx *dbs.Tx, clusterId int64, os string, arch string, version string) (result []*HTTPDNSNode, err error) {
+ _, err = this.Query(tx).
+ State(HTTPDNSNodeStateEnabled).
+ Attr("clusterId", clusterId).
+ Attr("isOn", true).
+ Attr("isUp", true).
+ Attr("isActive", true).
+ Where("status IS NOT NULL").
+ Where("JSON_EXTRACT(status, '$.os')=:os").
+ Where("JSON_EXTRACT(status, '$.arch')=:arch").
+ Where("(JSON_EXTRACT(status, '$.buildVersionCode') IS NULL OR JSON_EXTRACT(status, '$.buildVersionCode')<:version)").
+ Param("os", os).
+ Param("arch", arch).
+ Param("version", utils.VersionToLong(version)).
+ DescPk().
+ Slice(&result).
+ FindAll()
+ return
+}
+
+// UpdateNodeIsInstalled 鏇存柊鑺傜偣瀹夎鐘舵€佷綅
func (this *HTTPDNSNodeDAO) UpdateNodeIsInstalled(tx *dbs.Tx, nodeId int64, isInstalled bool) error {
_, err := this.Query(tx).
Pk(nodeId).
diff --git a/EdgeAPI/internal/db/models/node_dao.go b/EdgeAPI/internal/db/models/node_dao.go
index e032c6b..8f58027 100644
--- a/EdgeAPI/internal/db/models/node_dao.go
+++ b/EdgeAPI/internal/db/models/node_dao.go
@@ -1521,6 +1521,8 @@ func (this *NodeDAO) CountAllLowerVersionNodesWithClusterId(tx *dbs.Tx, clusterI
return this.Query(tx).
State(NodeStateEnabled).
Attr("isOn", true).
+ Attr("isUp", true).
+ Attr("isActive", true).
Attr("clusterId", clusterId).
Where("status IS NOT NULL").
Where("JSON_EXTRACT(status, '$.os')=:os").
@@ -1536,6 +1538,9 @@ func (this *NodeDAO) CountAllLowerVersionNodesWithClusterId(tx *dbs.Tx, clusterI
func (this *NodeDAO) FindAllLowerVersionNodesWithClusterId(tx *dbs.Tx, clusterId int64, os string, arch string, version string) (result []*Node, err error) {
_, err = this.Query(tx).
State(NodeStateEnabled).
+ Attr("isOn", true).
+ Attr("isUp", true).
+ Attr("isActive", true).
Attr("clusterId", clusterId).
Where("status IS NOT NULL").
Where("JSON_EXTRACT(status, '$.os')=:os").
diff --git a/EdgeAPI/internal/db/models/ns_node_dao.go b/EdgeAPI/internal/db/models/ns_node_dao.go
index 278b8ad..bea3054 100644
--- a/EdgeAPI/internal/db/models/ns_node_dao.go
+++ b/EdgeAPI/internal/db/models/ns_node_dao.go
@@ -94,6 +94,8 @@ func (this *NSNodeDAO) CountAllLowerVersionNodesWithClusterId(tx *dbs.Tx, cluste
State(NSNodeStateEnabled).
Attr("clusterId", clusterId).
Attr("isOn", true).
+ Attr("isUp", true).
+ Attr("isActive", true).
Where("status IS NOT NULL").
Where("JSON_EXTRACT(status, '$.os')=:os").
Where("JSON_EXTRACT(status, '$.arch')=:arch").
@@ -104,6 +106,27 @@ func (this *NSNodeDAO) CountAllLowerVersionNodesWithClusterId(tx *dbs.Tx, cluste
Count()
}
+// FindAllLowerVersionNodesWithClusterId 查找单个集群中所有低于某个版本的节点
+func (this *NSNodeDAO) FindAllLowerVersionNodesWithClusterId(tx *dbs.Tx, clusterId int64, os string, arch string, version string) (result []*NSNode, err error) {
+ _, err = this.Query(tx).
+ State(NSNodeStateEnabled).
+ Attr("clusterId", clusterId).
+ Attr("isOn", true).
+ Attr("isUp", true).
+ Attr("isActive", true).
+ Where("status IS NOT NULL").
+ Where("JSON_EXTRACT(status, '$.os')=:os").
+ Where("JSON_EXTRACT(status, '$.arch')=:arch").
+ Where("(JSON_EXTRACT(status, '$.buildVersionCode') IS NULL OR JSON_EXTRACT(status, '$.buildVersionCode')<:version)").
+ Param("os", os).
+ Param("arch", arch).
+ Param("version", utils.VersionToLong(version)).
+ DescPk().
+ Slice(&result).
+ FindAll()
+ return
+}
+
// FindEnabledNodeIdWithUniqueId 根据唯一ID获取节点ID
func (this *NSNodeDAO) FindEnabledNodeIdWithUniqueId(tx *dbs.Tx, uniqueId string) (int64, error) {
return this.Query(tx).
diff --git a/EdgeAPI/internal/db/models/ns_node_dao_plus.go b/EdgeAPI/internal/db/models/ns_node_dao_plus.go
index d74fd32..4a34786 100644
--- a/EdgeAPI/internal/db/models/ns_node_dao_plus.go
+++ b/EdgeAPI/internal/db/models/ns_node_dao_plus.go
@@ -209,6 +209,8 @@ func (this *NSNodeDAO) CountAllLowerVersionNodesWithClusterId(tx *dbs.Tx, cluste
return this.Query(tx).
State(NSNodeStateEnabled).
Attr("isOn", true).
+ Attr("isUp", true).
+ Attr("isActive", true).
Attr("clusterId", clusterId).
Where("status IS NOT NULL").
Where("JSON_EXTRACT(status, '$.os')=:os").
@@ -412,6 +414,27 @@ func (this *NSNodeDAO) CountAllLowerVersionNodes(tx *dbs.Tx, version string) (in
Count()
}
+// FindAllLowerVersionNodesWithClusterId 查找单个集群中所有低于某个版本的节点
+func (this *NSNodeDAO) FindAllLowerVersionNodesWithClusterId(tx *dbs.Tx, clusterId int64, os string, arch string, version string) (result []*NSNode, err error) {
+ _, err = this.Query(tx).
+ State(NSNodeStateEnabled).
+ Attr("clusterId", clusterId).
+ Attr("isOn", true).
+ Attr("isUp", true).
+ Attr("isActive", true).
+ Where("status IS NOT NULL").
+ Where("JSON_EXTRACT(status, '$.os')=:os").
+ Where("JSON_EXTRACT(status, '$.arch')=:arch").
+ Where("(JSON_EXTRACT(status, '$.buildVersionCode') IS NULL OR JSON_EXTRACT(status, '$.buildVersionCode')<:version)").
+ Param("os", os).
+ Param("arch", arch).
+ Param("version", utils.VersionToLong(version)).
+ DescPk().
+ Slice(&result).
+ FindAll()
+ return
+}
+
// ComposeNodeConfig 组合节点配置
func (this *NSNodeDAO) ComposeNodeConfig(tx *dbs.Tx, nodeId int64) (*dnsconfigs.NSNodeConfig, error) {
if nodeId <= 0 {
diff --git a/EdgeAPI/internal/installers/queue_httpdns_node.go b/EdgeAPI/internal/installers/queue_httpdns_node.go
index 197eb0f..ba64cae 100644
--- a/EdgeAPI/internal/installers/queue_httpdns_node.go
+++ b/EdgeAPI/internal/installers/queue_httpdns_node.go
@@ -187,6 +187,100 @@ func (q *HTTPDNSNodeQueue) InstallNode(nodeId int64, installStatus *models.NodeI
return installer.Install(installDir, params, installStatus)
}
+// StartNode 启动HTTPDNS节点
+func (q *HTTPDNSNodeQueue) StartNode(nodeId int64) error {
+ node, err := models.SharedHTTPDNSNodeDAO.FindEnabledNode(nil, nodeId)
+ if err != nil {
+ return err
+ }
+ if node == nil {
+ return errors.New("can not find node, ID '" + numberutils.FormatInt64(nodeId) + "'")
+ }
+
+ // 登录信息
+ login, err := models.SharedNodeLoginDAO.FindEnabledNodeLoginWithNodeId(nil, nodeconfigs.NodeRoleHTTPDNS, nodeId)
+ if err != nil {
+ return err
+ }
+ if login == nil {
+ return newGrantError("can not find node login information")
+ }
+ loginParams, err := login.DecodeSSHParams()
+ if err != nil {
+ return newGrantError(err.Error())
+ }
+ if len(strings.TrimSpace(loginParams.Host)) == 0 {
+ return newGrantError("ssh host should not be empty")
+ }
+ if loginParams.Port <= 0 {
+ loginParams.Port = 22
+ }
+ if loginParams.GrantId <= 0 {
+ return newGrantError("can not find node grant")
+ }
+
+ grant, err := models.SharedNodeGrantDAO.FindEnabledNodeGrant(nil, loginParams.GrantId)
+ if err != nil {
+ return err
+ }
+ if grant == nil {
+ return newGrantError("can not find user grant with id '" + numberutils.FormatInt64(loginParams.GrantId) + "'")
+ }
+
+ installer := &HTTPDNSNodeInstaller{}
+ err = installer.Login(&Credentials{
+ Host: strings.TrimSpace(loginParams.Host),
+ Port: loginParams.Port,
+ Username: grant.Username,
+ Password: grant.Password,
+ PrivateKey: grant.PrivateKey,
+ Passphrase: grant.Passphrase,
+ Method: grant.Method,
+ Sudo: grant.Su == 1,
+ })
+ if err != nil {
+ return err
+ }
+ defer func() {
+ _ = installer.Close()
+ }()
+
+ installDir := strings.TrimSpace(node.InstallDir)
+ if len(installDir) == 0 {
+ cluster, err := models.SharedHTTPDNSClusterDAO.FindEnabledCluster(nil, int64(node.ClusterId))
+ if err != nil {
+ return err
+ }
+ if cluster == nil {
+ return errors.New("can not find cluster, ID '" + numberutils.FormatInt64(int64(node.ClusterId)) + "'")
+ }
+ installDir = strings.TrimSpace(cluster.InstallDir)
+ if len(installDir) == 0 {
+ installDir = installer.client.UserHome() + "/edge-httpdns"
+ }
+ }
+ _, appDir := resolveHTTPDNSInstallPaths(installDir)
+ exeFile := appDir + "/bin/edge-httpdns"
+
+ _, err = installer.client.Stat(exeFile)
+ if err != nil {
+ return errors.New("httpdns node is not installed correctly, can not find executable file: " + exeFile)
+ }
+
+ // 先尝试 systemd 拉起
+ _, _, _ = installer.client.Exec("/usr/bin/systemctl start edge-httpdns")
+
+ _, stderr, err := installer.client.Exec(exeFile + " start")
+ if err != nil {
+ return fmt.Errorf("start failed: %w", err)
+ }
+ if len(strings.TrimSpace(stderr)) > 0 {
+ return errors.New("start failed: " + strings.TrimSpace(stderr))
+ }
+
+ return nil
+}
+
func (q *HTTPDNSNodeQueue) resolveClusterTLSCertPair(cluster *models.HTTPDNSCluster) ([]byte, []byte, error) {
if cluster == nil {
return nil, nil, errors.New("cluster not found")
diff --git a/EdgeAPI/internal/installers/upgrade_queue.go b/EdgeAPI/internal/installers/upgrade_queue.go
new file mode 100644
index 0000000..ca08654
--- /dev/null
+++ b/EdgeAPI/internal/installers/upgrade_queue.go
@@ -0,0 +1,25 @@
+package installers
+
+// UpgradeQueue 升级队列,控制并发数
+type UpgradeQueue struct {
+ sem chan struct{}
+}
+
+// SharedUpgradeQueue 全局升级队列,最多5个并发
+var SharedUpgradeQueue = NewUpgradeQueue(5)
+
+// NewUpgradeQueue 创建升级队列
+func NewUpgradeQueue(maxConcurrent int) *UpgradeQueue {
+ return &UpgradeQueue{
+ sem: make(chan struct{}, maxConcurrent),
+ }
+}
+
+// SubmitNodeUpgrade 提交节点升级任务(异步执行,超过并发限制自动排队)
+func (q *UpgradeQueue) SubmitNodeUpgrade(nodeId int64, upgradeFunc func(int64) error) {
+ go func() {
+ q.sem <- struct{}{}
+ defer func() { <-q.sem }()
+ _ = upgradeFunc(nodeId)
+ }()
+}
diff --git a/EdgeAPI/internal/rpc/services/httpdns/converters.go b/EdgeAPI/internal/rpc/services/httpdns/converters.go
index d1e82fc..d8c70c9 100644
--- a/EdgeAPI/internal/rpc/services/httpdns/converters.go
+++ b/EdgeAPI/internal/rpc/services/httpdns/converters.go
@@ -2,9 +2,12 @@ package httpdns
import (
"encoding/json"
+ "log"
"github.com/TeaOSLab/EdgeAPI/internal/db/models"
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
+ "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/sslconfigs"
+ "github.com/iwind/TeaGo/dbs"
)
func toPBCluster(cluster *models.HTTPDNSCluster) *pb.HTTPDNSCluster {
@@ -25,9 +28,94 @@ func toPBCluster(cluster *models.HTTPDNSCluster) *pb.HTTPDNSCluster {
UpdatedAt: int64(cluster.UpdatedAt),
AutoRemoteStart: cluster.AutoRemoteStart,
AccessLogIsOn: cluster.AccessLogIsOn,
+ TimeZone: cluster.TimeZone,
}
}
+// toPBClusterWithResolvedCerts 转换集群并解析证书引用为实际 PEM 数据
+// 供节点调用的 RPC 使用,确保节点能拿到完整的证书内容
+func toPBClusterWithResolvedCerts(tx *dbs.Tx, cluster *models.HTTPDNSCluster) *pb.HTTPDNSCluster {
+ pbCluster := toPBCluster(cluster)
+ if pbCluster == nil {
+ return nil
+ }
+ resolved := resolveTLSPolicyCerts(tx, cluster.TLSPolicy)
+ if resolved != nil {
+ pbCluster.TlsPolicyJSON = resolved
+ }
+ return pbCluster
+}
+
+// resolveTLSPolicyCerts 将 tlsPolicyJSON 中的 certRefs 解析为带实际 PEM 数据的 certs
+func resolveTLSPolicyCerts(tx *dbs.Tx, tlsPolicyJSON []byte) []byte {
+ if len(tlsPolicyJSON) == 0 {
+ return nil
+ }
+
+ // 解析外层结构: {"listen": [...], "sslPolicy": {...}}
+ var tlsConfig map[string]json.RawMessage
+ if err := json.Unmarshal(tlsPolicyJSON, &tlsConfig); err != nil {
+ return nil
+ }
+
+ sslPolicyData, ok := tlsConfig["sslPolicy"]
+ if !ok || len(sslPolicyData) == 0 {
+ return nil
+ }
+
+ var sslPolicy sslconfigs.SSLPolicy
+ if err := json.Unmarshal(sslPolicyData, &sslPolicy); err != nil {
+ return nil
+ }
+
+ // 检查 certs 是否已经有实际数据
+ for _, cert := range sslPolicy.Certs {
+ if cert != nil && len(cert.CertData) > 128 && len(cert.KeyData) > 128 {
+ return nil // 已有完整 PEM 数据,无需处理
+ }
+ }
+
+ // 从 certRefs 解析实际证书数据
+ if len(sslPolicy.CertRefs) == 0 {
+ return nil
+ }
+
+ var resolvedCerts []*sslconfigs.SSLCertConfig
+ for _, ref := range sslPolicy.CertRefs {
+ if ref == nil || ref.CertId <= 0 {
+ continue
+ }
+ certConfig, err := models.SharedSSLCertDAO.ComposeCertConfig(tx, ref.CertId, false, nil, nil)
+ if err != nil {
+ log.Println("[HTTPDNS]resolve cert", ref.CertId, "failed:", err.Error())
+ continue
+ }
+ if certConfig == nil || len(certConfig.CertData) == 0 || len(certConfig.KeyData) == 0 {
+ continue
+ }
+ resolvedCerts = append(resolvedCerts, certConfig)
+ }
+
+ if len(resolvedCerts) == 0 {
+ return nil
+ }
+
+ // 把解析后的证书写回 sslPolicy.Certs
+ sslPolicy.Certs = resolvedCerts
+
+ newPolicyData, err := json.Marshal(&sslPolicy)
+ if err != nil {
+ return nil
+ }
+ tlsConfig["sslPolicy"] = newPolicyData
+
+ result, err := json.Marshal(tlsConfig)
+ if err != nil {
+ return nil
+ }
+ return result
+}
+
func toPBNode(node *models.HTTPDNSNode) *pb.HTTPDNSNode {
if node == nil {
return nil
diff --git a/EdgeAPI/internal/rpc/services/httpdns/service_httpdns_app.go b/EdgeAPI/internal/rpc/services/httpdns/service_httpdns_app.go
index 79a9b70..6b64a1f 100644
--- a/EdgeAPI/internal/rpc/services/httpdns/service_httpdns_app.go
+++ b/EdgeAPI/internal/rpc/services/httpdns/service_httpdns_app.go
@@ -67,10 +67,10 @@ func (this *HTTPDNSAppService) CreateHTTPDNSApp(ctx context.Context, req *pb.Cre
return errors.New("appId already exists")
}
- // 使用 clusterIdsJSON;若为空则优先从用户关联集群获取,再 fallback 到全局默认
+ // 使用 clusterIdsJSON;若为空则从用户关联集群获取
clusterIdsJSON := req.ClusterIdsJSON
if len(clusterIdsJSON) == 0 || string(clusterIdsJSON) == "[]" || string(clusterIdsJSON) == "null" {
- // 优先读取用户关联的 HTTPDNS 集群
+ // 读取用户关联的 HTTPDNS 集群
if req.UserId > 0 {
user, userErr := models.SharedUserDAO.FindEnabledUser(tx, req.UserId, nil)
if userErr != nil {
@@ -83,16 +83,11 @@ func (this *HTTPDNSAppService) CreateHTTPDNSApp(ctx context.Context, req *pb.Cre
}
}
}
- // fallback 到全局默认
- if len(clusterIdsJSON) == 0 || string(clusterIdsJSON) == "[]" || string(clusterIdsJSON) == "null" {
- defaultClusterIds, defaultErr := readHTTPDNSDefaultClusterIdList(tx)
- if defaultErr != nil {
- return defaultErr
- }
- if len(defaultClusterIds) > 0 {
- clusterIdsJSON, _ = json.Marshal(defaultClusterIds)
- }
- }
+ }
+
+ // 如果仍然没有集群,则不允许创建
+ if len(clusterIdsJSON) == 0 || string(clusterIdsJSON) == "[]" || string(clusterIdsJSON) == "null" {
+ return errors.New("用户尚未分配 HTTPDNS 集群,无法创建应用")
}
appDbId, err = models.SharedHTTPDNSAppDAO.CreateApp(tx, appName, appId, clusterIdsJSON, req.IsOn, req.UserId)
@@ -143,14 +138,6 @@ func readHTTPDNSDefaultClusterIdList(tx *dbs.Tx) ([]int64, error) {
}
}
- // fallback:默认主集群
- primaryClusterId, err := models.SharedHTTPDNSClusterDAO.FindDefaultPrimaryClusterId(tx)
- if err != nil {
- return nil, err
- }
- if primaryClusterId > 0 {
- return []int64{primaryClusterId}, nil
- }
return nil, nil
}
diff --git a/EdgeAPI/internal/rpc/services/httpdns/service_httpdns_cluster.go b/EdgeAPI/internal/rpc/services/httpdns/service_httpdns_cluster.go
index dcab940..94da75f 100644
--- a/EdgeAPI/internal/rpc/services/httpdns/service_httpdns_cluster.go
+++ b/EdgeAPI/internal/rpc/services/httpdns/service_httpdns_cluster.go
@@ -3,10 +3,14 @@ package httpdns
import (
"context"
"errors"
+ "fmt"
+ "strings"
"github.com/TeaOSLab/EdgeAPI/internal/db/models"
"github.com/TeaOSLab/EdgeAPI/internal/rpc/services"
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
"github.com/iwind/TeaGo/dbs"
+ "google.golang.org/grpc"
+ "google.golang.org/grpc/metadata"
)
// HTTPDNSClusterService HTTPDNS集群服务
@@ -25,7 +29,7 @@ func (this *HTTPDNSClusterService) CreateHTTPDNSCluster(ctx context.Context, req
}
var clusterId int64
err = this.RunTx(func(tx *dbs.Tx) error {
- clusterId, err = models.SharedHTTPDNSClusterDAO.CreateCluster(tx, req.Name, req.ServiceDomain, req.DefaultTTL, req.FallbackTimeoutMs, req.InstallDir, req.TlsPolicyJSON, req.IsOn, req.IsDefault, req.AutoRemoteStart, req.AccessLogIsOn)
+ clusterId, err = models.SharedHTTPDNSClusterDAO.CreateCluster(tx, req.Name, req.ServiceDomain, req.DefaultTTL, req.FallbackTimeoutMs, req.InstallDir, req.TlsPolicyJSON, req.IsOn, req.IsDefault, req.AutoRemoteStart, req.AccessLogIsOn, req.TimeZone)
if err != nil {
return err
}
@@ -42,13 +46,41 @@ func (this *HTTPDNSClusterService) UpdateHTTPDNSCluster(ctx context.Context, req
if err != nil {
return nil, err
}
+
+ // Compatibility fallback:
+ // If protobuf schemas between edge-admin and edge-api are inconsistent,
+ // these newly-added fields may be lost on the wire. Read gRPC metadata as fallback.
+ if md, ok := metadata.FromIncomingContext(ctx); ok {
+ if values := md.Get("x-httpdns-auto-remote-start"); len(values) > 0 {
+ raw := strings.ToLower(strings.TrimSpace(values[0]))
+ req.AutoRemoteStart = raw == "1" || raw == "true" || raw == "on" || raw == "yes" || raw == "enabled"
+ }
+ if values := md.Get("x-httpdns-access-log-is-on"); len(values) > 0 {
+ raw := strings.ToLower(strings.TrimSpace(values[0]))
+ req.AccessLogIsOn = raw == "1" || raw == "true" || raw == "on" || raw == "yes" || raw == "enabled"
+ }
+ if values := md.Get("x-httpdns-time-zone"); len(values) > 0 {
+ raw := strings.TrimSpace(values[0])
+ if len(raw) > 0 {
+ req.TimeZone = raw
+ }
+ }
+ }
+
err = this.RunTx(func(tx *dbs.Tx) error {
- err = models.SharedHTTPDNSClusterDAO.UpdateCluster(tx, req.ClusterId, req.Name, req.ServiceDomain, req.DefaultTTL, req.FallbackTimeoutMs, req.InstallDir, req.TlsPolicyJSON, req.IsOn, req.IsDefault, req.AutoRemoteStart, req.AccessLogIsOn)
+ // 先读取旧的 TLS 配置,用于判断是否真正发生了变化
+ var oldTLSJSON string
+ oldCluster, findErr := models.SharedHTTPDNSClusterDAO.FindEnabledCluster(tx, req.ClusterId)
+ if findErr == nil && oldCluster != nil {
+ oldTLSJSON = string(oldCluster.TLSPolicy)
+ }
+
+ err = models.SharedHTTPDNSClusterDAO.UpdateCluster(tx, req.ClusterId, req.Name, req.ServiceDomain, req.DefaultTTL, req.FallbackTimeoutMs, req.InstallDir, req.TlsPolicyJSON, req.IsOn, req.IsDefault, req.AutoRemoteStart, req.AccessLogIsOn, req.TimeZone)
if err != nil {
return err
}
taskType := models.HTTPDNSNodeTaskTypeConfigChanged
- if len(req.TlsPolicyJSON) > 0 {
+ if len(req.TlsPolicyJSON) > 0 && string(req.TlsPolicyJSON) != oldTLSJSON {
taskType = models.HTTPDNSNodeTaskTypeTLSChanged
}
return notifyHTTPDNSClusterTask(tx, req.ClusterId, taskType)
@@ -86,6 +118,13 @@ func (this *HTTPDNSClusterService) FindHTTPDNSCluster(ctx context.Context, req *
if err != nil {
return nil, err
}
+ if cluster != nil {
+ _ = grpc.SetHeader(ctx, metadata.Pairs(
+ "x-httpdns-auto-remote-start", fmt.Sprintf("%t", cluster.AutoRemoteStart),
+ "x-httpdns-access-log-is-on", fmt.Sprintf("%t", cluster.AccessLogIsOn),
+ "x-httpdns-time-zone", cluster.TimeZone,
+ ))
+ }
return &pb.FindHTTPDNSClusterResponse{Cluster: toPBCluster(cluster)}, nil
}
@@ -107,10 +146,12 @@ func (this *HTTPDNSClusterService) ListHTTPDNSClusters(ctx context.Context, req
func (this *HTTPDNSClusterService) FindAllHTTPDNSClusters(ctx context.Context, req *pb.FindAllHTTPDNSClustersRequest) (*pb.FindAllHTTPDNSClustersResponse, error) {
_, _, validateErr := this.ValidateAdminAndUser(ctx, true)
+ isNode := false
if validateErr != nil {
if _, nodeErr := this.ValidateHTTPDNSNode(ctx); nodeErr != nil {
return nil, validateErr
}
+ isNode = true
}
clusters, err := models.SharedHTTPDNSClusterDAO.FindAllEnabledClusters(this.NullTx())
if err != nil {
@@ -118,7 +159,12 @@ func (this *HTTPDNSClusterService) FindAllHTTPDNSClusters(ctx context.Context, r
}
var pbClusters []*pb.HTTPDNSCluster
for _, cluster := range clusters {
- pbClusters = append(pbClusters, toPBCluster(cluster))
+ if isNode {
+ // 节点调用时解析证书引用,嵌入实际 PEM 数据
+ pbClusters = append(pbClusters, toPBClusterWithResolvedCerts(this.NullTx(), cluster))
+ } else {
+ pbClusters = append(pbClusters, toPBCluster(cluster))
+ }
}
return &pb.FindAllHTTPDNSClustersResponse{Clusters: pbClusters}, nil
}
diff --git a/EdgeAPI/internal/rpc/services/httpdns/service_httpdns_node.go b/EdgeAPI/internal/rpc/services/httpdns/service_httpdns_node.go
index d1ea6a0..a12ce8e 100644
--- a/EdgeAPI/internal/rpc/services/httpdns/service_httpdns_node.go
+++ b/EdgeAPI/internal/rpc/services/httpdns/service_httpdns_node.go
@@ -11,6 +11,7 @@ import (
"github.com/TeaOSLab/EdgeAPI/internal/goman"
"github.com/TeaOSLab/EdgeAPI/internal/installers"
"github.com/TeaOSLab/EdgeAPI/internal/rpc/services"
+ "github.com/TeaOSLab/EdgeAPI/internal/setup"
rpcutils "github.com/TeaOSLab/EdgeAPI/internal/rpc/utils"
"github.com/TeaOSLab/EdgeCommon/pkg/nodeconfigs"
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
@@ -247,6 +248,12 @@ func (this *HTTPDNSNodeService) DownloadHTTPDNSNodeInstallationFile(ctx context.
return nil, err
}
+ // 检查自动升级开关
+ upgradeConfig, _ := setup.LoadUpgradeConfig()
+ if upgradeConfig != nil && !upgradeConfig.AutoUpgrade {
+ return &pb.DownloadHTTPDNSNodeInstallationFileResponse{}, nil
+ }
+
var file = installers.SharedDeployManager.FindHTTPDNSNodeFile(req.Os, req.Arch)
if file == nil {
return &pb.DownloadHTTPDNSNodeInstallationFileResponse{}, nil
@@ -274,6 +281,120 @@ func (this *HTTPDNSNodeService) DownloadHTTPDNSNodeInstallationFile(ctx context.
}, nil
}
+// CountAllUpgradeHTTPDNSNodesWithClusterId 计算需要升级的HTTPDNS节点数量
+func (this *HTTPDNSNodeService) CountAllUpgradeHTTPDNSNodesWithClusterId(ctx context.Context, req *pb.CountAllUpgradeHTTPDNSNodesWithClusterIdRequest) (*pb.RPCCountResponse, error) {
+ _, err := this.ValidateAdmin(ctx)
+ if err != nil {
+ return nil, err
+ }
+
+ var tx = this.NullTx()
+ deployFiles := installers.SharedDeployManager.LoadHTTPDNSNodeFiles()
+ total := int64(0)
+ for _, deployFile := range deployFiles {
+ count, err := models.SharedHTTPDNSNodeDAO.CountAllLowerVersionNodesWithClusterId(tx, req.ClusterId, deployFile.OS, deployFile.Arch, deployFile.Version)
+ if err != nil {
+ return nil, err
+ }
+ total += count
+ }
+ return this.SuccessCount(total)
+}
+
+// FindAllUpgradeHTTPDNSNodesWithClusterId 列出所有需要升级的HTTPDNS节点
+func (this *HTTPDNSNodeService) FindAllUpgradeHTTPDNSNodesWithClusterId(ctx context.Context, req *pb.FindAllUpgradeHTTPDNSNodesWithClusterIdRequest) (*pb.FindAllUpgradeHTTPDNSNodesWithClusterIdResponse, error) {
+ _, err := this.ValidateAdmin(ctx)
+ if err != nil {
+ return nil, err
+ }
+
+ var tx = this.NullTx()
+ deployFiles := installers.SharedDeployManager.LoadHTTPDNSNodeFiles()
+ var result []*pb.FindAllUpgradeHTTPDNSNodesWithClusterIdResponse_HTTPDNSNodeUpgrade
+ for _, deployFile := range deployFiles {
+ nodes, err := models.SharedHTTPDNSNodeDAO.FindAllLowerVersionNodesWithClusterId(tx, req.ClusterId, deployFile.OS, deployFile.Arch, deployFile.Version)
+ if err != nil {
+ return nil, err
+ }
+ for _, node := range nodes {
+ // 解析状态获取当前版本
+ var oldVersion string
+ if len(node.Status) > 0 {
+ var statusMap map[string]interface{}
+ if json.Unmarshal(node.Status, &statusMap) == nil {
+ if v, ok := statusMap["buildVersion"]; ok {
+ oldVersion, _ = v.(string)
+ }
+ }
+ }
+
+ pbNode := toPBNode(node)
+
+ // 认证信息
+ login, loginErr := models.SharedNodeLoginDAO.FindEnabledNodeLoginWithNodeId(tx, nodeconfigs.NodeRoleHTTPDNS, int64(node.Id))
+ if loginErr != nil {
+ return nil, loginErr
+ }
+ if login != nil && pbNode != nil {
+ pbNode.NodeLogin = &pb.NodeLogin{
+ Id: int64(login.Id),
+ Name: login.Name,
+ Type: login.Type,
+ Params: login.Params,
+ }
+ }
+
+ result = append(result, &pb.FindAllUpgradeHTTPDNSNodesWithClusterIdResponse_HTTPDNSNodeUpgrade{
+ Node: pbNode,
+ Os: deployFile.OS,
+ Arch: deployFile.Arch,
+ OldVersion: oldVersion,
+ NewVersion: deployFile.Version,
+ })
+ }
+ }
+ return &pb.FindAllUpgradeHTTPDNSNodesWithClusterIdResponse{Nodes: result}, nil
+}
+
+// UpgradeHTTPDNSNode 升级单个HTTPDNS节点
+func (this *HTTPDNSNodeService) UpgradeHTTPDNSNode(ctx context.Context, req *pb.UpgradeHTTPDNSNodeRequest) (*pb.RPCSuccess, error) {
+ _, err := this.ValidateAdmin(ctx)
+ if err != nil {
+ return nil, err
+ }
+
+ var tx = this.NullTx()
+
+ err = models.SharedHTTPDNSNodeDAO.UpdateNodeIsInstalled(tx, req.NodeId, false)
+ if err != nil {
+ return nil, err
+ }
+
+ // 重置安装状态
+ installStatus, err := models.SharedHTTPDNSNodeDAO.FindNodeInstallStatus(tx, req.NodeId)
+ if err != nil {
+ return nil, err
+ }
+ if installStatus == nil {
+ installStatus = &models.NodeInstallStatus{}
+ }
+ installStatus.IsOk = false
+ installStatus.IsFinished = false
+ err = models.SharedHTTPDNSNodeDAO.UpdateNodeInstallStatus(tx, req.NodeId, installStatus)
+ if err != nil {
+ return nil, err
+ }
+
+ goman.New(func() {
+ installErr := installers.SharedHTTPDNSNodeQueue().InstallNodeProcess(req.NodeId, true)
+ if installErr != nil {
+ logs.Println("[RPC][HTTPDNS]upgrade node failed:", installErr.Error())
+ }
+ })
+
+ return this.Success()
+}
+
func shouldTriggerHTTPDNSInstall(installStatusJSON []byte) bool {
if len(installStatusJSON) == 0 {
return false
diff --git a/EdgeAPI/internal/rpc/services/nameservers/service_ns_node.go b/EdgeAPI/internal/rpc/services/nameservers/service_ns_node.go
index 3cb4a33..ecbbeb6 100644
--- a/EdgeAPI/internal/rpc/services/nameservers/service_ns_node.go
+++ b/EdgeAPI/internal/rpc/services/nameservers/service_ns_node.go
@@ -12,6 +12,7 @@ import (
"github.com/TeaOSLab/EdgeAPI/internal/goman"
"github.com/TeaOSLab/EdgeAPI/internal/installers"
"github.com/TeaOSLab/EdgeAPI/internal/rpc/services"
+ "github.com/TeaOSLab/EdgeAPI/internal/setup"
rpcutils "github.com/TeaOSLab/EdgeAPI/internal/rpc/utils"
"github.com/TeaOSLab/EdgeCommon/pkg/configutils"
"github.com/TeaOSLab/EdgeCommon/pkg/nodeconfigs"
@@ -484,6 +485,12 @@ func (this *NSNodeService) DownloadNSNodeInstallationFile(ctx context.Context, r
return nil, err
}
+ // 检查自动升级开关
+ upgradeConfig, _ := setup.LoadUpgradeConfig()
+ if upgradeConfig != nil && !upgradeConfig.AutoUpgrade {
+ return &pb.DownloadNSNodeInstallationFileResponse{}, nil
+ }
+
var file = installers.SharedDeployManager.FindNSNodeFile(req.Os, req.Arch)
if file == nil {
return &pb.DownloadNSNodeInstallationFileResponse{}, nil
@@ -738,3 +745,109 @@ func (this *NSNodeService) UpdateNSNodeAPIConfig(ctx context.Context, req *pb.Up
return this.Success()
}
+
+// FindAllUpgradeNSNodesWithNSClusterId 列出所有需要升级的NS节点
+func (this *NSNodeService) FindAllUpgradeNSNodesWithNSClusterId(ctx context.Context, req *pb.FindAllUpgradeNSNodesWithNSClusterIdRequest) (*pb.FindAllUpgradeNSNodesWithNSClusterIdResponse, error) {
+ _, err := this.ValidateAdmin(ctx)
+ if err != nil {
+ return nil, err
+ }
+
+ var tx = this.NullTx()
+ deployFiles := installers.SharedDeployManager.LoadNSNodeFiles()
+ var result []*pb.FindAllUpgradeNSNodesWithNSClusterIdResponse_NSNodeUpgrade
+ for _, deployFile := range deployFiles {
+ nodes, err := models.SharedNSNodeDAO.FindAllLowerVersionNodesWithClusterId(tx, req.NsClusterId, deployFile.OS, deployFile.Arch, deployFile.Version)
+ if err != nil {
+ return nil, err
+ }
+ for _, node := range nodes {
+ // 解析状态获取当前版本
+ var oldVersion string
+ if len(node.Status) > 0 {
+ var statusMap map[string]interface{}
+ if json.Unmarshal(node.Status, &statusMap) == nil {
+ if v, ok := statusMap["buildVersion"]; ok {
+ oldVersion, _ = v.(string)
+ }
+ }
+ }
+
+ // 安装信息
+ installStatus, installErr := node.DecodeInstallStatus()
+ if installErr != nil {
+ return nil, installErr
+ }
+ pbInstallStatus := &pb.NodeInstallStatus{}
+ if installStatus != nil {
+ pbInstallStatus = &pb.NodeInstallStatus{
+ IsRunning: installStatus.IsRunning,
+ IsFinished: installStatus.IsFinished,
+ IsOk: installStatus.IsOk,
+ Error: installStatus.Error,
+ ErrorCode: installStatus.ErrorCode,
+ UpdatedAt: installStatus.UpdatedAt,
+ }
+ }
+
+ // 认证信息
+ login, loginErr := models.SharedNodeLoginDAO.FindEnabledNodeLoginWithNodeId(tx, nodeconfigs.NodeRoleDNS, int64(node.Id))
+ if loginErr != nil {
+ return nil, loginErr
+ }
+ var pbLogin *pb.NodeLogin
+ if login != nil {
+ pbLogin = &pb.NodeLogin{
+ Id: int64(login.Id),
+ Name: login.Name,
+ Type: login.Type,
+ Params: login.Params,
+ }
+ }
+
+ result = append(result, &pb.FindAllUpgradeNSNodesWithNSClusterIdResponse_NSNodeUpgrade{
+ NsNode: &pb.NSNode{
+ Id: int64(node.Id),
+ Name: node.Name,
+ IsOn: node.IsOn,
+ UniqueId: node.UniqueId,
+ IsInstalled: node.IsInstalled,
+ IsUp: node.IsUp,
+ IsActive: node.IsActive,
+ StatusJSON: node.Status,
+ InstallStatus: pbInstallStatus,
+ NodeLogin: pbLogin,
+ },
+ Os: deployFile.OS,
+ Arch: deployFile.Arch,
+ OldVersion: oldVersion,
+ NewVersion: deployFile.Version,
+ })
+ }
+ }
+ return &pb.FindAllUpgradeNSNodesWithNSClusterIdResponse{Nodes: result}, nil
+}
+
+// UpgradeNSNode 升级单个NS节点
+func (this *NSNodeService) UpgradeNSNode(ctx context.Context, req *pb.UpgradeNSNodeRequest) (*pb.RPCSuccess, error) {
+ _, err := this.ValidateAdmin(ctx)
+ if err != nil {
+ return nil, err
+ }
+
+ var tx = this.NullTx()
+
+ err = models.SharedNSNodeDAO.UpdateNodeIsInstalled(tx, req.NsNodeId, false)
+ if err != nil {
+ return nil, err
+ }
+
+ goman.New(func() {
+ installErr := installers.SharedNSNodeQueue().InstallNodeProcess(req.NsNodeId, true)
+ if installErr != nil {
+ logs.Println("[RPC]upgrade dns node:" + installErr.Error())
+ }
+ })
+
+ return this.Success()
+}
diff --git a/EdgeAPI/internal/rpc/services/service_node.go b/EdgeAPI/internal/rpc/services/service_node.go
index 723f76b..25b82b2 100644
--- a/EdgeAPI/internal/rpc/services/service_node.go
+++ b/EdgeAPI/internal/rpc/services/service_node.go
@@ -12,6 +12,7 @@ import (
"github.com/TeaOSLab/EdgeAPI/internal/installers"
"github.com/TeaOSLab/EdgeAPI/internal/remotelogs"
rpcutils "github.com/TeaOSLab/EdgeAPI/internal/rpc/utils"
+ "github.com/TeaOSLab/EdgeAPI/internal/setup"
"github.com/TeaOSLab/EdgeAPI/internal/utils"
"github.com/TeaOSLab/EdgeAPI/internal/utils/numberutils"
"github.com/TeaOSLab/EdgeCommon/pkg/configutils"
@@ -1716,6 +1717,12 @@ func (this *NodeService) DownloadNodeInstallationFile(ctx context.Context, req *
return nil, err
}
+ // 检查自动升级开关
+ upgradeConfig, _ := setup.LoadUpgradeConfig()
+ if upgradeConfig != nil && !upgradeConfig.AutoUpgrade {
+ return &pb.DownloadNodeInstallationFileResponse{}, nil
+ }
+
var file = installers.SharedDeployManager.FindNodeFile(req.Os, req.Arch)
if file == nil {
return &pb.DownloadNodeInstallationFileResponse{}, nil
diff --git a/EdgeAPI/internal/setup/sql_upgrade.go b/EdgeAPI/internal/setup/sql_upgrade.go
index 2b986b9..40b789f 100644
--- a/EdgeAPI/internal/setup/sql_upgrade.go
+++ b/EdgeAPI/internal/setup/sql_upgrade.go
@@ -113,6 +113,9 @@ var upgradeFuncs = []*upgradeVersion{
{
"1.4.8", upgradeV1_4_8,
},
+ {
+ "1.4.9", upgradeV1_4_9,
+ },
}
// UpgradeSQLData 升级SQL数据
@@ -1274,10 +1277,25 @@ func upgradeV1_4_8(db *dbs.DB) error {
return nil
}
+// 1.4.9
+func upgradeV1_4_9(db *dbs.DB) error {
+ _, err := db.Exec("ALTER TABLE `edgeHTTPDNSClusters` ALTER COLUMN `installDir` SET DEFAULT '/root/edge-httpdns'")
+ if err != nil {
+ return err
+ }
+
+ _, err = db.Exec("ALTER TABLE `edgeHTTPDNSNodes` ALTER COLUMN `installDir` SET DEFAULT '/root/edge-httpdns'")
+ if err != nil {
+ return err
+ }
+
+ return nil
+}
+
func createHTTPDNSTables(db *dbs.DB) error {
sqls := []string{
- "CREATE TABLE IF NOT EXISTS `edgeHTTPDNSClusters` (`id` bigint unsigned NOT NULL AUTO_INCREMENT,`name` varchar(255) DEFAULT NULL,`isOn` tinyint unsigned DEFAULT '1',`isDefault` tinyint unsigned DEFAULT '0',`serviceDomain` varchar(255) DEFAULT NULL,`defaultTTL` int unsigned DEFAULT '30',`fallbackTimeoutMs` int unsigned DEFAULT '300',`installDir` varchar(255) DEFAULT '/opt/edge-httpdns',`tlsPolicy` json DEFAULT NULL,`createdAt` bigint unsigned DEFAULT '0',`updatedAt` bigint unsigned DEFAULT '0',`state` tinyint unsigned DEFAULT '1',PRIMARY KEY (`id`),KEY `name` (`name`),KEY `isDefault` (`isDefault`),KEY `state` (`state`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='HTTPDNS集群配置表(默认TTL、回退超时、服务域名等)'",
- "CREATE TABLE IF NOT EXISTS `edgeHTTPDNSNodes` (`id` bigint unsigned NOT NULL AUTO_INCREMENT,`clusterId` bigint unsigned DEFAULT '0',`name` varchar(255) DEFAULT NULL,`isOn` tinyint unsigned DEFAULT '1',`isUp` tinyint unsigned DEFAULT '0',`isInstalled` tinyint unsigned DEFAULT '0',`isActive` tinyint unsigned DEFAULT '0',`uniqueId` varchar(64) DEFAULT NULL,`secret` varchar(64) DEFAULT NULL,`installDir` varchar(255) DEFAULT '/opt/edge-httpdns',`status` json DEFAULT NULL,`installStatus` json DEFAULT NULL,`createdAt` bigint unsigned DEFAULT '0',`updatedAt` bigint unsigned DEFAULT '0',`state` tinyint unsigned DEFAULT '1',PRIMARY KEY (`id`),UNIQUE KEY `uniqueId` (`uniqueId`),KEY `clusterId` (`clusterId`),KEY `state` (`state`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='HTTPDNS节点表(节点基础信息与运行状态)'",
+ "CREATE TABLE IF NOT EXISTS `edgeHTTPDNSClusters` (`id` bigint unsigned NOT NULL AUTO_INCREMENT,`name` varchar(255) DEFAULT NULL,`isOn` tinyint unsigned DEFAULT '1',`isDefault` tinyint unsigned DEFAULT '0',`serviceDomain` varchar(255) DEFAULT NULL,`defaultTTL` int unsigned DEFAULT '30',`fallbackTimeoutMs` int unsigned DEFAULT '300',`installDir` varchar(255) DEFAULT '/root/edge-httpdns',`tlsPolicy` json DEFAULT NULL,`autoRemoteStart` tinyint unsigned DEFAULT '0',`accessLogIsOn` tinyint unsigned DEFAULT '0',`timeZone` varchar(128) NOT NULL DEFAULT '',`createdAt` bigint unsigned DEFAULT '0',`updatedAt` bigint unsigned DEFAULT '0',`state` tinyint unsigned DEFAULT '1',PRIMARY KEY (`id`),KEY `name` (`name`),KEY `isDefault` (`isDefault`),KEY `state` (`state`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='HTTPDNS集群配置表(默认TTL、回退超时、服务域名等)'",
+ "CREATE TABLE IF NOT EXISTS `edgeHTTPDNSNodes` (`id` bigint unsigned NOT NULL AUTO_INCREMENT,`clusterId` bigint unsigned DEFAULT '0',`name` varchar(255) DEFAULT NULL,`isOn` tinyint unsigned DEFAULT '1',`isUp` tinyint unsigned DEFAULT '0',`isInstalled` tinyint unsigned DEFAULT '0',`isActive` tinyint unsigned DEFAULT '0',`uniqueId` varchar(64) DEFAULT NULL,`secret` varchar(64) DEFAULT NULL,`installDir` varchar(255) DEFAULT '/root/edge-httpdns',`status` json DEFAULT NULL,`installStatus` json DEFAULT NULL,`createdAt` bigint unsigned DEFAULT '0',`updatedAt` bigint unsigned DEFAULT '0',`state` tinyint unsigned DEFAULT '1',PRIMARY KEY (`id`),UNIQUE KEY `uniqueId` (`uniqueId`),KEY `clusterId` (`clusterId`),KEY `state` (`state`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='HTTPDNS节点表(节点基础信息与运行状态)'",
"CREATE TABLE IF NOT EXISTS `edgeHTTPDNSApps` (`id` bigint unsigned NOT NULL AUTO_INCREMENT,`name` varchar(255) DEFAULT NULL,`appId` varchar(64) DEFAULT NULL,`isOn` tinyint unsigned DEFAULT '1',`clusterIdsJSON` text DEFAULT NULL,`sniMode` varchar(64) DEFAULT 'fixed_hide',`userId` bigint unsigned DEFAULT '0',`createdAt` bigint unsigned DEFAULT '0',`updatedAt` bigint unsigned DEFAULT '0',`state` tinyint unsigned DEFAULT '1',PRIMARY KEY (`id`),UNIQUE KEY `appId` (`appId`),KEY `name` (`name`),KEY `userId` (`userId`),KEY `state` (`state`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='HTTPDNS应用表(应用与集群绑定关系)'",
"CREATE TABLE IF NOT EXISTS `edgeHTTPDNSAppSecrets` (`id` bigint unsigned NOT NULL AUTO_INCREMENT,`appId` bigint unsigned DEFAULT '0',`signEnabled` tinyint unsigned DEFAULT '0',`signSecret` varchar(255) DEFAULT NULL,`signUpdatedAt` bigint unsigned DEFAULT '0',`updatedAt` bigint unsigned DEFAULT '0',`state` tinyint unsigned DEFAULT '1',PRIMARY KEY (`id`),UNIQUE KEY `appId` (`appId`),KEY `state` (`state`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='HTTPDNS应用密钥表(请求验签开关与加签Secret)'",
"CREATE TABLE IF NOT EXISTS `edgeHTTPDNSDomains` (`id` bigint unsigned NOT NULL AUTO_INCREMENT,`appId` bigint unsigned DEFAULT '0',`domain` varchar(255) DEFAULT NULL,`isOn` tinyint unsigned DEFAULT '1',`createdAt` bigint unsigned DEFAULT '0',`updatedAt` bigint unsigned DEFAULT '0',`state` tinyint unsigned DEFAULT '1',PRIMARY KEY (`id`),UNIQUE KEY `appId_domain` (`appId`,`domain`),KEY `domain` (`domain`),KEY `state` (`state`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='HTTPDNS应用域名表(应用绑定的业务域名)'",
diff --git a/EdgeAPI/internal/setup/upgrade_config.go b/EdgeAPI/internal/setup/upgrade_config.go
new file mode 100644
index 0000000..99ef559
--- /dev/null
+++ b/EdgeAPI/internal/setup/upgrade_config.go
@@ -0,0 +1,45 @@
+package setup
+
+import (
+ "encoding/json"
+ "sync"
+ "time"
+
+ "github.com/TeaOSLab/EdgeAPI/internal/db/models"
+ "github.com/TeaOSLab/EdgeCommon/pkg/systemconfigs"
+)
+
+var (
+ sharedUpgradeConfig *systemconfigs.UpgradeConfig
+ sharedUpgradeConfigTime time.Time
+ sharedUpgradeConfigMu sync.Mutex
+)
+
+const upgradeConfigTTL = 5 * time.Minute
+
+// LoadUpgradeConfig 读取升级配置(带5分钟内存缓存)
+func LoadUpgradeConfig() (*systemconfigs.UpgradeConfig, error) {
+ sharedUpgradeConfigMu.Lock()
+ defer sharedUpgradeConfigMu.Unlock()
+
+ if sharedUpgradeConfig != nil && time.Since(sharedUpgradeConfigTime) < upgradeConfigTTL {
+ return sharedUpgradeConfig, nil
+ }
+
+ valueJSON, err := models.SharedSysSettingDAO.ReadSetting(nil, systemconfigs.SettingCodeUpgradeConfig)
+ if err != nil {
+ return nil, err
+ }
+
+ config := systemconfigs.NewUpgradeConfig()
+ if len(valueJSON) > 0 {
+ err = json.Unmarshal(valueJSON, config)
+ if err != nil {
+ return config, nil
+ }
+ }
+
+ sharedUpgradeConfig = config
+ sharedUpgradeConfigTime = time.Now()
+ return config, nil
+}
diff --git a/EdgeAPI/internal/tasks/httpdns_node_monitor_task.go b/EdgeAPI/internal/tasks/httpdns_node_monitor_task.go
new file mode 100644
index 0000000..949d91b
--- /dev/null
+++ b/EdgeAPI/internal/tasks/httpdns_node_monitor_task.go
@@ -0,0 +1,107 @@
+package tasks
+
+import (
+ "time"
+
+ "github.com/TeaOSLab/EdgeAPI/internal/db/models"
+ "github.com/TeaOSLab/EdgeAPI/internal/goman"
+ "github.com/TeaOSLab/EdgeAPI/internal/installers"
+ "github.com/TeaOSLab/EdgeCommon/pkg/nodeconfigs"
+ "github.com/iwind/TeaGo/dbs"
+)
+
+func init() {
+ dbs.OnReadyDone(func() {
+ goman.New(func() {
+ NewHTTPDNSNodeMonitorTask(1 * time.Minute).Start()
+ })
+ })
+}
+
+type httpdnsNodeStartingTry struct {
+ count int
+ timestamp int64
+}
+
+// HTTPDNSNodeMonitorTask monitors HTTPDNS node activity and optionally tries to start offline nodes.
+type HTTPDNSNodeMonitorTask struct {
+ BaseTask
+
+ ticker *time.Ticker
+
+ recoverMap map[int64]*httpdnsNodeStartingTry // nodeId => retry info
+}
+
+func NewHTTPDNSNodeMonitorTask(duration time.Duration) *HTTPDNSNodeMonitorTask {
+ return &HTTPDNSNodeMonitorTask{
+ ticker: time.NewTicker(duration),
+ recoverMap: map[int64]*httpdnsNodeStartingTry{},
+ }
+}
+
+func (t *HTTPDNSNodeMonitorTask) Start() {
+ for range t.ticker.C {
+ if err := t.Loop(); err != nil {
+ t.logErr("HTTPDNS_NODE_MONITOR", err.Error())
+ }
+ }
+}
+
+func (t *HTTPDNSNodeMonitorTask) Loop() error {
+ // only run on primary api node
+ if !t.IsPrimaryNode() {
+ return nil
+ }
+
+ clusters, err := models.SharedHTTPDNSClusterDAO.FindAllEnabledClusters(nil)
+ if err != nil {
+ return err
+ }
+
+ for _, cluster := range clusters {
+ if cluster == nil || !cluster.IsOn || !cluster.AutoRemoteStart {
+ continue
+ }
+ clusterID := int64(cluster.Id)
+ inactiveNodes, err := models.SharedHTTPDNSNodeDAO.FindAllInactiveNodesWithClusterId(nil, clusterID)
+ if err != nil {
+ return err
+ }
+ if len(inactiveNodes) == 0 {
+ continue
+ }
+
+ nodeQueue := installers.NewHTTPDNSNodeQueue()
+ for _, node := range inactiveNodes {
+ nodeID := int64(node.Id)
+ tryInfo, ok := t.recoverMap[nodeID]
+ if !ok {
+ tryInfo = &httpdnsNodeStartingTry{
+ count: 1,
+ timestamp: time.Now().Unix(),
+ }
+ t.recoverMap[nodeID] = tryInfo
+ } else {
+ if tryInfo.count >= 3 {
+ if tryInfo.timestamp+10*60 > time.Now().Unix() {
+ continue
+ }
+ tryInfo.timestamp = time.Now().Unix()
+ tryInfo.count = 0
+ }
+ tryInfo.count++
+ }
+
+ err = nodeQueue.StartNode(nodeID)
+ if err != nil {
+ if !installers.IsGrantError(err) {
+ _ = models.SharedNodeLogDAO.CreateLog(nil, nodeconfigs.NodeRoleHTTPDNS, nodeID, 0, 0, models.LevelError, "NODE", "start node from remote API failed: "+err.Error(), time.Now().Unix(), "", nil)
+ }
+ continue
+ }
+ _ = models.SharedNodeLogDAO.CreateLog(nil, nodeconfigs.NodeRoleHTTPDNS, nodeID, 0, 0, models.LevelSuccess, "NODE", "start node from remote API successfully", time.Now().Unix(), "", nil)
+ }
+ }
+
+ return nil
+}
diff --git a/EdgeAdmin/build/build.sh b/EdgeAdmin/build/build.sh
index 56c1c96..e3eb1ac 100644
--- a/EdgeAdmin/build/build.sh
+++ b/EdgeAdmin/build/build.sh
@@ -1,4 +1,28 @@
#!/usr/bin/env bash
+set -e
+
+function verify_components_bundle() {
+ local file_path="$1"
+ if [ ! -f "$file_path" ]; then
+ echo "[error] components.js not found: $file_path"
+ return 1
+ fi
+
+ local file_size
+ file_size=$(wc -c < "$file_path")
+ if [ "$file_size" -lt 100000 ]; then
+ echo "[error] components.js looks too small ($file_size bytes), generate likely failed"
+ return 1
+ fi
+
+ if ! grep -q 'Vue.component("csrf-token"' "$file_path"; then
+ echo "[error] components.js missing csrf-token component, generate likely failed"
+ return 1
+ fi
+
+ echo "verify components.js: ok ($file_size bytes)"
+ return 0
+}
function build() {
ROOT=$(dirname "$0")
@@ -58,7 +82,7 @@ function build() {
# generate files
echo "generating files ..."
- env CGO_ENABLED=0 go run -tags $TAG "$ROOT"/../cmd/edge-admin/main.go generate
+ env TEAROOT="$ROOT" CGO_ENABLED=0 go run -tags "$TAG" "$ROOT"/../cmd/edge-admin/main.go generate
if [ "$(which uglifyjs)" ]; then
echo "compress to component.js ..."
uglifyjs --compress --mangle -- "${JS_ROOT}"/components.src.js > "${JS_ROOT}"/components.js
@@ -69,6 +93,8 @@ function build() {
cp "${JS_ROOT}"/utils.js "${JS_ROOT}"/utils.min.js
fi
+ verify_components_bundle "${JS_ROOT}/components.js"
+
# create dir & copy files
echo "copying ..."
if [ ! -d "$DIST" ]; then
diff --git a/EdgeAdmin/build/generate.sh b/EdgeAdmin/build/generate.sh
index 248bfa2..99fbdba 100644
--- a/EdgeAdmin/build/generate.sh
+++ b/EdgeAdmin/build/generate.sh
@@ -1,22 +1,49 @@
#!/usr/bin/env bash
+set -e
-JS_ROOT=../web/public/js
+ROOT=$(cd "$(dirname "$0")" && pwd)
+JS_ROOT="$ROOT"/../web/public/js
+
+function verify_components_bundle() {
+ local file_path="$1"
+ if [ ! -f "$file_path" ]; then
+ echo "[error] components.js not found: $file_path"
+ return 1
+ fi
+
+ local file_size
+ file_size=$(wc -c < "$file_path")
+ if [ "$file_size" -lt 100000 ]; then
+ echo "[error] components.js looks too small ($file_size bytes), generate likely failed"
+ return 1
+ fi
+
+ if ! grep -q 'Vue.component("csrf-token"' "$file_path"; then
+ echo "[error] components.js missing csrf-token component, generate likely failed"
+ return 1
+ fi
+
+ echo "verify components.js: ok ($file_size bytes)"
+ return 0
+}
echo "generating component.src.js ..."
-env CGO_ENABLED=0 go run -tags=community ../cmd/edge-admin/main.go generate
+env TEAROOT="$ROOT" CGO_ENABLED=0 go run -tags=community "$ROOT"/../cmd/edge-admin/main.go generate
if [ "$(which uglifyjs)" ]; then
echo "compress to component.js ..."
- uglifyjs --compress --mangle -- ${JS_ROOT}/components.src.js > ${JS_ROOT}/components.js
+ uglifyjs --compress --mangle -- "${JS_ROOT}"/components.src.js > "${JS_ROOT}"/components.js
echo "compress to utils.min.js ..."
- uglifyjs --compress --mangle -- ${JS_ROOT}/utils.js > ${JS_ROOT}/utils.min.js
+ uglifyjs --compress --mangle -- "${JS_ROOT}"/utils.js > "${JS_ROOT}"/utils.min.js
else
echo "copy to component.js ..."
- cp ${JS_ROOT}/components.src.js ${JS_ROOT}/components.js
+ cp "${JS_ROOT}"/components.src.js "${JS_ROOT}"/components.js
echo "copy to utils.min.js ..."
- cp ${JS_ROOT}/utils.js ${JS_ROOT}/utils.min.js
+ cp "${JS_ROOT}"/utils.js "${JS_ROOT}"/utils.min.js
fi
-echo "ok"
\ No newline at end of file
+verify_components_bundle "${JS_ROOT}/components.js"
+
+echo "ok"
diff --git a/EdgeAdmin/cmd/edge-admin/main.go b/EdgeAdmin/cmd/edge-admin/main.go
index 2e4eaa2..52fd816 100644
--- a/EdgeAdmin/cmd/edge-admin/main.go
+++ b/EdgeAdmin/cmd/edge-admin/main.go
@@ -22,6 +22,7 @@ import (
"log"
"os"
"os/exec"
+ "path/filepath"
"time"
)
@@ -112,10 +113,12 @@ func main() {
}
})
app.On("generate", func() {
+ prepareGenerateRoot()
+
err := gen.Generate()
if err != nil {
fmt.Println("generate failed: " + err.Error())
- return
+ os.Exit(1)
}
})
app.On("dev", func() {
@@ -214,3 +217,32 @@ func main() {
adminNode.Run()
})
}
+
+func prepareGenerateRoot() {
+ wd, err := os.Getwd()
+ if err != nil {
+ return
+ }
+
+ candidates := []string{
+ wd,
+ filepath.Clean(filepath.Join(wd, "..")),
+ }
+
+ for _, root := range candidates {
+ componentsDir := filepath.Join(root, "web", "public", "js", "components")
+ stat, statErr := os.Stat(componentsDir)
+ if statErr != nil || !stat.IsDir() {
+ continue
+ }
+
+ // In testing mode, generator reads from Tea.Root + "/../web/...",
+ // so keep Root under build dir to make relative path stable.
+ buildRoot := filepath.Join(root, "build")
+ Tea.UpdateRoot(buildRoot)
+ Tea.SetPublicDir(filepath.Join(root, "web", "public"))
+ Tea.SetViewsDir(filepath.Join(root, "web", "views"))
+ Tea.SetTmpDir(filepath.Join(root, "web", "tmp"))
+ return
+ }
+}
diff --git a/EdgeAdmin/internal/configloaders/upgrade_config.go b/EdgeAdmin/internal/configloaders/upgrade_config.go
new file mode 100644
index 0000000..cb299d1
--- /dev/null
+++ b/EdgeAdmin/internal/configloaders/upgrade_config.go
@@ -0,0 +1,69 @@
+package configloaders
+
+import (
+ "encoding/json"
+
+ "github.com/TeaOSLab/EdgeAdmin/internal/rpc"
+ "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
+ "github.com/TeaOSLab/EdgeCommon/pkg/systemconfigs"
+)
+
+const UpgradeSettingName = "upgradeConfig"
+
+var sharedUpgradeConfig *systemconfigs.UpgradeConfig
+
+func LoadUpgradeConfig() (*systemconfigs.UpgradeConfig, error) {
+ locker.Lock()
+ defer locker.Unlock()
+
+ if sharedUpgradeConfig != nil {
+ return sharedUpgradeConfig, nil
+ }
+
+ rpcClient, err := rpc.SharedRPC()
+ if err != nil {
+ return nil, err
+ }
+ resp, err := rpcClient.SysSettingRPC().ReadSysSetting(rpcClient.Context(0), &pb.ReadSysSettingRequest{
+ Code: UpgradeSettingName,
+ })
+ if err != nil {
+ return nil, err
+ }
+ if len(resp.ValueJSON) == 0 {
+ sharedUpgradeConfig = systemconfigs.NewUpgradeConfig()
+ return sharedUpgradeConfig, nil
+ }
+
+ config := systemconfigs.NewUpgradeConfig()
+ err = json.Unmarshal(resp.ValueJSON, config)
+ if err != nil {
+ sharedUpgradeConfig = systemconfigs.NewUpgradeConfig()
+ return sharedUpgradeConfig, nil
+ }
+ sharedUpgradeConfig = config
+ return sharedUpgradeConfig, nil
+}
+
+func UpdateUpgradeConfig(config *systemconfigs.UpgradeConfig) error {
+ locker.Lock()
+ defer locker.Unlock()
+
+ rpcClient, err := rpc.SharedRPC()
+ if err != nil {
+ return err
+ }
+ valueJSON, err := json.Marshal(config)
+ if err != nil {
+ return err
+ }
+ _, err = rpcClient.SysSettingRPC().UpdateSysSetting(rpcClient.Context(0), &pb.UpdateSysSettingRequest{
+ Code: UpgradeSettingName,
+ ValueJSON: valueJSON,
+ })
+ if err != nil {
+ return err
+ }
+ sharedUpgradeConfig = config
+ return nil
+}
diff --git a/EdgeAdmin/internal/const/const.go b/EdgeAdmin/internal/const/const.go
index 2d7b7e8..55a74ae 100644
--- a/EdgeAdmin/internal/const/const.go
+++ b/EdgeAdmin/internal/const/const.go
@@ -1,9 +1,9 @@
package teaconst
const (
- Version = "1.4.8" //1.3.9
+ Version = "1.4.9" //1.3.9
- APINodeVersion = "1.4.8" //1.3.9
+ APINodeVersion = "1.4.9" //1.3.9
ProductName = "Edge Admin"
ProcessName = "edge-admin"
diff --git a/EdgeAdmin/internal/web/actions/default/httpdns/apps/sdk_check.go b/EdgeAdmin/internal/web/actions/default/httpdns/apps/sdk_check.go
index a40db86..a8f2a3c 100644
--- a/EdgeAdmin/internal/web/actions/default/httpdns/apps/sdk_check.go
+++ b/EdgeAdmin/internal/web/actions/default/httpdns/apps/sdk_check.go
@@ -28,19 +28,20 @@ func (this *SdkCheckAction) RunGet(params struct {
return
}
+ version := strings.TrimSpace(params.Version)
t := strings.ToLower(strings.TrimSpace(params.Type))
if t == "doc" {
- docPath := findUploadedSDKDocPath(platform, params.Version)
+ docPath := findUploadedSDKDocPath(platform, version)
if len(docPath) == 0 {
this.Data["exists"] = false
- this.Data["message"] = "Documentation is unavailable, please upload first"
+ this.Data["message"] = "当前平台/版本尚未上传集成文档"
this.Success()
return
}
downloadURL := "/httpdns/apps/sdk/doc?platform=" + url.QueryEscape(platform)
- if len(strings.TrimSpace(params.Version)) > 0 {
- downloadURL += "&version=" + url.QueryEscape(strings.TrimSpace(params.Version))
+ if len(version) > 0 {
+ downloadURL += "&version=" + url.QueryEscape(version)
}
this.Data["exists"] = true
this.Data["url"] = downloadURL
@@ -48,17 +49,17 @@ func (this *SdkCheckAction) RunGet(params struct {
return
}
- archivePath := findSDKArchivePath(filename, params.Version)
+ archivePath := findSDKArchivePath(filename, version)
if len(archivePath) == 0 {
this.Data["exists"] = false
- this.Data["message"] = "SDK package is unavailable, please upload first"
+ this.Data["message"] = "当前平台/版本尚未上传 SDK 安装包"
this.Success()
return
}
downloadURL := "/httpdns/apps/sdk/download?platform=" + url.QueryEscape(platform)
- if len(strings.TrimSpace(params.Version)) > 0 {
- downloadURL += "&version=" + url.QueryEscape(strings.TrimSpace(params.Version))
+ if len(version) > 0 {
+ downloadURL += "&version=" + url.QueryEscape(version)
}
downloadURL += "&raw=1"
this.Data["exists"] = true
diff --git a/EdgeAdmin/internal/web/actions/default/httpdns/apps/sdk_doc.go b/EdgeAdmin/internal/web/actions/default/httpdns/apps/sdk_doc.go
index 95ea910..d02cd0c 100644
--- a/EdgeAdmin/internal/web/actions/default/httpdns/apps/sdk_doc.go
+++ b/EdgeAdmin/internal/web/actions/default/httpdns/apps/sdk_doc.go
@@ -3,7 +3,6 @@ package apps
import (
"os"
"path/filepath"
- "strings"
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
)
@@ -20,7 +19,7 @@ func (this *SdkDocAction) RunGet(params struct {
Platform string
Version string
}) {
- platform, _, readmeRelativePath, _, err := resolveSDKPlatform(params.Platform)
+ platform, _, _, _, err := resolveSDKPlatform(params.Platform)
if err != nil {
this.Data["exists"] = false
this.Data["message"] = err.Error()
@@ -28,35 +27,25 @@ func (this *SdkDocAction) RunGet(params struct {
return
}
- var data []byte
- uploadedDocPath := findUploadedSDKDocPath(platform, params.Version)
- if len(uploadedDocPath) > 0 {
- data, err = os.ReadFile(uploadedDocPath)
- }
-
- sdkRoot, sdkRootErr := findSDKRoot()
- if len(data) == 0 && sdkRootErr == nil {
- readmePath := filepath.Join(sdkRoot, readmeRelativePath)
- data, err = os.ReadFile(readmePath)
- }
-
- if len(data) == 0 {
- localDocPath := findLocalSDKDocPath(platform)
- if len(localDocPath) > 0 {
- data, err = os.ReadFile(localDocPath)
- }
- }
-
- if len(data) == 0 || err != nil {
+ docPath := findUploadedSDKDocPath(platform, params.Version)
+ if len(docPath) == 0 {
this.Data["exists"] = false
- this.Data["message"] = "SDK documentation is not found on server, please upload first"
+ this.Data["message"] = "当前平台/版本尚未上传集成文档"
this.Success()
return
}
- downloadName := filepath.Base(uploadedDocPath)
+ data, err := os.ReadFile(docPath)
+ if err != nil || len(data) == 0 {
+ this.Data["exists"] = false
+ this.Data["message"] = "读取集成文档失败"
+ this.Success()
+ return
+ }
+
+ downloadName := filepath.Base(docPath)
if len(downloadName) == 0 || downloadName == "." || downloadName == string(filepath.Separator) {
- downloadName = "httpdns-sdk-" + strings.ToLower(platform) + ".md"
+ downloadName = "sdk-doc.md"
}
this.AddHeader("Content-Type", "text/markdown; charset=utf-8")
diff --git a/EdgeAdmin/internal/web/actions/default/httpdns/apps/sdk_download.go b/EdgeAdmin/internal/web/actions/default/httpdns/apps/sdk_download.go
index 45a7066..09e41d2 100644
--- a/EdgeAdmin/internal/web/actions/default/httpdns/apps/sdk_download.go
+++ b/EdgeAdmin/internal/web/actions/default/httpdns/apps/sdk_download.go
@@ -32,7 +32,7 @@ func (this *SdkDownloadAction) RunGet(params struct {
archivePath := findSDKArchivePath(filename, params.Version)
if len(archivePath) == 0 {
this.Data["exists"] = false
- this.Data["message"] = "SDK archive not found on server, please upload first: " + filename
+ this.Data["message"] = "当前平台/版本尚未上传 SDK 安装包"
this.Success()
return
}
@@ -40,7 +40,7 @@ func (this *SdkDownloadAction) RunGet(params struct {
fp, err := os.Open(archivePath)
if err != nil {
this.Data["exists"] = false
- this.Data["message"] = "failed to open SDK archive: " + err.Error()
+ this.Data["message"] = "打开 SDK 安装包失败: " + err.Error()
this.Success()
return
}
diff --git a/EdgeAdmin/internal/web/actions/default/httpdns/apps/sdk_helpers.go b/EdgeAdmin/internal/web/actions/default/httpdns/apps/sdk_helpers.go
index e16d05f..236d5c9 100644
--- a/EdgeAdmin/internal/web/actions/default/httpdns/apps/sdk_helpers.go
+++ b/EdgeAdmin/internal/web/actions/default/httpdns/apps/sdk_helpers.go
@@ -1,16 +1,183 @@
package apps
import (
+ "encoding/json"
"errors"
"os"
"path/filepath"
- "sort"
"strings"
"time"
"github.com/iwind/TeaGo/Tea"
)
+type sdkUploadMeta struct {
+ Platform string `json:"platform"`
+ Version string `json:"version"`
+ FileType string `json:"fileType"` // sdk | doc
+ Filename string `json:"filename"`
+ UpdatedAt int64 `json:"updatedAt"`
+}
+
+type sdkUploadMetaRecord struct {
+ Meta sdkUploadMeta
+ Dir string
+ FilePath string
+}
+
+func sdkUploadMetaFilename(platform string, version string, fileType string) string {
+ platform = strings.ToLower(strings.TrimSpace(platform))
+ version = strings.TrimSpace(version)
+ fileType = strings.ToLower(strings.TrimSpace(fileType))
+ return ".httpdns-sdk-meta-" + platform + "-v" + version + "-" + fileType + ".json"
+}
+
+func isSDKUploadMetaFile(name string) bool {
+ name = strings.ToLower(strings.TrimSpace(name))
+ return strings.HasPrefix(name, ".httpdns-sdk-meta-") && strings.HasSuffix(name, ".json")
+}
+
+func parseSDKPlatformFromDownloadFilename(downloadFilename string) string {
+ name := strings.ToLower(strings.TrimSpace(downloadFilename))
+ if !strings.HasPrefix(name, "httpdns-sdk-") || !strings.HasSuffix(name, ".zip") {
+ return ""
+ }
+
+ platform := strings.TrimSuffix(strings.TrimPrefix(name, "httpdns-sdk-"), ".zip")
+ switch platform {
+ case "android", "ios", "flutter":
+ return platform
+ default:
+ return ""
+ }
+}
+
+func listSDKUploadMetaRecords() []sdkUploadMetaRecord {
+ type wrapped struct {
+ record sdkUploadMetaRecord
+ modTime time.Time
+ }
+
+ byKey := map[string]wrapped{}
+ for _, dir := range sdkUploadSearchDirs() {
+ entries, err := os.ReadDir(dir)
+ if err != nil {
+ continue
+ }
+
+ for _, entry := range entries {
+ if entry.IsDir() {
+ continue
+ }
+
+ name := entry.Name()
+ if !isSDKUploadMetaFile(name) {
+ continue
+ }
+
+ metaPath := filepath.Join(dir, name)
+ data, err := os.ReadFile(metaPath)
+ if err != nil || len(data) == 0 {
+ continue
+ }
+
+ var meta sdkUploadMeta
+ if err = json.Unmarshal(data, &meta); err != nil {
+ continue
+ }
+
+ meta.Platform = strings.ToLower(strings.TrimSpace(meta.Platform))
+ meta.Version = strings.TrimSpace(meta.Version)
+ meta.FileType = strings.ToLower(strings.TrimSpace(meta.FileType))
+ meta.Filename = filepath.Base(strings.TrimSpace(meta.Filename))
+ if len(meta.Platform) == 0 || len(meta.Version) == 0 || len(meta.Filename) == 0 {
+ continue
+ }
+ if meta.FileType != "sdk" && meta.FileType != "doc" {
+ continue
+ }
+ if strings.Contains(meta.Filename, "..") || strings.Contains(meta.Filename, "/") || strings.Contains(meta.Filename, "\\") {
+ continue
+ }
+
+ filePath := filepath.Join(dir, meta.Filename)
+ fileStat, err := os.Stat(filePath)
+ if err != nil || fileStat.IsDir() || fileStat.Size() <= 0 {
+ continue
+ }
+
+ metaStat, err := os.Stat(metaPath)
+ if err != nil {
+ continue
+ }
+ if meta.UpdatedAt <= 0 {
+ meta.UpdatedAt = metaStat.ModTime().Unix()
+ }
+
+ key := meta.Platform + "|" + meta.Version + "|" + meta.FileType
+ current := wrapped{
+ record: sdkUploadMetaRecord{
+ Meta: meta,
+ Dir: dir,
+ FilePath: filePath,
+ },
+ modTime: metaStat.ModTime(),
+ }
+ old, ok := byKey[key]
+ if !ok ||
+ current.record.Meta.UpdatedAt > old.record.Meta.UpdatedAt ||
+ (current.record.Meta.UpdatedAt == old.record.Meta.UpdatedAt && current.modTime.After(old.modTime)) ||
+ (current.record.Meta.UpdatedAt == old.record.Meta.UpdatedAt && current.modTime.Equal(old.modTime) && current.record.FilePath > old.record.FilePath) {
+ byKey[key] = current
+ }
+ }
+ }
+
+ result := make([]sdkUploadMetaRecord, 0, len(byKey))
+ for _, item := range byKey {
+ result = append(result, item.record)
+ }
+ return result
+}
+
+func findSDKUploadFileByMeta(platform string, version string, fileType string) string {
+ platform = strings.ToLower(strings.TrimSpace(platform))
+ version = strings.TrimSpace(version)
+ fileType = strings.ToLower(strings.TrimSpace(fileType))
+ if len(platform) == 0 || len(version) == 0 {
+ return ""
+ }
+
+ for _, record := range listSDKUploadMetaRecords() {
+ if record.Meta.Platform == platform && record.Meta.Version == version && record.Meta.FileType == fileType {
+ return record.FilePath
+ }
+ }
+ return ""
+}
+
+func findNewestSDKUploadFileByMeta(platform string, fileType string) string {
+ platform = strings.ToLower(strings.TrimSpace(platform))
+ fileType = strings.ToLower(strings.TrimSpace(fileType))
+ if len(platform) == 0 {
+ return ""
+ }
+
+ var foundPath string
+ var foundUpdatedAt int64
+ for _, record := range listSDKUploadMetaRecords() {
+ if record.Meta.Platform != platform || record.Meta.FileType != fileType {
+ continue
+ }
+
+ if len(foundPath) == 0 || record.Meta.UpdatedAt > foundUpdatedAt || (record.Meta.UpdatedAt == foundUpdatedAt && record.FilePath > foundPath) {
+ foundPath = record.FilePath
+ foundUpdatedAt = record.Meta.UpdatedAt
+ }
+ }
+ return foundPath
+}
+
func sdkUploadDir() string {
dirs := sdkUploadDirs()
if len(dirs) > 0 {
@@ -27,6 +194,7 @@ func sdkUploadDirs() []string {
filepath.Clean(Tea.Root + "/../edge-user/data/httpdns/sdk"),
filepath.Clean(Tea.Root + "/../../data/httpdns/sdk"),
}
+
results := make([]string, 0, len(candidates))
seen := map[string]bool{}
for _, dir := range candidates {
@@ -54,67 +222,6 @@ func sdkUploadSearchDirs() []string {
return results
}
-func findFirstExistingDir(paths []string) string {
- for _, path := range paths {
- stat, err := os.Stat(path)
- if err == nil && stat.IsDir() {
- return path
- }
- }
- return ""
-}
-
-func findFirstExistingFile(paths []string) string {
- for _, path := range paths {
- stat, err := os.Stat(path)
- if err == nil && !stat.IsDir() && stat.Size() > 0 {
- return path
- }
- }
- return ""
-}
-
-func findNewestExistingFile(paths []string) string {
- type fileInfo struct {
- path string
- modTime time.Time
- }
- result := fileInfo{}
- for _, path := range paths {
- stat, err := os.Stat(path)
- if err != nil || stat.IsDir() {
- continue
- }
- if stat.Size() <= 0 {
- continue
- }
- if len(result.path) == 0 || stat.ModTime().After(result.modTime) || (stat.ModTime().Equal(result.modTime) && path > result.path) {
- result.path = path
- result.modTime = stat.ModTime()
- }
- }
- return result.path
-}
-
-func findSDKRoot() (string, error) {
- candidates := []string{
- filepath.Clean(Tea.Root + "/EdgeHttpDNS/sdk"),
- filepath.Clean(Tea.Root + "/edge-httpdns/sdk"),
- filepath.Clean(Tea.Root + "/edge-httpdns/edge-httpdns/sdk"),
- filepath.Clean(Tea.Root + "/../EdgeHttpDNS/sdk"),
- filepath.Clean(Tea.Root + "/../../EdgeHttpDNS/sdk"),
- filepath.Clean(Tea.Root + "/../edge-httpdns/sdk"),
- filepath.Clean(Tea.Root + "/../../edge-httpdns/sdk"),
- }
-
- dir := findFirstExistingDir(candidates)
- if len(dir) > 0 {
- return dir, nil
- }
-
- return "", errors.New("SDK files are not found on current server")
-}
-
func resolveSDKPlatform(platform string) (key string, relativeDir string, readmeRelativePath string, downloadFilename string, err error) {
switch strings.ToLower(strings.TrimSpace(platform)) {
case "android":
@@ -122,52 +229,23 @@ func resolveSDKPlatform(platform string) (key string, relativeDir string, readme
case "ios":
return "ios", "ios", "ios/README.md", "httpdns-sdk-ios.zip", nil
case "flutter":
- return "flutter", "flutter/aliyun_httpdns", "flutter/aliyun_httpdns/README.md", "httpdns-sdk-flutter.zip", nil
+ return "flutter", "flutter/new_httpdns", "flutter/new_httpdns/README.md", "httpdns-sdk-flutter.zip", nil
default:
- return "", "", "", "", errors.New("invalid platform, expected one of: android, ios, flutter")
+ return "", "", "", "", errors.New("不支持的平台,可选值:android、ios、flutter")
}
}
func findSDKArchivePath(downloadFilename string, version string) string {
- searchDirs := sdkUploadSearchDirs()
-
- normalizedVersion := strings.TrimSpace(version)
- base := strings.TrimSuffix(downloadFilename, ".zip")
- if len(normalizedVersion) > 0 {
- versionFiles := []string{}
- for _, dir := range searchDirs {
- versionFiles = append(versionFiles, filepath.Join(dir, base+"-v"+normalizedVersion+".zip"))
- }
- if path := findFirstExistingFile(versionFiles); len(path) > 0 {
- return path
- }
+ platform := parseSDKPlatformFromDownloadFilename(downloadFilename)
+ if len(platform) == 0 {
return ""
}
- patternName := base + "-v*.zip"
- matches := []string{}
- for _, dir := range searchDirs {
- found, _ := filepath.Glob(filepath.Join(dir, patternName))
- for _, file := range found {
- stat, err := os.Stat(file)
- if err == nil && !stat.IsDir() {
- matches = append(matches, file)
- }
- }
+ normalizedVersion := strings.TrimSpace(version)
+ if len(normalizedVersion) > 0 {
+ return findSDKUploadFileByMeta(platform, normalizedVersion, "sdk")
}
- if len(matches) > 0 {
- return findNewestExistingFile(matches)
- }
-
- exactFiles := []string{}
- for _, dir := range searchDirs {
- exactFiles = append(exactFiles, filepath.Join(dir, downloadFilename))
- }
- if path := findFirstExistingFile(exactFiles); len(path) > 0 {
- return path
- }
-
- return ""
+ return findNewestSDKUploadFileByMeta(platform, "sdk")
}
func findUploadedSDKDocPath(platform string, version string) string {
@@ -176,42 +254,9 @@ func findUploadedSDKDocPath(platform string, version string) string {
return ""
}
- searchDirs := sdkUploadSearchDirs()
normalizedVersion := strings.TrimSpace(version)
if len(normalizedVersion) > 0 {
- exactVersion := []string{}
- for _, dir := range searchDirs {
- exactVersion = append(exactVersion, filepath.Join(dir, "httpdns-sdk-"+platform+"-v"+normalizedVersion+".md"))
- }
- if file := findFirstExistingFile(exactVersion); len(file) > 0 {
- return file
- }
- return ""
+ return findSDKUploadFileByMeta(platform, normalizedVersion, "doc")
}
-
- matches := []string{}
- for _, dir := range searchDirs {
- pattern := filepath.Join(dir, "httpdns-sdk-"+platform+"-v*.md")
- found, _ := filepath.Glob(pattern)
- matches = append(matches, found...)
- }
- if len(matches) > 0 {
- sort.Strings(matches)
- return findNewestExistingFile(matches)
- }
-
- exact := []string{}
- for _, dir := range searchDirs {
- exact = append(exact, filepath.Join(dir, "httpdns-sdk-"+platform+".md"))
- }
- return findFirstExistingFile(exact)
-}
-
-func findLocalSDKDocPath(platform string) string {
- filename := strings.ToLower(strings.TrimSpace(platform)) + ".md"
- candidates := []string{
- filepath.Clean(Tea.Root + "/edge-admin/web/views/@default/httpdns/apps/docs/" + filename),
- filepath.Clean(Tea.Root + "/EdgeAdmin/web/views/@default/httpdns/apps/docs/" + filename),
- }
- return findFirstExistingFile(candidates)
+ return findNewestSDKUploadFileByMeta(platform, "doc")
}
diff --git a/EdgeAdmin/internal/web/actions/default/httpdns/apps/sdk_upload.go b/EdgeAdmin/internal/web/actions/default/httpdns/apps/sdk_upload.go
index 44bffd2..df5f2cb 100644
--- a/EdgeAdmin/internal/web/actions/default/httpdns/apps/sdk_upload.go
+++ b/EdgeAdmin/internal/web/actions/default/httpdns/apps/sdk_upload.go
@@ -1,6 +1,7 @@
package apps
import (
+ "encoding/json"
"errors"
"os"
"path/filepath"
@@ -14,6 +15,8 @@ import (
"github.com/iwind/TeaGo/actions"
)
+const sdkUploadMaxFileSize = 20 * 1024 * 1024 // 20MB
+
type SdkUploadAction struct {
actionutils.ParentAction
}
@@ -52,7 +55,7 @@ func (this *SdkUploadAction) RunPost(params struct {
}) {
params.Must.Field("appId", params.AppId).Gt(0, "请选择应用")
- platform, _, _, downloadFilename, err := resolveSDKPlatform(params.Platform)
+ platform, _, _, _, err := resolveSDKPlatform(params.Platform)
if err != nil {
this.Fail(err.Error())
return
@@ -70,57 +73,21 @@ func (this *SdkUploadAction) RunPost(params struct {
}
uploadDir := sdkUploadDir()
- err = os.MkdirAll(uploadDir, 0755)
- if err != nil {
+ if err = os.MkdirAll(uploadDir, 0755); err != nil {
this.Fail("创建上传目录失败: " + err.Error())
return
}
if params.SdkFile != nil {
- filename := strings.ToLower(strings.TrimSpace(params.SdkFile.Filename))
- if !strings.HasSuffix(filename, ".zip") {
- this.Fail("SDK 包仅支持 .zip 文件")
- return
- }
-
- sdkData, readErr := params.SdkFile.Read()
- if readErr != nil {
- this.Fail("读取 SDK 包失败: " + readErr.Error())
- return
- }
- if len(sdkData) == 0 {
- this.Fail("SDK 包文件为空,请重新上传")
- return
- }
-
- baseName := strings.TrimSuffix(downloadFilename, ".zip")
- err = saveSDKUploadFile(uploadDir, baseName+"-v"+version+".zip", sdkData)
- if err != nil {
- this.Fail("保存 SDK 包失败: " + err.Error())
+ if err = this.saveUploadedItem(uploadDir, platform, version, "sdk", params.SdkFile); err != nil {
+ this.Fail(err.Error())
return
}
}
if params.DocFile != nil {
- docName := strings.ToLower(strings.TrimSpace(params.DocFile.Filename))
- if !strings.HasSuffix(docName, ".md") {
- this.Fail("集成文档仅支持 .md 文件")
- return
- }
-
- docData, readErr := params.DocFile.Read()
- if readErr != nil {
- this.Fail("读取集成文档失败: " + readErr.Error())
- return
- }
- if len(docData) == 0 {
- this.Fail("集成文档文件为空,请重新上传")
- return
- }
-
- err = saveSDKUploadFile(uploadDir, "httpdns-sdk-"+platform+"-v"+version+".md", docData)
- if err != nil {
- this.Fail("保存集成文档失败: " + err.Error())
+ if err = this.saveUploadedItem(uploadDir, platform, version, "doc", params.DocFile); err != nil {
+ this.Fail(err.Error())
return
}
}
@@ -128,6 +95,52 @@ func (this *SdkUploadAction) RunPost(params struct {
this.Success()
}
+func (this *SdkUploadAction) saveUploadedItem(uploadDir string, platform string, version string, fileType string, file *actions.File) error {
+ expectedExt := ".md"
+ displayType := "集成文档"
+ if fileType == "sdk" {
+ expectedExt = ".zip"
+ displayType = "SDK 包"
+ }
+
+ filename, err := normalizeUploadedFilename(file.Filename, expectedExt)
+ if err != nil {
+ return err
+ }
+
+ if file.Size > sdkUploadMaxFileSize {
+ return errors.New(displayType + "文件不能超过 20MB")
+ }
+
+ data, err := file.Read()
+ if err != nil {
+ return errors.New("读取" + displayType + "失败: " + err.Error())
+ }
+ if len(data) == 0 {
+ return errors.New(displayType + "文件为空,请重新上传")
+ }
+ if len(data) > sdkUploadMaxFileSize {
+ return errors.New(displayType + "文件不能超过 20MB")
+ }
+
+ if err = saveSDKUploadFile(uploadDir, filename, data); err != nil {
+ return errors.New("保存" + displayType + "失败: " + err.Error())
+ }
+
+ err = saveSDKUploadMetaRecord(uploadDir, sdkUploadMeta{
+ Platform: platform,
+ Version: version,
+ FileType: fileType,
+ Filename: filename,
+ UpdatedAt: time.Now().Unix(),
+ })
+ if err != nil {
+ return errors.New("保存上传元信息失败: " + err.Error())
+ }
+
+ return nil
+}
+
func normalizeSDKVersion(version string) (string, error) {
version = strings.TrimSpace(version)
if len(version) == 0 {
@@ -142,6 +155,26 @@ func normalizeSDKVersion(version string) (string, error) {
return version, nil
}
+func normalizeUploadedFilename(raw string, expectedExt string) (string, error) {
+ filename := filepath.Base(strings.TrimSpace(raw))
+ if len(filename) == 0 || filename == "." || filename == string(filepath.Separator) {
+ return "", errors.New("文件名不能为空")
+ }
+ if strings.Contains(filename, "/") || strings.Contains(filename, "\\") || strings.Contains(filename, "..") {
+ return "", errors.New("文件名不合法")
+ }
+
+ actualExt := strings.ToLower(filepath.Ext(filename))
+ if actualExt != strings.ToLower(expectedExt) {
+ if expectedExt == ".zip" {
+ return "", errors.New("SDK 包仅支持 .zip 文件")
+ }
+ return "", errors.New("集成文档仅支持 .md 文件")
+ }
+
+ return filename, nil
+}
+
func saveSDKUploadFile(baseDir string, filename string, data []byte) error {
targetPath := filepath.Join(baseDir, filename)
tmpPath := targetPath + ".tmp"
@@ -152,6 +185,35 @@ func saveSDKUploadFile(baseDir string, filename string, data []byte) error {
return os.Rename(tmpPath, targetPath)
}
+func saveSDKUploadMetaRecord(baseDir string, meta sdkUploadMeta) error {
+ meta.Platform = strings.ToLower(strings.TrimSpace(meta.Platform))
+ meta.Version = strings.TrimSpace(meta.Version)
+ meta.FileType = strings.ToLower(strings.TrimSpace(meta.FileType))
+ meta.Filename = filepath.Base(strings.TrimSpace(meta.Filename))
+ if len(meta.Platform) == 0 || len(meta.Version) == 0 || len(meta.FileType) == 0 || len(meta.Filename) == 0 {
+ return errors.New("上传元信息不完整")
+ }
+
+ metaFilename := sdkUploadMetaFilename(meta.Platform, meta.Version, meta.FileType)
+ metaPath := filepath.Join(baseDir, metaFilename)
+ if data, err := os.ReadFile(metaPath); err == nil && len(data) > 0 {
+ var oldMeta sdkUploadMeta
+ if json.Unmarshal(data, &oldMeta) == nil {
+ oldFile := filepath.Base(strings.TrimSpace(oldMeta.Filename))
+ if len(oldFile) > 0 && oldFile != meta.Filename {
+ _ = os.Remove(filepath.Join(baseDir, oldFile))
+ }
+ }
+ }
+
+ data, err := json.Marshal(meta)
+ if err != nil {
+ return err
+ }
+
+ return saveSDKUploadFile(baseDir, metaFilename, data)
+}
+
func listUploadedSDKFiles() []map[string]interface{} {
type item struct {
Name string
@@ -162,45 +224,26 @@ func listUploadedSDKFiles() []map[string]interface{} {
UpdatedAt int64
}
- byName := map[string]item{}
- for _, dir := range sdkUploadSearchDirs() {
- entries, err := os.ReadDir(dir)
- if err != nil {
+ items := make([]item, 0)
+ for _, record := range listSDKUploadMetaRecords() {
+ stat, err := os.Stat(record.FilePath)
+ if err != nil || stat.IsDir() {
continue
}
- for _, entry := range entries {
- if entry.IsDir() {
- continue
- }
- name := entry.Name()
- platform, version, fileType, ok := parseSDKUploadFilename(name)
- if !ok {
- continue
- }
- info, statErr := entry.Info()
- if statErr != nil {
- continue
- }
-
- current := item{
- Name: name,
- Platform: platform,
- FileType: fileType,
- Version: version,
- SizeBytes: info.Size(),
- UpdatedAt: info.ModTime().Unix(),
- }
- old, exists := byName[name]
- if !exists || current.UpdatedAt >= old.UpdatedAt {
- byName[name] = current
- }
+ fileType := "SDK 包"
+ if record.Meta.FileType == "doc" {
+ fileType = "集成文档"
}
- }
- items := make([]item, 0, len(byName))
- for _, it := range byName {
- items = append(items, it)
+ items = append(items, item{
+ Name: filepath.Base(record.FilePath),
+ Platform: record.Meta.Platform,
+ FileType: fileType,
+ Version: record.Meta.Version,
+ SizeBytes: stat.Size(),
+ UpdatedAt: stat.ModTime().Unix(),
+ })
}
sort.Slice(items, func(i, j int) bool {
@@ -224,55 +267,21 @@ func listUploadedSDKFiles() []map[string]interface{} {
return result
}
-func parseSDKUploadFilename(filename string) (platform string, version string, fileType string, ok bool) {
- if !strings.HasPrefix(filename, "httpdns-sdk-") {
- return "", "", "", false
- }
-
- ext := ""
- switch {
- case strings.HasSuffix(filename, ".zip"):
- ext = ".zip"
- fileType = "SDK包"
- case strings.HasSuffix(filename, ".md"):
- ext = ".md"
- fileType = "集成文档"
- default:
- return "", "", "", false
- }
-
- main := strings.TrimSuffix(strings.TrimPrefix(filename, "httpdns-sdk-"), ext)
- version = ""
- if idx := strings.Index(main, "-v"); idx > 0 && idx+2 < len(main) {
- version = main[idx+2:]
- main = main[:idx]
- }
-
- main = strings.ToLower(strings.TrimSpace(main))
- switch main {
- case "android", "ios", "flutter":
- platform = main
- if len(version) == 0 {
- version = "-"
- }
- return platform, version, fileType, true
- default:
- return "", "", "", false
- }
-}
-
func formatSDKFileSize(size int64) string {
if size < 1024 {
return strconv.FormatInt(size, 10) + " B"
}
+
sizeKB := float64(size) / 1024
if sizeKB < 1024 {
return strconv.FormatFloat(sizeKB, 'f', 1, 64) + " KB"
}
+
sizeMB := sizeKB / 1024
if sizeMB < 1024 {
return strconv.FormatFloat(sizeMB, 'f', 1, 64) + " MB"
}
+
sizeGB := sizeMB / 1024
return strconv.FormatFloat(sizeGB, 'f', 1, 64) + " GB"
}
diff --git a/EdgeAdmin/internal/web/actions/default/httpdns/apps/sdk_upload_delete.go b/EdgeAdmin/internal/web/actions/default/httpdns/apps/sdk_upload_delete.go
index 0e39379..4809474 100644
--- a/EdgeAdmin/internal/web/actions/default/httpdns/apps/sdk_upload_delete.go
+++ b/EdgeAdmin/internal/web/actions/default/httpdns/apps/sdk_upload_delete.go
@@ -1,6 +1,7 @@
package apps
import (
+ "encoding/json"
"os"
"path/filepath"
"strings"
@@ -34,19 +35,16 @@ func (this *SdkUploadDeleteAction) RunPost(params struct {
this.Fail("文件名不合法")
return
}
- if !strings.HasPrefix(filename, "httpdns-sdk-") {
- this.Fail("不允许删除该文件")
- return
- }
- if !(strings.HasSuffix(filename, ".zip") || strings.HasSuffix(filename, ".md")) {
- this.Fail("不允许删除该文件")
+ lowName := strings.ToLower(filename)
+ if !strings.HasSuffix(lowName, ".zip") && !strings.HasSuffix(lowName, ".md") {
+ this.Fail("仅允许删除 .zip 或 .md 文件")
return
}
for _, dir := range sdkUploadDirs() {
fullPath := filepath.Join(dir, filename)
- _, err := os.Stat(fullPath)
- if err != nil {
+ stat, err := os.Stat(fullPath)
+ if err != nil || stat.IsDir() {
continue
}
if err = os.Remove(fullPath); err != nil {
@@ -55,5 +53,38 @@ func (this *SdkUploadDeleteAction) RunPost(params struct {
}
}
+ // 删除引用该文件的元数据
+ for _, dir := range sdkUploadDirs() {
+ entries, err := os.ReadDir(dir)
+ if err != nil {
+ continue
+ }
+
+ for _, entry := range entries {
+ if entry.IsDir() {
+ continue
+ }
+ if !isSDKUploadMetaFile(entry.Name()) {
+ continue
+ }
+
+ metaPath := filepath.Join(dir, entry.Name())
+ data, err := os.ReadFile(metaPath)
+ if err != nil || len(data) == 0 {
+ continue
+ }
+
+ var meta sdkUploadMeta
+ if err = json.Unmarshal(data, &meta); err != nil {
+ continue
+ }
+ if filepath.Base(strings.TrimSpace(meta.Filename)) != filename {
+ continue
+ }
+
+ _ = os.Remove(metaPath)
+ }
+ }
+
this.Success()
}
diff --git a/EdgeAdmin/internal/web/actions/default/httpdns/clusters/cluster/node/index.go b/EdgeAdmin/internal/web/actions/default/httpdns/clusters/cluster/node/index.go
index 5e203f5..d34840b 100644
--- a/EdgeAdmin/internal/web/actions/default/httpdns/clusters/cluster/node/index.go
+++ b/EdgeAdmin/internal/web/actions/default/httpdns/clusters/cluster/node/index.go
@@ -1,9 +1,11 @@
package node
import (
+ "strings"
"time"
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
+ "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
timeutil "github.com/iwind/TeaGo/utils/time"
)
@@ -50,7 +52,22 @@ func (this *IndexAction) RunGet(params struct {
this.Data["nodeDatetime"] = nodeDatetime
this.Data["nodeTimeDiff"] = nodeTimeDiff
- this.Data["shouldUpgrade"] = false
- this.Data["newVersion"] = ""
+ osName := strings.TrimSpace(status.GetString("os"))
+ if len(osName) > 0 {
+ checkVersionResp, err := this.RPC().HTTPDNSNodeRPC().CheckHTTPDNSNodeLatestVersion(this.AdminContext(), &pb.CheckHTTPDNSNodeLatestVersionRequest{
+ Os: osName,
+ Arch: strings.TrimSpace(status.GetString("arch")),
+ CurrentVersion: strings.TrimSpace(status.GetString("buildVersion")),
+ })
+ if err != nil {
+ this.ErrorPage(err)
+ return
+ }
+ this.Data["shouldUpgrade"] = checkVersionResp.GetHasNewVersion()
+ this.Data["newVersion"] = checkVersionResp.GetNewVersion()
+ } else {
+ this.Data["shouldUpgrade"] = false
+ this.Data["newVersion"] = ""
+ }
this.Show()
}
diff --git a/EdgeAdmin/internal/web/actions/default/httpdns/clusters/cluster/node/rpc_helpers.go b/EdgeAdmin/internal/web/actions/default/httpdns/clusters/cluster/node/rpc_helpers.go
index 2f1d6e5..2694746 100644
--- a/EdgeAdmin/internal/web/actions/default/httpdns/clusters/cluster/node/rpc_helpers.go
+++ b/EdgeAdmin/internal/web/actions/default/httpdns/clusters/cluster/node/rpc_helpers.go
@@ -22,14 +22,14 @@ func findHTTPDNSClusterMap(parent *actionutils.ParentAction, clusterID int64) (m
return maps.Map{
"id": clusterID,
"name": "",
- "installDir": "/opt/edge-httpdns",
+ "installDir": "/root/edge-httpdns",
}, nil
}
cluster := resp.GetCluster()
installDir := strings.TrimSpace(cluster.GetInstallDir())
if len(installDir) == 0 {
- installDir = "/opt/edge-httpdns"
+ installDir = "/root/edge-httpdns"
}
return maps.Map{
"id": cluster.GetId(),
@@ -93,7 +93,7 @@ func findHTTPDNSNodeMap(parent *actionutils.ParentAction, nodeID int64) (maps.Ma
installDir := strings.TrimSpace(node.GetInstallDir())
if len(installDir) == 0 {
- installDir = "/opt/edge-httpdns"
+ installDir = "/root/edge-httpdns"
}
clusterMap, err := findHTTPDNSClusterMap(parent, node.GetClusterId())
@@ -137,22 +137,22 @@ func findHTTPDNSNodeMap(parent *actionutils.ParentAction, nodeID int64) (maps.Ma
}
return maps.Map{
- "id": node.GetId(),
- "clusterId": node.GetClusterId(),
- "name": node.GetName(),
- "isOn": node.GetIsOn(),
- "isUp": node.GetIsUp(),
- "isInstalled": node.GetIsInstalled(),
- "isActive": node.GetIsActive(),
- "uniqueId": node.GetUniqueId(),
- "secret": node.GetSecret(),
- "installDir": installDir,
- "status": statusMap,
+ "id": node.GetId(),
+ "clusterId": node.GetClusterId(),
+ "name": node.GetName(),
+ "isOn": node.GetIsOn(),
+ "isUp": node.GetIsUp(),
+ "isInstalled": node.GetIsInstalled(),
+ "isActive": node.GetIsActive(),
+ "uniqueId": node.GetUniqueId(),
+ "secret": node.GetSecret(),
+ "installDir": installDir,
+ "status": statusMap,
"installStatus": installStatusMap,
- "cluster": clusterMap,
- "login": loginMap,
- "apiNodeAddrs": []string{},
- "ipAddresses": ipAddresses,
+ "cluster": clusterMap,
+ "login": loginMap,
+ "apiNodeAddrs": []string{},
+ "ipAddresses": ipAddresses,
}, nil
}
@@ -165,21 +165,23 @@ func decodeNodeStatus(raw []byte) maps.Map {
memText := fmt.Sprintf("%.2f%%", status.MemoryUsage*100)
return maps.Map{
- "isActive": status.IsActive,
- "updatedAt": status.UpdatedAt,
- "hostname": status.Hostname,
- "hostIP": status.HostIP,
- "cpuUsage": status.CPUUsage,
- "cpuUsageText": cpuText,
- "memUsage": status.MemoryUsage,
- "memUsageText": memText,
- "load1m": status.Load1m,
- "load5m": status.Load5m,
- "load15m": status.Load15m,
- "buildVersion": status.BuildVersion,
- "cpuPhysicalCount": status.CPUPhysicalCount,
- "cpuLogicalCount": status.CPULogicalCount,
- "exePath": status.ExePath,
+ "isActive": status.IsActive,
+ "updatedAt": status.UpdatedAt,
+ "os": status.OS,
+ "arch": status.Arch,
+ "hostname": status.Hostname,
+ "hostIP": status.HostIP,
+ "cpuUsage": status.CPUUsage,
+ "cpuUsageText": cpuText,
+ "memUsage": status.MemoryUsage,
+ "memUsageText": memText,
+ "load1m": status.Load1m,
+ "load5m": status.Load5m,
+ "load15m": status.Load15m,
+ "buildVersion": status.BuildVersion,
+ "cpuPhysicalCount": status.CPUPhysicalCount,
+ "cpuLogicalCount": status.CPULogicalCount,
+ "exePath": status.ExePath,
"apiSuccessPercent": status.APISuccessPercent,
"apiAvgCostSeconds": status.APIAvgCostSeconds,
}
diff --git a/EdgeAdmin/internal/web/actions/default/httpdns/clusters/cluster/node/update.go b/EdgeAdmin/internal/web/actions/default/httpdns/clusters/cluster/node/update.go
index a6a90d5..43ad6b0 100644
--- a/EdgeAdmin/internal/web/actions/default/httpdns/clusters/cluster/node/update.go
+++ b/EdgeAdmin/internal/web/actions/default/httpdns/clusters/cluster/node/update.go
@@ -195,7 +195,7 @@ func (this *UpdateAction) RunPost(params struct {
installDir := strings.TrimSpace(node.GetInstallDir())
if len(installDir) == 0 {
- installDir = "/opt/edge-httpdns"
+ installDir = "/root/edge-httpdns"
}
_, err = this.RPC().HTTPDNSNodeRPC().UpdateHTTPDNSNode(this.AdminContext(), &pb.UpdateHTTPDNSNodeRequest{
diff --git a/EdgeAdmin/internal/web/actions/default/httpdns/clusters/clusterSettings.go b/EdgeAdmin/internal/web/actions/default/httpdns/clusters/clusterSettings.go
index f8737ed..29acd26 100644
--- a/EdgeAdmin/internal/web/actions/default/httpdns/clusters/clusterSettings.go
+++ b/EdgeAdmin/internal/web/actions/default/httpdns/clusters/clusterSettings.go
@@ -1,17 +1,20 @@
-package clusters
+package clusters
import (
"encoding/json"
+ "fmt"
"strconv"
"strings"
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/httpdns/httpdnsutils"
+ "github.com/TeaOSLab/EdgeCommon/pkg/nodeconfigs"
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs"
"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/sslconfigs"
"github.com/iwind/TeaGo/actions"
"github.com/iwind/TeaGo/maps"
+ "google.golang.org/grpc/metadata"
)
type ClusterSettingsAction struct {
@@ -41,14 +44,15 @@ func (this *ClusterSettingsAction) RunGet(params struct {
}
settings := maps.Map{
- "name": cluster.GetString("name"),
- "gatewayDomain": cluster.GetString("gatewayDomain"),
- "cacheTtl": cluster.GetInt("defaultTTL"),
- "fallbackTimeout": cluster.GetInt("fallbackTimeout"),
- "installDir": cluster.GetString("installDir"),
- "isOn": cluster.GetBool("isOn"),
- "autoRemoteStart": cluster.GetBool("autoRemoteStart"),
- "accessLogIsOn": cluster.GetBool("accessLogIsOn"),
+ "name": cluster.GetString("name"),
+ "gatewayDomain": cluster.GetString("gatewayDomain"),
+ "cacheTtl": cluster.GetInt("defaultTTL"),
+ "fallbackTimeout": cluster.GetInt("fallbackTimeout"),
+ "installDir": cluster.GetString("installDir"),
+ "isOn": cluster.GetBool("isOn"),
+ "autoRemoteStart": cluster.GetBool("autoRemoteStart"),
+ "accessLogIsOn": cluster.GetBool("accessLogIsOn"),
+ "timeZone": cluster.GetString("timeZone"),
}
if settings.GetInt("cacheTtl") <= 0 {
settings["cacheTtl"] = 60
@@ -57,7 +61,10 @@ func (this *ClusterSettingsAction) RunGet(params struct {
settings["fallbackTimeout"] = 300
}
if len(settings.GetString("installDir")) == 0 {
- settings["installDir"] = "/opt/edge-httpdns"
+ settings["installDir"] = "/root/edge-httpdns"
+ }
+ if len(settings.GetString("timeZone")) == 0 {
+ settings["timeZone"] = "Asia/Shanghai"
}
listenAddresses := []*serverconfigs.NetworkAddressConfig{
@@ -101,19 +108,29 @@ func (this *ClusterSettingsAction) RunGet(params struct {
"listen": listenAddresses,
"sslPolicy": sslPolicy,
}
+
+ this.Data["timeZoneGroups"] = nodeconfigs.FindAllTimeZoneGroups()
+ this.Data["timeZoneLocations"] = nodeconfigs.FindAllTimeZoneLocations()
+ timeZoneStr := settings.GetString("timeZone")
+ if len(timeZoneStr) == 0 {
+ timeZoneStr = nodeconfigs.DefaultTimeZoneLocation
+ }
+ this.Data["timeZoneLocation"] = nodeconfigs.FindTimeZoneLocation(timeZoneStr)
+
this.Show()
}
func (this *ClusterSettingsAction) RunPost(params struct {
- ClusterId int64
- Name string
- GatewayDomain string
- CacheTtl int32
- FallbackTimeout int32
- InstallDir string
- IsOn bool
+ ClusterId int64
+ Name string
+ GatewayDomain string
+ CacheTtl int32
+ FallbackTimeout int32
+ InstallDir string
+ IsOn bool
AutoRemoteStart bool
- AccessLogIsOn bool
+ AccessLogIsOn bool
+ TimeZone string
Addresses []byte
SslPolicyJSON []byte
@@ -129,6 +146,31 @@ func (this *ClusterSettingsAction) RunPost(params struct {
params.Must.Field("name", params.Name).Require("请输入集群名称")
params.Must.Field("gatewayDomain", params.GatewayDomain).Require("请输入服务域名")
+ cluster, err := findClusterMap(this.Parent(), params.ClusterId)
+ if err != nil {
+ this.ErrorPage(err)
+ return
+ }
+
+ // 开关项按请求值强制覆盖:未提交/空值都视为 false,支持取消勾选
+ autoRemoteStartRaw := strings.ToLower(strings.TrimSpace(this.ParamString("autoRemoteStart")))
+ params.AutoRemoteStart = autoRemoteStartRaw == "1" || autoRemoteStartRaw == "true" || autoRemoteStartRaw == "on" || autoRemoteStartRaw == "yes" || autoRemoteStartRaw == "enabled"
+
+ accessLogIsOnRaw := strings.ToLower(strings.TrimSpace(this.ParamString("accessLogIsOn")))
+ params.AccessLogIsOn = accessLogIsOnRaw == "1" || accessLogIsOnRaw == "true" || accessLogIsOnRaw == "on" || accessLogIsOnRaw == "yes" || accessLogIsOnRaw == "enabled"
+
+ isOnRaw := strings.ToLower(strings.TrimSpace(this.ParamString("isOn")))
+ params.IsOn = isOnRaw == "1" || isOnRaw == "true" || isOnRaw == "on" || isOnRaw == "yes" || isOnRaw == "enabled"
+
+ // 时区为空时继承当前值,再兜底默认值
+ params.TimeZone = strings.TrimSpace(this.ParamString("timeZone"))
+ if len(params.TimeZone) == 0 {
+ params.TimeZone = strings.TrimSpace(cluster.GetString("timeZone"))
+ }
+ if len(params.TimeZone) == 0 {
+ params.TimeZone = "Asia/Shanghai"
+ }
+
if params.CacheTtl <= 0 {
params.CacheTtl = 60
}
@@ -136,20 +178,13 @@ func (this *ClusterSettingsAction) RunPost(params struct {
params.FallbackTimeout = 300
}
if len(params.InstallDir) == 0 {
- params.InstallDir = "/opt/edge-httpdns"
- }
-
- cluster, err := findClusterMap(this.Parent(), params.ClusterId)
- if err != nil {
- this.ErrorPage(err)
- return
+ params.InstallDir = "/root/edge-httpdns"
}
tlsConfig := maps.Map{}
if rawTLS := strings.TrimSpace(cluster.GetString("tlsPolicyJSON")); len(rawTLS) > 0 {
_ = json.Unmarshal([]byte(rawTLS), &tlsConfig)
}
-
if len(params.Addresses) > 0 {
var addresses []*serverconfigs.NetworkAddressConfig
if err := json.Unmarshal(params.Addresses, &addresses); err != nil {
@@ -158,7 +193,6 @@ func (this *ClusterSettingsAction) RunPost(params struct {
}
tlsConfig["listen"] = addresses
}
-
if len(params.SslPolicyJSON) > 0 {
sslPolicy := &sslconfigs.SSLPolicy{}
if err := json.Unmarshal(params.SslPolicyJSON, sslPolicy); err != nil {
@@ -177,7 +211,7 @@ func (this *ClusterSettingsAction) RunPost(params struct {
}
}
- _, err = this.RPC().HTTPDNSClusterRPC().UpdateHTTPDNSCluster(this.AdminContext(), &pb.UpdateHTTPDNSClusterRequest{
+ updateReq := &pb.UpdateHTTPDNSClusterRequest{
ClusterId: params.ClusterId,
Name: params.Name,
ServiceDomain: params.GatewayDomain,
@@ -189,7 +223,16 @@ func (this *ClusterSettingsAction) RunPost(params struct {
IsDefault: false,
AutoRemoteStart: params.AutoRemoteStart,
AccessLogIsOn: params.AccessLogIsOn,
- })
+ TimeZone: params.TimeZone,
+ }
+ updateCtx := metadata.AppendToOutgoingContext(
+ this.AdminContext(),
+ "x-httpdns-auto-remote-start", fmt.Sprintf("%t", updateReq.GetAutoRemoteStart()),
+ "x-httpdns-access-log-is-on", fmt.Sprintf("%t", updateReq.GetAccessLogIsOn()),
+ "x-httpdns-time-zone", updateReq.GetTimeZone(),
+ )
+
+ _, err = this.RPC().HTTPDNSClusterRPC().UpdateHTTPDNSCluster(updateCtx, updateReq)
if err != nil {
this.ErrorPage(err)
return
diff --git a/EdgeAdmin/internal/web/actions/default/httpdns/clusters/create.go b/EdgeAdmin/internal/web/actions/default/httpdns/clusters/create.go
index 0823114..23bcd22 100644
--- a/EdgeAdmin/internal/web/actions/default/httpdns/clusters/create.go
+++ b/EdgeAdmin/internal/web/actions/default/httpdns/clusters/create.go
@@ -1,6 +1,7 @@
package clusters
import (
+ "strconv"
"strings"
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
@@ -36,7 +37,7 @@ func (this *CreateAction) RunPost(params struct {
params.GatewayDomain = strings.TrimSpace(params.GatewayDomain)
params.InstallDir = strings.TrimSpace(params.InstallDir)
if len(params.InstallDir) == 0 {
- params.InstallDir = "/opt/edge-httpdns"
+ params.InstallDir = "/root/edge-httpdns"
}
if params.CacheTtl <= 0 {
params.CacheTtl = 60
@@ -56,6 +57,9 @@ func (this *CreateAction) RunPost(params struct {
InstallDir: params.InstallDir,
IsOn: params.IsOn,
IsDefault: false,
+ AutoRemoteStart: true,
+ AccessLogIsOn: true,
+ TimeZone: "Asia/Shanghai",
})
if err != nil {
this.ErrorPage(err)
@@ -63,5 +67,12 @@ func (this *CreateAction) RunPost(params struct {
}
this.Data["clusterId"] = resp.GetClusterId()
+
+ // fallback: if frontend JS doesn't intercept form submit, redirect instead of showing raw JSON
+ if len(this.Request.Header.Get("X-Requested-With")) == 0 {
+ this.RedirectURL("/httpdns/clusters/cluster?clusterId=" + strconv.FormatInt(resp.GetClusterId(), 10))
+ return
+ }
+
this.Success()
}
diff --git a/EdgeAdmin/internal/web/actions/default/httpdns/clusters/createNode.go b/EdgeAdmin/internal/web/actions/default/httpdns/clusters/createNode.go
index b34fb45..9b57ca4 100644
--- a/EdgeAdmin/internal/web/actions/default/httpdns/clusters/createNode.go
+++ b/EdgeAdmin/internal/web/actions/default/httpdns/clusters/createNode.go
@@ -51,7 +51,7 @@ func (this *CreateNodeAction) RunPost(params struct {
params.InstallDir = strings.TrimSpace(cluster.GetString("installDir"))
}
if len(params.InstallDir) == 0 {
- params.InstallDir = "/opt/edge-httpdns"
+ params.InstallDir = "/root/edge-httpdns"
}
}
diff --git a/EdgeAdmin/internal/web/actions/default/httpdns/clusters/init.go b/EdgeAdmin/internal/web/actions/default/httpdns/clusters/init.go
index 999e0ab..3c61885 100644
--- a/EdgeAdmin/internal/web/actions/default/httpdns/clusters/init.go
+++ b/EdgeAdmin/internal/web/actions/default/httpdns/clusters/init.go
@@ -22,7 +22,9 @@ func init() {
// Node level
GetPost("/createNode", new(CreateNodeAction)).
Post("/deleteNode", new(DeleteNodeAction)).
- Get("/upgradeRemote", new(UpgradeRemoteAction)).
+ GetPost("/cluster/upgradeRemote", new(UpgradeRemoteAction)).
+ GetPost("/upgradeRemote", new(UpgradeRemoteAction)).
+ Post("/upgradeStatus", new(UpgradeStatusAction)).
GetPost("/updateNodeSSH", new(UpdateNodeSSHAction)).
Post("/checkPorts", new(CheckPortsAction)).
diff --git a/EdgeAdmin/internal/web/actions/default/httpdns/clusters/rpc_helpers.go b/EdgeAdmin/internal/web/actions/default/httpdns/clusters/rpc_helpers.go
index 3090532..8a6013d 100644
--- a/EdgeAdmin/internal/web/actions/default/httpdns/clusters/rpc_helpers.go
+++ b/EdgeAdmin/internal/web/actions/default/httpdns/clusters/rpc_helpers.go
@@ -9,6 +9,10 @@ import (
"github.com/TeaOSLab/EdgeCommon/pkg/nodeconfigs"
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
"github.com/iwind/TeaGo/maps"
+ "google.golang.org/grpc"
+ "google.golang.org/grpc/codes"
+ "google.golang.org/grpc/metadata"
+ "google.golang.org/grpc/status"
)
func listClusterMaps(parent *actionutils.ParentAction, keyword string) ([]maps.Map, error) {
@@ -37,6 +41,11 @@ func listClusterMaps(parent *actionutils.ParentAction, keyword string) ([]maps.M
}
}
+ countUpgradeNodes, err := countUpgradeHTTPDNSNodes(parent, cluster.GetId())
+ if err != nil {
+ return nil, err
+ }
+
port := "443"
if rawTLS := cluster.GetTlsPolicyJSON(); len(rawTLS) > 0 {
tlsConfig := maps.Map{}
@@ -56,32 +65,87 @@ func listClusterMaps(parent *actionutils.ParentAction, keyword string) ([]maps.M
apiAddress := "https://" + cluster.GetServiceDomain() + ":" + port
result = append(result, maps.Map{
- "id": cluster.GetId(),
- "name": cluster.GetName(),
- "gatewayDomain": cluster.GetServiceDomain(),
- "apiAddress": apiAddress,
- "defaultTTL": cluster.GetDefaultTTL(),
- "fallbackTimeout": cluster.GetFallbackTimeoutMs(),
- "installDir": cluster.GetInstallDir(),
- "isOn": cluster.GetIsOn(),
- "isDefault": cluster.GetIsDefault(),
- "countAllNodes": countAllNodes,
- "countActiveNodes": countActiveNodes,
+ "id": cluster.GetId(),
+ "name": cluster.GetName(),
+ "gatewayDomain": cluster.GetServiceDomain(),
+ "apiAddress": apiAddress,
+ "defaultTTL": cluster.GetDefaultTTL(),
+ "fallbackTimeout": cluster.GetFallbackTimeoutMs(),
+ "installDir": cluster.GetInstallDir(),
+ "timeZone": cluster.GetTimeZone(),
+ "isOn": cluster.GetIsOn(),
+ "isDefault": cluster.GetIsDefault(),
+ "autoRemoteStart": cluster.GetAutoRemoteStart(),
+ "accessLogIsOn": cluster.GetAccessLogIsOn(),
+ "tlsPolicyJSON": cluster.GetTlsPolicyJSON(),
+ "countAllNodes": countAllNodes,
+ "countActiveNodes": countActiveNodes,
+ "countUpgradeNodes": countUpgradeNodes,
})
}
return result, nil
}
+func countUpgradeHTTPDNSNodes(parent *actionutils.ParentAction, clusterID int64) (int64, error) {
+ countResp, err := parent.RPC().HTTPDNSNodeRPC().CountAllUpgradeHTTPDNSNodesWithClusterId(parent.AdminContext(), &pb.CountAllUpgradeHTTPDNSNodesWithClusterIdRequest{
+ ClusterId: clusterID,
+ })
+ if err == nil {
+ return countResp.GetCount(), nil
+ }
+
+ grpcStatus, ok := status.FromError(err)
+ if !ok || grpcStatus.Code() != codes.Unimplemented {
+ return 0, err
+ }
+
+ // Compatibility fallback: old edge-api may not implement countAllUpgradeHTTPDNSNodesWithClusterId yet.
+ listResp, listErr := parent.RPC().HTTPDNSNodeRPC().FindAllUpgradeHTTPDNSNodesWithClusterId(parent.AdminContext(), &pb.FindAllUpgradeHTTPDNSNodesWithClusterIdRequest{
+ ClusterId: clusterID,
+ })
+ if listErr == nil {
+ return int64(len(listResp.GetNodes())), nil
+ }
+
+ listStatus, ok := status.FromError(listErr)
+ if ok && listStatus.Code() == codes.Unimplemented {
+ // Compatibility fallback: both methods missing on old edge-api, don't block page rendering.
+ return 0, nil
+ }
+
+ return 0, listErr
+}
+
func findClusterMap(parent *actionutils.ParentAction, clusterID int64) (maps.Map, error) {
if clusterID > 0 {
+ var headerMD metadata.MD
resp, err := parent.RPC().HTTPDNSClusterRPC().FindHTTPDNSCluster(parent.AdminContext(), &pb.FindHTTPDNSClusterRequest{
ClusterId: clusterID,
- })
+ }, grpc.Header(&headerMD))
if err != nil {
return nil, err
}
if resp.GetCluster() != nil {
cluster := resp.GetCluster()
+ autoRemoteStart := cluster.GetAutoRemoteStart()
+ accessLogIsOn := cluster.GetAccessLogIsOn()
+ timeZone := cluster.GetTimeZone()
+
+ // Compatibility fallback:
+ // Some deployed admin binaries may decode newly-added protobuf fields incorrectly.
+ // Read values from grpc response headers as a source of truth.
+ if values := headerMD.Get("x-httpdns-auto-remote-start"); len(values) > 0 {
+ autoRemoteStart = parseBoolLike(values[0], autoRemoteStart)
+ }
+ if values := headerMD.Get("x-httpdns-access-log-is-on"); len(values) > 0 {
+ accessLogIsOn = parseBoolLike(values[0], accessLogIsOn)
+ }
+ if values := headerMD.Get("x-httpdns-time-zone"); len(values) > 0 {
+ if tz := strings.TrimSpace(values[0]); len(tz) > 0 {
+ timeZone = tz
+ }
+ }
+
return maps.Map{
"id": cluster.GetId(),
"name": cluster.GetName(),
@@ -92,8 +156,9 @@ func findClusterMap(parent *actionutils.ParentAction, clusterID int64) (maps.Map
"isOn": cluster.GetIsOn(),
"isDefault": cluster.GetIsDefault(),
"tlsPolicyJSON": cluster.GetTlsPolicyJSON(),
- "autoRemoteStart": cluster.GetAutoRemoteStart(),
- "accessLogIsOn": cluster.GetAccessLogIsOn(),
+ "autoRemoteStart": autoRemoteStart,
+ "accessLogIsOn": accessLogIsOn,
+ "timeZone": timeZone,
}, nil
}
}
@@ -109,12 +174,25 @@ func findClusterMap(parent *actionutils.ParentAction, clusterID int64) (maps.Map
"gatewayDomain": "",
"defaultTTL": 60,
"fallbackTimeout": 300,
- "installDir": "/opt/edge-httpdns",
+ "installDir": "/root/edge-httpdns",
+ "timeZone": "Asia/Shanghai",
}, nil
}
return clusters[0], nil
}
+func parseBoolLike(raw string, defaultValue bool) bool {
+ s := strings.ToLower(strings.TrimSpace(raw))
+ switch s {
+ case "1", "true", "on", "yes", "enabled":
+ return true
+ case "0", "false", "off", "no", "disabled":
+ return false
+ default:
+ return defaultValue
+ }
+}
+
func listNodeMaps(parent *actionutils.ParentAction, clusterID int64) ([]maps.Map, error) {
resp, err := parent.RPC().HTTPDNSNodeRPC().ListHTTPDNSNodes(parent.AdminContext(), &pb.ListHTTPDNSNodesRequest{
ClusterId: clusterID,
@@ -132,21 +210,21 @@ func listNodeMaps(parent *actionutils.ParentAction, clusterID int64) ([]maps.Map
ip = parsed
}
nodeMap := maps.Map{
- "id": node.GetId(),
- "clusterId": node.GetClusterId(),
- "name": node.GetName(),
- "isOn": node.GetIsOn(),
- "isUp": node.GetIsUp(),
- "isInstalled": node.GetIsInstalled(),
- "isActive": node.GetIsActive(),
- "installDir": node.GetInstallDir(),
- "uniqueId": node.GetUniqueId(),
- "secret": node.GetSecret(),
- "status": statusMap,
+ "id": node.GetId(),
+ "clusterId": node.GetClusterId(),
+ "name": node.GetName(),
+ "isOn": node.GetIsOn(),
+ "isUp": node.GetIsUp(),
+ "isInstalled": node.GetIsInstalled(),
+ "isActive": node.GetIsActive(),
+ "installDir": node.GetInstallDir(),
+ "uniqueId": node.GetUniqueId(),
+ "secret": node.GetSecret(),
+ "status": statusMap,
"installStatus": installStatusMap,
- "region": nil,
- "login": nil,
- "apiNodeAddrs": []string{},
+ "region": nil,
+ "login": nil,
+ "apiNodeAddrs": []string{},
"cluster": maps.Map{
"id": node.GetClusterId(),
"installDir": node.GetInstallDir(),
@@ -227,21 +305,21 @@ func decodeNodeStatus(raw []byte) maps.Map {
cpuText := fmt.Sprintf("%.2f%%", status.CPUUsage*100)
memText := fmt.Sprintf("%.2f%%", status.MemoryUsage*100)
return maps.Map{
- "isActive": status.IsActive,
- "updatedAt": status.UpdatedAt,
- "hostname": status.Hostname,
- "hostIP": status.HostIP,
- "cpuUsage": status.CPUUsage,
- "cpuUsageText": cpuText,
- "memUsage": status.MemoryUsage,
- "memUsageText": memText,
- "load1m": status.Load1m,
- "load5m": status.Load5m,
- "load15m": status.Load15m,
- "buildVersion": status.BuildVersion,
+ "isActive": status.IsActive,
+ "updatedAt": status.UpdatedAt,
+ "hostname": status.Hostname,
+ "hostIP": status.HostIP,
+ "cpuUsage": status.CPUUsage,
+ "cpuUsageText": cpuText,
+ "memUsage": status.MemoryUsage,
+ "memUsageText": memText,
+ "load1m": status.Load1m,
+ "load5m": status.Load5m,
+ "load15m": status.Load15m,
+ "buildVersion": status.BuildVersion,
"cpuPhysicalCount": status.CPUPhysicalCount,
- "cpuLogicalCount": status.CPULogicalCount,
- "exePath": status.ExePath,
+ "cpuLogicalCount": status.CPULogicalCount,
+ "exePath": status.ExePath,
}
}
diff --git a/EdgeAdmin/internal/web/actions/default/httpdns/clusters/upgradeRemote.go b/EdgeAdmin/internal/web/actions/default/httpdns/clusters/upgradeRemote.go
index ba99390..846151f 100644
--- a/EdgeAdmin/internal/web/actions/default/httpdns/clusters/upgradeRemote.go
+++ b/EdgeAdmin/internal/web/actions/default/httpdns/clusters/upgradeRemote.go
@@ -1,16 +1,108 @@
package clusters
-import "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
+import (
+ "encoding/json"
+ "strings"
+
+ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
+ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/httpdns/httpdnsutils"
+ "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
+ "github.com/iwind/TeaGo/actions"
+ "github.com/iwind/TeaGo/maps"
+)
type UpgradeRemoteAction struct {
actionutils.ParentAction
}
+func (this *UpgradeRemoteAction) Init() {
+ this.Nav("httpdns", "cluster", "index")
+}
+
func (this *UpgradeRemoteAction) RunGet(params struct {
NodeId int64
ClusterId int64
}) {
- this.Data["nodeId"] = params.NodeId
+ httpdnsutils.AddLeftMenu(this.Parent())
+
+ cluster, err := findClusterMap(this.Parent(), params.ClusterId)
+ if err != nil {
+ this.ErrorPage(err)
+ return
+ }
+ httpdnsutils.AddClusterTabbar(this.Parent(), cluster.GetString("name"), params.ClusterId, "node")
+
this.Data["clusterId"] = params.ClusterId
+ this.Data["cluster"] = cluster
+
+ resp, err := this.RPC().HTTPDNSNodeRPC().FindAllUpgradeHTTPDNSNodesWithClusterId(this.AdminContext(), &pb.FindAllUpgradeHTTPDNSNodesWithClusterIdRequest{
+ ClusterId: params.ClusterId,
+ })
+ if err != nil {
+ this.ErrorPage(err)
+ return
+ }
+
+ nodes := make([]maps.Map, 0, len(resp.GetNodes()))
+ for _, upgradeNode := range resp.GetNodes() {
+ node := upgradeNode.Node
+ if node == nil {
+ continue
+ }
+
+ loginParams := maps.Map{}
+ if node.GetNodeLogin() != nil && len(node.GetNodeLogin().GetParams()) > 0 {
+ _ = json.Unmarshal(node.GetNodeLogin().GetParams(), &loginParams)
+ }
+
+ status := decodeNodeStatus(node.GetStatusJSON())
+ accessIP := strings.TrimSpace(status.GetString("hostIP"))
+ if len(accessIP) == 0 {
+ accessIP = strings.TrimSpace(node.GetName())
+ }
+
+ nodes = append(nodes, maps.Map{
+ "id": node.GetId(),
+ "name": node.GetName(),
+ "accessIP": accessIP,
+ "oldVersion": upgradeNode.OldVersion,
+ "newVersion": upgradeNode.NewVersion,
+ "login": node.GetNodeLogin(),
+ "loginParams": loginParams,
+ "installStatus": decodeUpgradeInstallStatus(node.GetInstallStatusJSON()),
+ })
+ }
+ this.Data["nodes"] = nodes
this.Show()
}
+
+func (this *UpgradeRemoteAction) RunPost(params struct {
+ NodeId int64
+
+ Must *actions.Must
+}) {
+ _, err := this.RPC().HTTPDNSNodeRPC().UpgradeHTTPDNSNode(this.AdminContext(), &pb.UpgradeHTTPDNSNodeRequest{
+ NodeId: params.NodeId,
+ })
+ if err != nil {
+ this.ErrorPage(err)
+ return
+ }
+ this.Success()
+}
+
+func decodeUpgradeInstallStatus(raw []byte) maps.Map {
+ result := maps.Map{
+ "isRunning": false,
+ "isFinished": false,
+ "isOk": false,
+ "error": "",
+ "errorCode": "",
+ }
+ if len(raw) == 0 {
+ return result
+ }
+
+ _ = json.Unmarshal(raw, &result)
+ return result
+}
diff --git a/EdgeAdmin/internal/web/actions/default/httpdns/clusters/upgradeStatus.go b/EdgeAdmin/internal/web/actions/default/httpdns/clusters/upgradeStatus.go
new file mode 100644
index 0000000..5635d2e
--- /dev/null
+++ b/EdgeAdmin/internal/web/actions/default/httpdns/clusters/upgradeStatus.go
@@ -0,0 +1,48 @@
+package clusters
+
+import (
+ "encoding/json"
+
+ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
+ "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
+)
+
+type UpgradeStatusAction struct {
+ actionutils.ParentAction
+}
+
+func (this *UpgradeStatusAction) RunPost(params struct {
+ NodeId int64
+}) {
+ resp, err := this.RPC().HTTPDNSNodeRPC().FindHTTPDNSNode(this.AdminContext(), &pb.FindHTTPDNSNodeRequest{
+ NodeId: params.NodeId,
+ })
+ if err != nil {
+ this.ErrorPage(err)
+ return
+ }
+ if resp.GetNode() == nil {
+ this.Data["status"] = nil
+ this.Success()
+ return
+ }
+
+ this.Data["status"] = decodeUpgradeInstallStatusMap(resp.GetNode().GetInstallStatusJSON())
+ this.Success()
+}
+
+func decodeUpgradeInstallStatusMap(raw []byte) map[string]interface{} {
+ result := map[string]interface{}{
+ "isRunning": false,
+ "isFinished": false,
+ "isOk": false,
+ "error": "",
+ "errorCode": "",
+ }
+ if len(raw) == 0 {
+ return result
+ }
+
+ _ = json.Unmarshal(raw, &result)
+ return result
+}
diff --git a/EdgeAdmin/internal/web/actions/default/settings/settingutils/helper.go b/EdgeAdmin/internal/web/actions/default/settings/settingutils/helper.go
index be3299c..083fae6 100644
--- a/EdgeAdmin/internal/web/actions/default/settings/settingutils/helper.go
+++ b/EdgeAdmin/internal/web/actions/default/settings/settingutils/helper.go
@@ -39,6 +39,7 @@ func (this *Helper) BeforeAction(actionPtr actions.ActionWrapper) (goNext bool)
if configloaders.AllowModule(adminId, configloaders.AdminModuleCodeSetting) {
tabbar.Add(this.Lang(actionPtr, codes.AdminSetting_TabAdminServer), "", "/settings/server", "", this.tab == "server")
tabbar.Add(this.Lang(actionPtr, codes.AdminSetting_TabAdminUI), "", "/settings/ui", "", this.tab == "ui")
+ tabbar.Add("升级设置", "", "/settings/upgrade", "", this.tab == "upgrade")
tabbar.Add(this.Lang(actionPtr, codes.AdminSetting_TabAdminSecuritySettings), "", "/settings/security", "", this.tab == "security")
if teaconst.IsPlus {
tabbar.Add(this.Lang(actionPtr, codes.AdminSetting_TabIPLibrary), "", "/settings/ip-library", "", this.tab == "ipLibrary")
diff --git a/EdgeAdmin/internal/web/actions/default/settings/settingutils/helper_plus.go b/EdgeAdmin/internal/web/actions/default/settings/settingutils/helper_plus.go
index 5f10787..131a55a 100644
--- a/EdgeAdmin/internal/web/actions/default/settings/settingutils/helper_plus.go
+++ b/EdgeAdmin/internal/web/actions/default/settings/settingutils/helper_plus.go
@@ -42,6 +42,7 @@ func (this *Helper) BeforeAction(actionPtr actions.ActionWrapper) (goNext bool)
if teaconst.IsPlus {
tabbar.Add(this.Lang(actionPtr, codes.AdminSetting_TabUserUI), "", "/settings/user-ui", "", this.tab == "userUI")
}
+ tabbar.Add("升级设置", "", "/settings/upgrade", "", this.tab == "upgrade")
tabbar.Add(this.Lang(actionPtr, codes.AdminSetting_TabAdminSecuritySettings), "", "/settings/security", "", this.tab == "security")
tabbar.Add(this.Lang(actionPtr, codes.AdminSetting_TabIPLibrary), "", "/settings/ip-library", "", this.tab == "ipLibrary")
}
diff --git a/EdgeAdmin/internal/web/actions/default/settings/ui/index.go b/EdgeAdmin/internal/web/actions/default/settings/ui/index.go
index d2de556..f178c8a 100644
--- a/EdgeAdmin/internal/web/actions/default/settings/ui/index.go
+++ b/EdgeAdmin/internal/web/actions/default/settings/ui/index.go
@@ -56,9 +56,6 @@ func (this *IndexAction) RunPost(params struct {
TimeZone string
DnsResolverType string
- SupportModuleCDN bool
- SupportModuleNS bool
-
Must *actions.Must
CSRF *actionutils.CSRF
}) {
@@ -93,13 +90,7 @@ func (this *IndexAction) RunPost(params struct {
config.DefaultPageSize = 10
}
- config.Modules = []userconfigs.UserModule{}
- if params.SupportModuleCDN {
- config.Modules = append(config.Modules, userconfigs.UserModuleCDN)
- }
- if params.SupportModuleNS {
- config.Modules = append(config.Modules, userconfigs.UserModuleNS)
- }
+ config.Modules = []userconfigs.UserModule{userconfigs.UserModuleCDN, userconfigs.UserModuleNS}
// 上传Favicon文件
if params.FaviconFile != nil {
diff --git a/EdgeAdmin/internal/web/actions/default/settings/upgrade/dns_helper_default.go b/EdgeAdmin/internal/web/actions/default/settings/upgrade/dns_helper_default.go
new file mode 100644
index 0000000..9e0c41a
--- /dev/null
+++ b/EdgeAdmin/internal/web/actions/default/settings/upgrade/dns_helper_default.go
@@ -0,0 +1,23 @@
+//go:build !plus
+
+package upgrade
+
+import (
+ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
+ "github.com/iwind/TeaGo/maps"
+)
+
+// loadDNSUpgradeModules 非Plus版本不支持DNS模块
+func loadDNSUpgradeModules(parent *actionutils.ParentAction) []maps.Map {
+ return nil
+}
+
+// upgradeDNSNode 非Plus版本不支持DNS节点升级
+func upgradeDNSNode(parent *actionutils.ParentAction, nodeId int64) error {
+ return nil
+}
+
+// loadDNSNodeStatus 非Plus版本不支持DNS节点状态查询
+func loadDNSNodeStatus(parent *actionutils.ParentAction, nodeIds []int64) []maps.Map {
+ return nil
+}
diff --git a/EdgeAdmin/internal/web/actions/default/settings/upgrade/dns_helper_plus.go b/EdgeAdmin/internal/web/actions/default/settings/upgrade/dns_helper_plus.go
new file mode 100644
index 0000000..653a840
--- /dev/null
+++ b/EdgeAdmin/internal/web/actions/default/settings/upgrade/dns_helper_plus.go
@@ -0,0 +1,100 @@
+//go:build plus
+
+package upgrade
+
+import (
+ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
+ "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
+ "github.com/iwind/TeaGo/maps"
+)
+
+// loadDNSUpgradeModules 加载DNS模块的待升级节点信息
+func loadDNSUpgradeModules(parent *actionutils.ParentAction) []maps.Map {
+ clustersResp, err := parent.RPC().NSClusterRPC().ListNSClusters(parent.AdminContext(), &pb.ListNSClustersRequest{
+ Offset: 0,
+ Size: 10000,
+ })
+ if err != nil {
+ return nil
+ }
+
+ var clusterMaps []maps.Map
+ for _, cluster := range clustersResp.NsClusters {
+ nodesResp, err := parent.RPC().NSNodeRPC().FindAllUpgradeNSNodesWithNSClusterId(parent.AdminContext(), &pb.FindAllUpgradeNSNodesWithNSClusterIdRequest{
+ NsClusterId: cluster.Id,
+ })
+ if err != nil {
+ continue
+ }
+ var nodeMaps []maps.Map
+ for _, nodeUpgrade := range nodesResp.Nodes {
+ if nodeUpgrade.NsNode == nil {
+ continue
+ }
+ installStatusMap := decodeInstallStatusFromPB(nodeUpgrade.NsNode.InstallStatus)
+ accessIP, login, loginParams := decodeNodeAccessInfo(nodeUpgrade.NsNode.StatusJSON, nodeUpgrade.NsNode.NodeLogin, nodeUpgrade.NsNode.Name)
+
+ nodeMaps = append(nodeMaps, maps.Map{
+ "id": nodeUpgrade.NsNode.Id,
+ "name": nodeUpgrade.NsNode.Name,
+ "os": nodeUpgrade.Os,
+ "arch": nodeUpgrade.Arch,
+ "oldVersion": nodeUpgrade.OldVersion,
+ "newVersion": nodeUpgrade.NewVersion,
+ "isOn": nodeUpgrade.NsNode.IsOn,
+ "isUp": nodeUpgrade.NsNode.IsUp,
+ "accessIP": accessIP,
+ "login": login,
+ "loginParams": loginParams,
+ "installStatus": installStatusMap,
+ })
+ }
+ if len(nodeMaps) == 0 {
+ continue
+ }
+ clusterMaps = append(clusterMaps, maps.Map{
+ "id": cluster.Id,
+ "name": cluster.Name,
+ "nodes": nodeMaps,
+ "count": len(nodeMaps),
+ })
+ }
+ return clusterMaps
+}
+
+// upgradeDNSNode 升级DNS节点
+func upgradeDNSNode(parent *actionutils.ParentAction, nodeId int64) error {
+ _, err := parent.RPC().NSNodeRPC().UpgradeNSNode(parent.AdminContext(), &pb.UpgradeNSNodeRequest{
+ NsNodeId: nodeId,
+ })
+ return err
+}
+
+// loadDNSNodeStatus 加载DNS节点安装状态
+func loadDNSNodeStatus(parent *actionutils.ParentAction, nodeIds []int64) []maps.Map {
+ var result []maps.Map
+ for _, nodeId := range nodeIds {
+ resp, err := parent.RPC().NSNodeRPC().FindNSNode(parent.AdminContext(), &pb.FindNSNodeRequest{
+ NsNodeId: nodeId,
+ })
+ if err != nil || resp.NsNode == nil {
+ continue
+ }
+ var installStatusMap maps.Map
+ if resp.NsNode.InstallStatus != nil {
+ installStatusMap = maps.Map{
+ "isRunning": resp.NsNode.InstallStatus.IsRunning,
+ "isFinished": resp.NsNode.InstallStatus.IsFinished,
+ "isOk": resp.NsNode.InstallStatus.IsOk,
+ "error": resp.NsNode.InstallStatus.Error,
+ "errorCode": resp.NsNode.InstallStatus.ErrorCode,
+ "updatedAt": resp.NsNode.InstallStatus.UpdatedAt,
+ }
+ }
+ result = append(result, maps.Map{
+ "id": nodeId,
+ "installStatus": installStatusMap,
+ })
+ }
+ return result
+}
diff --git a/EdgeAdmin/internal/web/actions/default/settings/upgrade/index.go b/EdgeAdmin/internal/web/actions/default/settings/upgrade/index.go
index 66ca047..6997fc8 100644
--- a/EdgeAdmin/internal/web/actions/default/settings/upgrade/index.go
+++ b/EdgeAdmin/internal/web/actions/default/settings/upgrade/index.go
@@ -1,6 +1,15 @@
package upgrade
-import "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
+import (
+ "encoding/json"
+ "strings"
+
+ "github.com/TeaOSLab/EdgeAdmin/internal/configloaders"
+ teaconst "github.com/TeaOSLab/EdgeAdmin/internal/const"
+ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
+ "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
+ "github.com/iwind/TeaGo/maps"
+)
type IndexAction struct {
actionutils.ParentAction
@@ -11,5 +20,264 @@ func (this *IndexAction) Init() {
}
func (this *IndexAction) RunGet(params struct{}) {
+ // 加载升级配置
+ config, err := configloaders.LoadUpgradeConfig()
+ if err != nil {
+ this.ErrorPage(err)
+ return
+ }
+ this.Data["config"] = config
+
+ // 模块列表
+ modules := []maps.Map{}
+
+ // 1. 边缘节点 (EdgeNode)
+ nodeModule := this.loadEdgeNodeModule()
+ if nodeModule != nil {
+ modules = append(modules, nodeModule)
+ }
+
+ // 2. DNS节点 (EdgeDNS) — 仅Plus版本
+ if teaconst.IsPlus {
+ dnsClusters := loadDNSUpgradeModules(&this.ParentAction)
+ if len(dnsClusters) > 0 {
+ totalCount := 0
+ for _, c := range dnsClusters {
+ totalCount += c.GetInt("count")
+ }
+ modules = append(modules, maps.Map{
+ "name": "DNS节点",
+ "code": "dns",
+ "clusters": dnsClusters,
+ "count": totalCount,
+ })
+ }
+ }
+
+ // 3. HTTPDNS节点
+ httpdnsModule := this.loadHTTPDNSModule()
+ if httpdnsModule != nil {
+ modules = append(modules, httpdnsModule)
+ }
+
+ this.Data["modules"] = modules
+
this.Show()
}
+
+func (this *IndexAction) RunPost(params struct {
+ AutoUpgrade bool
+}) {
+ config, err := configloaders.LoadUpgradeConfig()
+ if err != nil {
+ this.ErrorPage(err)
+ return
+ }
+
+ config.AutoUpgrade = params.AutoUpgrade
+
+ err = configloaders.UpdateUpgradeConfig(config)
+ if err != nil {
+ this.ErrorPage(err)
+ return
+ }
+
+ this.Success()
+}
+
+// loadEdgeNodeModule 加载边缘节点模块的待升级信息
+func (this *IndexAction) loadEdgeNodeModule() maps.Map {
+ // 获取所有集群
+ clustersResp, err := this.RPC().NodeClusterRPC().ListEnabledNodeClusters(this.AdminContext(), &pb.ListEnabledNodeClustersRequest{
+ Offset: 0,
+ Size: 10000,
+ })
+ if err != nil {
+ return nil
+ }
+
+ var clusterMaps []maps.Map
+ totalCount := 0
+ for _, cluster := range clustersResp.NodeClusters {
+ resp, err := this.RPC().NodeRPC().FindAllUpgradeNodesWithNodeClusterId(this.AdminContext(), &pb.FindAllUpgradeNodesWithNodeClusterIdRequest{
+ NodeClusterId: cluster.Id,
+ })
+ if err != nil {
+ continue
+ }
+ if len(resp.Nodes) == 0 {
+ continue
+ }
+
+ var nodeMaps []maps.Map
+ for _, nodeUpgrade := range resp.Nodes {
+ if nodeUpgrade.Node == nil {
+ continue
+ }
+ installStatusMap := decodeInstallStatusFromPB(nodeUpgrade.Node.InstallStatus)
+ accessIP, login, loginParams := decodeNodeAccessInfo(nodeUpgrade.Node.StatusJSON, nodeUpgrade.Node.NodeLogin, nodeUpgrade.Node.Name)
+
+ nodeMaps = append(nodeMaps, maps.Map{
+ "id": nodeUpgrade.Node.Id,
+ "name": nodeUpgrade.Node.Name,
+ "os": nodeUpgrade.Os,
+ "arch": nodeUpgrade.Arch,
+ "oldVersion": nodeUpgrade.OldVersion,
+ "newVersion": nodeUpgrade.NewVersion,
+ "isOn": nodeUpgrade.Node.IsOn,
+ "isUp": nodeUpgrade.Node.IsUp,
+ "accessIP": accessIP,
+ "login": login,
+ "loginParams": loginParams,
+ "installStatus": installStatusMap,
+ })
+ }
+ totalCount += len(nodeMaps)
+ clusterMaps = append(clusterMaps, maps.Map{
+ "id": cluster.Id,
+ "name": cluster.Name,
+ "nodes": nodeMaps,
+ "count": len(nodeMaps),
+ })
+ }
+
+ if len(clusterMaps) == 0 {
+ return nil
+ }
+
+ return maps.Map{
+ "name": "边缘节点",
+ "code": "node",
+ "clusters": clusterMaps,
+ "count": totalCount,
+ }
+}
+
+// loadHTTPDNSModule 加载HTTPDNS模块的待升级信息
+func (this *IndexAction) loadHTTPDNSModule() maps.Map {
+ clustersResp, err := this.RPC().HTTPDNSClusterRPC().ListHTTPDNSClusters(this.AdminContext(), &pb.ListHTTPDNSClustersRequest{
+ Offset: 0,
+ Size: 10000,
+ })
+ if err != nil {
+ return nil
+ }
+
+ var clusterMaps []maps.Map
+ totalCount := 0
+ for _, cluster := range clustersResp.Clusters {
+ resp, err := this.RPC().HTTPDNSNodeRPC().FindAllUpgradeHTTPDNSNodesWithClusterId(this.AdminContext(), &pb.FindAllUpgradeHTTPDNSNodesWithClusterIdRequest{
+ ClusterId: cluster.Id,
+ })
+ if err != nil {
+ continue
+ }
+ if len(resp.Nodes) == 0 {
+ continue
+ }
+
+ var nodeMaps []maps.Map
+ for _, nodeUpgrade := range resp.Nodes {
+ if nodeUpgrade.Node == nil {
+ continue
+ }
+ installStatusMap := decodeInstallStatusFromJSON(nodeUpgrade.Node.InstallStatusJSON)
+ accessIP, login, loginParams := decodeNodeAccessInfo(nodeUpgrade.Node.StatusJSON, nodeUpgrade.Node.NodeLogin, nodeUpgrade.Node.Name)
+
+ nodeMaps = append(nodeMaps, maps.Map{
+ "id": nodeUpgrade.Node.Id,
+ "name": nodeUpgrade.Node.Name,
+ "os": nodeUpgrade.Os,
+ "arch": nodeUpgrade.Arch,
+ "oldVersion": nodeUpgrade.OldVersion,
+ "newVersion": nodeUpgrade.NewVersion,
+ "isOn": nodeUpgrade.Node.IsOn,
+ "isUp": nodeUpgrade.Node.IsUp,
+ "accessIP": accessIP,
+ "login": login,
+ "loginParams": loginParams,
+ "installStatus": installStatusMap,
+ })
+ }
+ totalCount += len(nodeMaps)
+ clusterMaps = append(clusterMaps, maps.Map{
+ "id": cluster.Id,
+ "name": cluster.Name,
+ "nodes": nodeMaps,
+ "count": len(nodeMaps),
+ })
+ }
+
+ if len(clusterMaps) == 0 {
+ return nil
+ }
+
+ return maps.Map{
+ "name": "HTTPDNS节点",
+ "code": "httpdns",
+ "clusters": clusterMaps,
+ "count": totalCount,
+ }
+}
+
+// decodeInstallStatusFromPB 从 protobuf InstallStatus 解码安装状态
+func decodeInstallStatusFromPB(status *pb.NodeInstallStatus) maps.Map {
+ if status == nil {
+ return nil
+ }
+ // 历史成功状态,在待升级列表中忽略
+ if status.IsFinished && status.IsOk {
+ return nil
+ }
+ return maps.Map{
+ "isRunning": status.IsRunning,
+ "isFinished": status.IsFinished,
+ "isOk": status.IsOk,
+ "error": status.Error,
+ "errorCode": status.ErrorCode,
+ "updatedAt": status.UpdatedAt,
+ }
+}
+
+// decodeInstallStatusFromJSON 从 JSON 字节解码安装状态
+func decodeInstallStatusFromJSON(raw []byte) maps.Map {
+ if len(raw) == 0 {
+ return nil
+ }
+ result := maps.Map{}
+ _ = json.Unmarshal(raw, &result)
+
+ isFinished, _ := result["isFinished"].(bool)
+ isOk, _ := result["isOk"].(bool)
+ if isFinished && isOk {
+ return nil
+ }
+ return result
+}
+
+// decodeNodeAccessInfo 从节点状态和登录信息中提取 accessIP、login、loginParams
+func decodeNodeAccessInfo(statusJSON []byte, nodeLogin *pb.NodeLogin, nodeName string) (accessIP string, login maps.Map, loginParams maps.Map) {
+ // 从 statusJSON 中提取 hostIP 作为 accessIP
+ if len(statusJSON) > 0 {
+ statusMap := maps.Map{}
+ _ = json.Unmarshal(statusJSON, &statusMap)
+ accessIP = strings.TrimSpace(statusMap.GetString("hostIP"))
+ }
+ if len(accessIP) == 0 {
+ accessIP = strings.TrimSpace(nodeName)
+ }
+
+ // 解码 login 信息
+ if nodeLogin != nil {
+ login = maps.Map{
+ "id": nodeLogin.Id,
+ "name": nodeLogin.Name,
+ "type": nodeLogin.Type,
+ }
+ if len(nodeLogin.Params) > 0 {
+ loginParams = maps.Map{}
+ _ = json.Unmarshal(nodeLogin.Params, &loginParams)
+ }
+ }
+ return
+}
diff --git a/EdgeAdmin/internal/web/actions/default/settings/upgrade/init.go b/EdgeAdmin/internal/web/actions/default/settings/upgrade/init.go
index c495cad..322e7cb 100644
--- a/EdgeAdmin/internal/web/actions/default/settings/upgrade/init.go
+++ b/EdgeAdmin/internal/web/actions/default/settings/upgrade/init.go
@@ -13,7 +13,9 @@ func init() {
Helper(helpers.NewUserMustAuth(configloaders.AdminModuleCodeSetting)).
Helper(settingutils.NewHelper("upgrade")).
Prefix("/settings/upgrade").
- Get("", new(IndexAction)).
+ GetPost("", new(IndexAction)).
+ Post("/upgradeNode", new(UpgradeNodeAction)).
+ Post("/status", new(StatusAction)).
EndAll()
})
}
diff --git a/EdgeAdmin/internal/web/actions/default/settings/upgrade/status.go b/EdgeAdmin/internal/web/actions/default/settings/upgrade/status.go
new file mode 100644
index 0000000..67617a6
--- /dev/null
+++ b/EdgeAdmin/internal/web/actions/default/settings/upgrade/status.go
@@ -0,0 +1,80 @@
+package upgrade
+
+import (
+ "encoding/json"
+
+ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
+ "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
+ "github.com/iwind/TeaGo/maps"
+)
+
+type StatusAction struct {
+ actionutils.ParentAction
+}
+
+func (this *StatusAction) RunPost(params struct {
+ NodeIdsJSON []byte // JSON: {"node": [1,2], "dns": [3], "httpdns": [4,5]}
+}) {
+ var nodeIdsMap map[string][]int64
+ if len(params.NodeIdsJSON) > 0 {
+ _ = json.Unmarshal(params.NodeIdsJSON, &nodeIdsMap)
+ }
+
+ result := maps.Map{}
+
+ // EdgeNode 状态
+ if nodeIds, ok := nodeIdsMap["node"]; ok && len(nodeIds) > 0 {
+ var nodeStatuses []maps.Map
+ for _, nodeId := range nodeIds {
+ resp, err := this.RPC().NodeRPC().FindEnabledNode(this.AdminContext(), &pb.FindEnabledNodeRequest{NodeId: nodeId})
+ if err != nil || resp.Node == nil {
+ continue
+ }
+ var installStatusMap maps.Map
+ if resp.Node.InstallStatus != nil {
+ installStatusMap = maps.Map{
+ "isRunning": resp.Node.InstallStatus.IsRunning,
+ "isFinished": resp.Node.InstallStatus.IsFinished,
+ "isOk": resp.Node.InstallStatus.IsOk,
+ "error": resp.Node.InstallStatus.Error,
+ "errorCode": resp.Node.InstallStatus.ErrorCode,
+ "updatedAt": resp.Node.InstallStatus.UpdatedAt,
+ }
+ }
+ nodeStatuses = append(nodeStatuses, maps.Map{
+ "id": nodeId,
+ "installStatus": installStatusMap,
+ })
+ }
+ result["node"] = nodeStatuses
+ }
+
+ // DNS 状态
+ if nodeIds, ok := nodeIdsMap["dns"]; ok && len(nodeIds) > 0 {
+ result["dns"] = loadDNSNodeStatus(&this.ParentAction, nodeIds)
+ }
+
+ // HTTPDNS 状态
+ if nodeIds, ok := nodeIdsMap["httpdns"]; ok && len(nodeIds) > 0 {
+ var nodeStatuses []maps.Map
+ for _, nodeId := range nodeIds {
+ resp, err := this.RPC().HTTPDNSNodeRPC().FindHTTPDNSNode(this.AdminContext(), &pb.FindHTTPDNSNodeRequest{NodeId: nodeId})
+ if err != nil || resp.Node == nil {
+ continue
+ }
+ var installStatusMap maps.Map
+ if len(resp.Node.InstallStatusJSON) > 0 {
+ installStatusMap = maps.Map{}
+ _ = json.Unmarshal(resp.Node.InstallStatusJSON, &installStatusMap)
+ }
+ nodeStatuses = append(nodeStatuses, maps.Map{
+ "id": nodeId,
+ "installStatus": installStatusMap,
+ })
+ }
+ result["httpdns"] = nodeStatuses
+ }
+
+ this.Data["statuses"] = result
+ this.Success()
+}
diff --git a/EdgeAdmin/internal/web/actions/default/settings/upgrade/upgradeNode.go b/EdgeAdmin/internal/web/actions/default/settings/upgrade/upgradeNode.go
new file mode 100644
index 0000000..8bd7d78
--- /dev/null
+++ b/EdgeAdmin/internal/web/actions/default/settings/upgrade/upgradeNode.go
@@ -0,0 +1,150 @@
+package upgrade
+
+import (
+ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
+ "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
+ "github.com/iwind/TeaGo/maps"
+)
+
+type UpgradeNodeAction struct {
+ actionutils.ParentAction
+}
+
+func (this *UpgradeNodeAction) RunPost(params struct {
+ Module string // node, dns, httpdns
+ Scope string // all, module, cluster, node
+ ClusterId int64
+ NodeId int64
+}) {
+ switch params.Scope {
+ case "node":
+ err := this.upgradeSingleNode(params.Module, params.NodeId)
+ if err != nil {
+ this.ErrorPage(err)
+ return
+ }
+ case "cluster":
+ err := this.upgradeCluster(params.Module, params.ClusterId)
+ if err != nil {
+ this.ErrorPage(err)
+ return
+ }
+ case "module":
+ err := this.upgradeModule(params.Module)
+ if err != nil {
+ this.ErrorPage(err)
+ return
+ }
+ case "all":
+ _ = this.upgradeModule("node")
+ _ = this.upgradeModule("dns")
+ _ = this.upgradeModule("httpdns")
+ }
+
+ this.Success()
+}
+
+func (this *UpgradeNodeAction) upgradeSingleNode(module string, nodeId int64) error {
+ switch module {
+ case "node":
+ _, err := this.RPC().NodeRPC().UpgradeNode(this.AdminContext(), &pb.UpgradeNodeRequest{NodeId: nodeId})
+ return err
+ case "dns":
+ return upgradeDNSNode(&this.ParentAction, nodeId)
+ case "httpdns":
+ _, err := this.RPC().HTTPDNSNodeRPC().UpgradeHTTPDNSNode(this.AdminContext(), &pb.UpgradeHTTPDNSNodeRequest{NodeId: nodeId})
+ return err
+ }
+ return nil
+}
+
+func (this *UpgradeNodeAction) upgradeCluster(module string, clusterId int64) error {
+ switch module {
+ case "node":
+ resp, err := this.RPC().NodeRPC().FindAllUpgradeNodesWithNodeClusterId(this.AdminContext(), &pb.FindAllUpgradeNodesWithNodeClusterIdRequest{
+ NodeClusterId: clusterId,
+ })
+ if err != nil {
+ return err
+ }
+ for _, nodeUpgrade := range resp.Nodes {
+ if nodeUpgrade.Node == nil {
+ continue
+ }
+ _, _ = this.RPC().NodeRPC().UpgradeNode(this.AdminContext(), &pb.UpgradeNodeRequest{NodeId: nodeUpgrade.Node.Id})
+ }
+ case "dns":
+ this.upgradeDNSCluster(clusterId)
+ case "httpdns":
+ resp, err := this.RPC().HTTPDNSNodeRPC().FindAllUpgradeHTTPDNSNodesWithClusterId(this.AdminContext(), &pb.FindAllUpgradeHTTPDNSNodesWithClusterIdRequest{
+ ClusterId: clusterId,
+ })
+ if err != nil {
+ return err
+ }
+ for _, nodeUpgrade := range resp.Nodes {
+ if nodeUpgrade.Node == nil {
+ continue
+ }
+ _, _ = this.RPC().HTTPDNSNodeRPC().UpgradeHTTPDNSNode(this.AdminContext(), &pb.UpgradeHTTPDNSNodeRequest{NodeId: nodeUpgrade.Node.Id})
+ }
+ }
+ return nil
+}
+
+func (this *UpgradeNodeAction) upgradeModule(module string) error {
+ switch module {
+ case "node":
+ clustersResp, err := this.RPC().NodeClusterRPC().ListEnabledNodeClusters(this.AdminContext(), &pb.ListEnabledNodeClustersRequest{
+ Offset: 0,
+ Size: 10000,
+ })
+ if err != nil {
+ return err
+ }
+ for _, cluster := range clustersResp.NodeClusters {
+ _ = this.upgradeCluster("node", cluster.Id)
+ }
+ case "dns":
+ dnsClusters := loadDNSUpgradeModules(&this.ParentAction)
+ for _, c := range dnsClusters {
+ this.upgradeDNSClusterFromMap(c)
+ }
+ case "httpdns":
+ clustersResp, err := this.RPC().HTTPDNSClusterRPC().ListHTTPDNSClusters(this.AdminContext(), &pb.ListHTTPDNSClustersRequest{
+ Offset: 0,
+ Size: 10000,
+ })
+ if err != nil {
+ return err
+ }
+ for _, cluster := range clustersResp.Clusters {
+ _ = this.upgradeCluster("httpdns", cluster.Id)
+ }
+ }
+ return nil
+}
+
+// upgradeDNSCluster 根据集群ID升级DNS节点
+func (this *UpgradeNodeAction) upgradeDNSCluster(clusterId int64) {
+ dnsClusters := loadDNSUpgradeModules(&this.ParentAction)
+ for _, c := range dnsClusters {
+ if c.GetInt64("id") == clusterId {
+ this.upgradeDNSClusterFromMap(c)
+ break
+ }
+ }
+}
+
+// upgradeDNSClusterFromMap 从maps.Map中提取节点ID并升级
+func (this *UpgradeNodeAction) upgradeDNSClusterFromMap(c maps.Map) {
+ nodesVal := c.Get("nodes")
+ if nodeMaps, ok := nodesVal.([]maps.Map); ok {
+ for _, n := range nodeMaps {
+ nodeId := n.GetInt64("id")
+ if nodeId > 0 {
+ _ = upgradeDNSNode(&this.ParentAction, nodeId)
+ }
+ }
+ }
+}
diff --git a/EdgeAdmin/internal/web/actions/default/users/createPopup.go b/EdgeAdmin/internal/web/actions/default/users/createPopup.go
index 40da64f..54b3ef9 100644
--- a/EdgeAdmin/internal/web/actions/default/users/createPopup.go
+++ b/EdgeAdmin/internal/web/actions/default/users/createPopup.go
@@ -25,20 +25,16 @@ func (this *CreatePopupAction) Init() {
func (this *CreatePopupAction) RunGet(params struct{}) {
// 检查是否启用了 HTTPDNS 功能(全局用户注册设置中)
var hasHTTPDNSFeature = false
- var defaultHttpdnsClusterId int64 = 0
resp, err := this.RPC().SysSettingRPC().ReadSysSetting(this.AdminContext(), &pb.ReadSysSettingRequest{Code: systemconfigs.SettingCodeUserRegisterConfig})
if err == nil && len(resp.ValueJSON) > 0 {
var config = userconfigs.DefaultUserRegisterConfig()
if json.Unmarshal(resp.ValueJSON, config) == nil {
hasHTTPDNSFeature = config.HTTPDNSIsOn
- if len(config.HTTPDNSDefaultClusterIds) > 0 {
- defaultHttpdnsClusterId = config.HTTPDNSDefaultClusterIds[0]
- }
}
}
this.Data["hasHTTPDNSFeature"] = hasHTTPDNSFeature
- this.Data["httpdnsClusterId"] = defaultHttpdnsClusterId
+ this.Data["httpdnsClusterId"] = 0
// 加载所有 HTTPDNS 集群
var httpdnsClusters = []maps.Map{}
diff --git a/EdgeAdmin/web/public/js/components.js b/EdgeAdmin/web/public/js/components.js
index 11d2339..e333e92 100644
--- a/EdgeAdmin/web/public/js/components.js
+++ b/EdgeAdmin/web/public/js/components.js
@@ -22046,15 +22046,16 @@ Vue.component("ssl-certs-box", {
{{description}}
-
+
选择已有证书
- |
+ |
上传新证书
批量上传证书
`
})
+
Vue.component("ssl-certs-view", {
props: ["v-certs"],
data: function () {
@@ -22518,12 +22519,16 @@ Vue.component("ssl-config-box", {
选择或上传证书后HTTPS TLS 服务才能生效。
- 选择已有证书
- |
- 上传新证书
- 批量上传证书
- |
- 申请免费证书
+
+ 选择已有证书
+ |
+ 上传新证书
+ 批量上传证书
+
+ |
+ 申请免费证书
+
+
diff --git a/EdgeAdmin/web/public/js/components.src.js b/EdgeAdmin/web/public/js/components.src.js
index 11d2339..e333e92 100644
--- a/EdgeAdmin/web/public/js/components.src.js
+++ b/EdgeAdmin/web/public/js/components.src.js
@@ -22046,15 +22046,16 @@ Vue.component("ssl-certs-box", {
{{description}}
-
+
选择已有证书
- |
+ |
上传新证书
批量上传证书
`
})
+
Vue.component("ssl-certs-view", {
props: ["v-certs"],
data: function () {
@@ -22518,12 +22519,16 @@ Vue.component("ssl-config-box", {
选择或上传证书后HTTPS TLS 服务才能生效。
- 选择已有证书
- |
- 上传新证书
- 批量上传证书
- |
- 申请免费证书
+
+ 选择已有证书
+ |
+ 上传新证书
+ 批量上传证书
+
+ |
+ 申请免费证书
+
+
diff --git a/EdgeAdmin/web/public/js/components/server/ssl-certs-box.js b/EdgeAdmin/web/public/js/components/server/ssl-certs-box.js
index 04846c0..51ac768 100644
--- a/EdgeAdmin/web/public/js/components/server/ssl-certs-box.js
+++ b/EdgeAdmin/web/public/js/components/server/ssl-certs-box.js
@@ -160,11 +160,11 @@ Vue.component("ssl-certs-box", {
{{description}}
-
+
选择已有证书
- |
+ |
上传新证书
批量上传证书
`
-})
\ No newline at end of file
+})
diff --git a/EdgeAdmin/web/public/js/components/server/ssl-config-box.js b/EdgeAdmin/web/public/js/components/server/ssl-config-box.js
index e1cf825..786879b 100644
--- a/EdgeAdmin/web/public/js/components/server/ssl-config-box.js
+++ b/EdgeAdmin/web/public/js/components/server/ssl-config-box.js
@@ -427,12 +427,16 @@ Vue.component("ssl-config-box", {
选择或上传证书后HTTPS TLS 服务才能生效。
- 选择已有证书
- |
- 上传新证书
- 批量上传证书
- |
- 申请免费证书
+
+ 选择已有证书
+ |
+ 上传新证书
+ 批量上传证书
+
+ |
+ 申请免费证书
+
+
diff --git a/EdgeAdmin/web/public/js/sweetalert2/dist/sweetalert2.css b/EdgeAdmin/web/public/js/sweetalert2/dist/sweetalert2.css
index 380c5b1..5527431 100644
--- a/EdgeAdmin/web/public/js/sweetalert2/dist/sweetalert2.css
+++ b/EdgeAdmin/web/public/js/sweetalert2/dist/sweetalert2.css
@@ -7,78 +7,96 @@
background: #fff;
box-shadow: 0 0 0.625em #d9d9d9;
}
+
.swal2-popup.swal2-toast .swal2-header {
flex-direction: row;
}
+
.swal2-popup.swal2-toast .swal2-title {
flex-grow: 1;
justify-content: flex-start;
margin: 0 0.6em;
font-size: 1em;
}
+
.swal2-popup.swal2-toast .swal2-footer {
margin: 0.5em 0 0;
padding: 0.5em 0 0;
font-size: 0.8em;
}
+
.swal2-popup.swal2-toast .swal2-close {
position: static;
width: 0.8em;
height: 0.8em;
line-height: 0.8;
}
+
.swal2-popup.swal2-toast .swal2-content {
justify-content: flex-start;
font-size: 1em;
}
+
.swal2-popup.swal2-toast .swal2-icon {
width: 2em;
min-width: 2em;
height: 2em;
margin: 0;
}
+
.swal2-popup.swal2-toast .swal2-icon .swal2-icon-content {
display: flex;
align-items: center;
font-size: 1.8em;
font-weight: bold;
}
-@media all and (-ms-high-contrast: none), (-ms-high-contrast: active) {
+
+@media all and (-ms-high-contrast: none),
+(-ms-high-contrast: active) {
.swal2-popup.swal2-toast .swal2-icon .swal2-icon-content {
font-size: 0.25em;
}
}
+
.swal2-popup.swal2-toast .swal2-icon.swal2-success .swal2-success-ring {
width: 2em;
height: 2em;
}
+
.swal2-popup.swal2-toast .swal2-icon.swal2-error [class^=swal2-x-mark-line] {
top: 0.875em;
width: 1.375em;
}
+
.swal2-popup.swal2-toast .swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=left] {
left: 0.3125em;
}
+
.swal2-popup.swal2-toast .swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=right] {
right: 0.3125em;
}
+
.swal2-popup.swal2-toast .swal2-actions {
flex-basis: auto !important;
width: auto;
height: auto;
margin: 0 0.3125em;
}
+
.swal2-popup.swal2-toast .swal2-styled {
margin: 0 0.3125em;
padding: 0.3125em 0.625em;
font-size: 1em;
}
+
.swal2-popup.swal2-toast .swal2-styled:focus {
box-shadow: 0 0 0 1px #fff, 0 0 0 3px rgba(50, 100, 150, 0.4);
}
+
.swal2-popup.swal2-toast .swal2-success {
border-color: #a5dc86;
}
+
.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-circular-line] {
position: absolute;
width: 1.6em;
@@ -86,6 +104,7 @@
transform: rotate(45deg);
border-radius: 50%;
}
+
.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-circular-line][class$=left] {
top: -0.8em;
left: -0.5em;
@@ -93,50 +112,60 @@
transform-origin: 2em 2em;
border-radius: 4em 0 0 4em;
}
+
.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-circular-line][class$=right] {
top: -0.25em;
left: 0.9375em;
transform-origin: 0 1.5em;
border-radius: 0 4em 4em 0;
}
+
.swal2-popup.swal2-toast .swal2-success .swal2-success-ring {
width: 2em;
height: 2em;
}
+
.swal2-popup.swal2-toast .swal2-success .swal2-success-fix {
top: 0;
left: 0.4375em;
width: 0.4375em;
height: 2.6875em;
}
+
.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-line] {
height: 0.3125em;
}
+
.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-line][class$=tip] {
top: 1.125em;
left: 0.1875em;
width: 0.75em;
}
+
.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-line][class$=long] {
top: 0.9375em;
right: 0.1875em;
width: 1.375em;
}
+
.swal2-popup.swal2-toast .swal2-success.swal2-icon-show .swal2-success-line-tip {
-webkit-animation: swal2-toast-animate-success-line-tip 0.75s;
- animation: swal2-toast-animate-success-line-tip 0.75s;
+ animation: swal2-toast-animate-success-line-tip 0.75s;
}
+
.swal2-popup.swal2-toast .swal2-success.swal2-icon-show .swal2-success-line-long {
-webkit-animation: swal2-toast-animate-success-line-long 0.75s;
- animation: swal2-toast-animate-success-line-long 0.75s;
+ animation: swal2-toast-animate-success-line-long 0.75s;
}
+
.swal2-popup.swal2-toast.swal2-show {
-webkit-animation: swal2-toast-show 0.5s;
- animation: swal2-toast-show 0.5s;
+ animation: swal2-toast-show 0.5s;
}
+
.swal2-popup.swal2-toast.swal2-hide {
-webkit-animation: swal2-toast-hide 0.1s forwards;
- animation: swal2-toast-hide 0.1s forwards;
+ animation: swal2-toast-hide 0.1s forwards;
}
.swal2-container {
@@ -155,86 +184,131 @@
transition: background-color 0.1s;
-webkit-overflow-scrolling: touch;
}
+
.swal2-container.swal2-backdrop-show {
background: rgba(0, 0, 0, 0.4);
}
+
.swal2-container.swal2-backdrop-hide {
background: transparent !important;
}
+
.swal2-container.swal2-top {
align-items: flex-start;
}
-.swal2-container.swal2-top-start, .swal2-container.swal2-top-left {
+
+.swal2-container.swal2-top-start,
+.swal2-container.swal2-top-left {
align-items: flex-start;
justify-content: flex-start;
}
-.swal2-container.swal2-top-end, .swal2-container.swal2-top-right {
+
+.swal2-container.swal2-top-end,
+.swal2-container.swal2-top-right {
align-items: flex-start;
justify-content: flex-end;
}
+
.swal2-container.swal2-center {
align-items: center;
}
-.swal2-container.swal2-center-start, .swal2-container.swal2-center-left {
+
+.swal2-container.swal2-center-start,
+.swal2-container.swal2-center-left {
align-items: center;
justify-content: flex-start;
}
-.swal2-container.swal2-center-end, .swal2-container.swal2-center-right {
+
+.swal2-container.swal2-center-end,
+.swal2-container.swal2-center-right {
align-items: center;
justify-content: flex-end;
}
+
.swal2-container.swal2-bottom {
align-items: flex-end;
}
-.swal2-container.swal2-bottom-start, .swal2-container.swal2-bottom-left {
+
+.swal2-container.swal2-bottom-start,
+.swal2-container.swal2-bottom-left {
align-items: flex-end;
justify-content: flex-start;
}
-.swal2-container.swal2-bottom-end, .swal2-container.swal2-bottom-right {
+
+.swal2-container.swal2-bottom-end,
+.swal2-container.swal2-bottom-right {
align-items: flex-end;
justify-content: flex-end;
}
-.swal2-container.swal2-bottom > :first-child, .swal2-container.swal2-bottom-start > :first-child, .swal2-container.swal2-bottom-left > :first-child, .swal2-container.swal2-bottom-end > :first-child, .swal2-container.swal2-bottom-right > :first-child {
+
+.swal2-container.swal2-bottom> :first-child,
+.swal2-container.swal2-bottom-start> :first-child,
+.swal2-container.swal2-bottom-left> :first-child,
+.swal2-container.swal2-bottom-end> :first-child,
+.swal2-container.swal2-bottom-right> :first-child {
margin-top: auto;
}
-.swal2-container.swal2-grow-fullscreen > .swal2-modal {
+
+.swal2-container.swal2-grow-fullscreen>.swal2-modal {
display: flex !important;
flex: 1;
align-self: stretch;
justify-content: center;
}
-.swal2-container.swal2-grow-row > .swal2-modal {
+
+.swal2-container.swal2-grow-row>.swal2-modal {
display: flex !important;
flex: 1;
align-content: center;
justify-content: center;
}
+
.swal2-container.swal2-grow-column {
flex: 1;
flex-direction: column;
}
-.swal2-container.swal2-grow-column.swal2-top, .swal2-container.swal2-grow-column.swal2-center, .swal2-container.swal2-grow-column.swal2-bottom {
+
+.swal2-container.swal2-grow-column.swal2-top,
+.swal2-container.swal2-grow-column.swal2-center,
+.swal2-container.swal2-grow-column.swal2-bottom {
align-items: center;
}
-.swal2-container.swal2-grow-column.swal2-top-start, .swal2-container.swal2-grow-column.swal2-center-start, .swal2-container.swal2-grow-column.swal2-bottom-start, .swal2-container.swal2-grow-column.swal2-top-left, .swal2-container.swal2-grow-column.swal2-center-left, .swal2-container.swal2-grow-column.swal2-bottom-left {
+
+.swal2-container.swal2-grow-column.swal2-top-start,
+.swal2-container.swal2-grow-column.swal2-center-start,
+.swal2-container.swal2-grow-column.swal2-bottom-start,
+.swal2-container.swal2-grow-column.swal2-top-left,
+.swal2-container.swal2-grow-column.swal2-center-left,
+.swal2-container.swal2-grow-column.swal2-bottom-left {
align-items: flex-start;
}
-.swal2-container.swal2-grow-column.swal2-top-end, .swal2-container.swal2-grow-column.swal2-center-end, .swal2-container.swal2-grow-column.swal2-bottom-end, .swal2-container.swal2-grow-column.swal2-top-right, .swal2-container.swal2-grow-column.swal2-center-right, .swal2-container.swal2-grow-column.swal2-bottom-right {
+
+.swal2-container.swal2-grow-column.swal2-top-end,
+.swal2-container.swal2-grow-column.swal2-center-end,
+.swal2-container.swal2-grow-column.swal2-bottom-end,
+.swal2-container.swal2-grow-column.swal2-top-right,
+.swal2-container.swal2-grow-column.swal2-center-right,
+.swal2-container.swal2-grow-column.swal2-bottom-right {
align-items: flex-end;
}
-.swal2-container.swal2-grow-column > .swal2-modal {
+
+.swal2-container.swal2-grow-column>.swal2-modal {
display: flex !important;
flex: 1;
align-content: center;
justify-content: center;
}
+
.swal2-container.swal2-no-transition {
transition: none !important;
}
-.swal2-container:not(.swal2-top):not(.swal2-top-start):not(.swal2-top-end):not(.swal2-top-left):not(.swal2-top-right):not(.swal2-center-start):not(.swal2-center-end):not(.swal2-center-left):not(.swal2-center-right):not(.swal2-bottom):not(.swal2-bottom-start):not(.swal2-bottom-end):not(.swal2-bottom-left):not(.swal2-bottom-right):not(.swal2-grow-fullscreen) > .swal2-modal {
+
+.swal2-container:not(.swal2-top):not(.swal2-top-start):not(.swal2-top-end):not(.swal2-top-left):not(.swal2-top-right):not(.swal2-center-start):not(.swal2-center-end):not(.swal2-center-left):not(.swal2-center-right):not(.swal2-bottom):not(.swal2-bottom-start):not(.swal2-bottom-end):not(.swal2-bottom-left):not(.swal2-bottom-right):not(.swal2-grow-fullscreen)>.swal2-modal {
margin: auto;
}
-@media all and (-ms-high-contrast: none), (-ms-high-contrast: active) {
+
+@media all and (-ms-high-contrast: none),
+(-ms-high-contrast: active) {
.swal2-container .swal2-modal {
margin: 0 !important;
}
@@ -255,9 +329,11 @@
font-family: inherit;
font-size: 1rem;
}
+
.swal2-popup:focus {
outline: none;
}
+
.swal2-popup.swal2-loading {
overflow-y: hidden;
}
@@ -290,15 +366,19 @@
width: 100%;
margin: 1.25em auto 0;
}
+
.swal2-actions:not(.swal2-loading) .swal2-styled[disabled] {
opacity: 0.4;
}
+
.swal2-actions:not(.swal2-loading) .swal2-styled:hover {
background-image: linear-gradient(rgba(0, 0, 0, 0.1), rgba(0, 0, 0, 0.1));
}
+
.swal2-actions:not(.swal2-loading) .swal2-styled:active {
background-image: linear-gradient(rgba(0, 0, 0, 0.2), rgba(0, 0, 0, 0.2));
}
+
.swal2-actions.swal2-loading .swal2-styled.swal2-confirm {
box-sizing: border-box;
width: 2.5em;
@@ -306,7 +386,7 @@
margin: 0.46875em;
padding: 0;
-webkit-animation: swal2-rotate-loading 1.5s linear 0s infinite normal;
- animation: swal2-rotate-loading 1.5s linear 0s infinite normal;
+ animation: swal2-rotate-loading 1.5s linear 0s infinite normal;
border: 0.25em solid transparent;
border-radius: 100%;
border-color: transparent;
@@ -314,14 +394,16 @@
color: transparent;
cursor: default;
-webkit-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
}
+
.swal2-actions.swal2-loading .swal2-styled.swal2-cancel {
margin-right: 30px;
margin-left: 30px;
}
+
.swal2-actions.swal2-loading :not(.swal2-styled).swal2-confirm::after {
content: "";
display: inline-block;
@@ -329,7 +411,7 @@
height: 15px;
margin-left: 5px;
-webkit-animation: swal2-rotate-loading 1.5s linear 0s infinite normal;
- animation: swal2-rotate-loading 1.5s linear 0s infinite normal;
+ animation: swal2-rotate-loading 1.5s linear 0s infinite normal;
border: 3px solid #999999;
border-radius: 50%;
border-right-color: transparent;
@@ -342,9 +424,11 @@
box-shadow: none;
font-weight: 500;
}
+
.swal2-styled:not([disabled]) {
cursor: pointer;
}
+
.swal2-styled.swal2-confirm {
border: 0;
border-radius: 0.25em;
@@ -353,6 +437,7 @@
color: #fff;
font-size: 1.0625em;
}
+
.swal2-styled.swal2-cancel {
border: 0;
border-radius: 0.25em;
@@ -361,10 +446,12 @@
color: #fff;
font-size: 1.0625em;
}
+
.swal2-styled:focus {
outline: none;
box-shadow: 0 0 0 1px #fff, 0 0 0 3px rgba(50, 100, 150, 0.4);
}
+
.swal2-styled::-moz-focus-inner {
border: 0;
}
@@ -423,11 +510,13 @@
line-height: 1.2;
cursor: pointer;
}
+
.swal2-close:hover {
transform: none;
background: transparent;
color: #f27474;
}
+
.swal2-close::-moz-focus-inner {
border: 0;
}
@@ -467,12 +556,14 @@
color: inherit;
font-size: 1.125em;
}
+
.swal2-input.swal2-inputerror,
.swal2-file.swal2-inputerror,
.swal2-textarea.swal2-inputerror {
border-color: #f27474 !important;
box-shadow: 0 0 2px #f27474 !important;
}
+
.swal2-input:focus,
.swal2-file:focus,
.swal2-textarea:focus {
@@ -480,18 +571,31 @@
outline: none;
box-shadow: 0 0 3px #c4e6f5;
}
-.swal2-input::-webkit-input-placeholder, .swal2-file::-webkit-input-placeholder, .swal2-textarea::-webkit-input-placeholder {
+
+.swal2-input::-webkit-input-placeholder,
+.swal2-file::-webkit-input-placeholder,
+.swal2-textarea::-webkit-input-placeholder {
color: #cccccc;
}
-.swal2-input::-moz-placeholder, .swal2-file::-moz-placeholder, .swal2-textarea::-moz-placeholder {
+
+.swal2-input::-moz-placeholder,
+.swal2-file::-moz-placeholder,
+.swal2-textarea::-moz-placeholder {
color: #cccccc;
}
-.swal2-input:-ms-input-placeholder, .swal2-file:-ms-input-placeholder, .swal2-textarea:-ms-input-placeholder {
+
+.swal2-input:-ms-input-placeholder,
+.swal2-file:-ms-input-placeholder,
+.swal2-textarea:-ms-input-placeholder {
color: #cccccc;
}
-.swal2-input::-ms-input-placeholder, .swal2-file::-ms-input-placeholder, .swal2-textarea::-ms-input-placeholder {
+
+.swal2-input::-ms-input-placeholder,
+.swal2-file::-ms-input-placeholder,
+.swal2-textarea::-ms-input-placeholder {
color: #cccccc;
}
+
.swal2-input::placeholder,
.swal2-file::placeholder,
.swal2-textarea::placeholder {
@@ -502,15 +606,18 @@
margin: 1em auto;
background: #fff;
}
+
.swal2-range input {
width: 80%;
}
+
.swal2-range output {
width: 20%;
color: inherit;
font-weight: 600;
text-align: center;
}
+
.swal2-range input,
.swal2-range output {
height: 2.625em;
@@ -523,6 +630,7 @@
height: 2.625em;
padding: 0 0.75em;
}
+
.swal2-input[type=number] {
max-width: 10em;
}
@@ -553,11 +661,13 @@
background: #fff;
color: inherit;
}
+
.swal2-radio label,
.swal2-checkbox label {
margin: 0 0.6em;
font-size: 1.125em;
}
+
.swal2-radio input,
.swal2-checkbox input {
margin: 0 0.4em;
@@ -574,6 +684,7 @@
font-size: 1em;
font-weight: 300;
}
+
.swal2-validation-message::before {
content: "!";
display: inline-block;
@@ -602,23 +713,27 @@
line-height: 5em;
cursor: default;
-webkit-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
}
+
.swal2-icon .swal2-icon-content {
display: flex;
align-items: center;
font-size: 3.75em;
}
+
.swal2-icon.swal2-error {
border-color: #f27474;
color: #f27474;
}
+
.swal2-icon.swal2-error .swal2-x-mark {
position: relative;
flex-grow: 1;
}
+
.swal2-icon.swal2-error [class^=swal2-x-mark-line] {
display: block;
position: absolute;
@@ -628,38 +743,47 @@
border-radius: 0.125em;
background-color: #f27474;
}
+
.swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=left] {
left: 1.0625em;
transform: rotate(45deg);
}
+
.swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=right] {
right: 1em;
transform: rotate(-45deg);
}
+
.swal2-icon.swal2-error.swal2-icon-show {
-webkit-animation: swal2-animate-error-icon 0.5s;
- animation: swal2-animate-error-icon 0.5s;
+ animation: swal2-animate-error-icon 0.5s;
}
+
.swal2-icon.swal2-error.swal2-icon-show .swal2-x-mark {
-webkit-animation: swal2-animate-error-x-mark 0.5s;
- animation: swal2-animate-error-x-mark 0.5s;
+ animation: swal2-animate-error-x-mark 0.5s;
}
+
.swal2-icon.swal2-warning {
border-color: #facea8;
color: #f8bb86;
}
+
.swal2-icon.swal2-info {
border-color: #9de0f6;
color: #3fc3ee;
}
+
.swal2-icon.swal2-question {
border-color: #c9dae1;
color: #87adbd;
}
+
.swal2-icon.swal2-success {
border-color: #a5dc86;
color: #a5dc86;
}
+
.swal2-icon.swal2-success [class^=swal2-success-circular-line] {
position: absolute;
width: 3.75em;
@@ -667,6 +791,7 @@
transform: rotate(45deg);
border-radius: 50%;
}
+
.swal2-icon.swal2-success [class^=swal2-success-circular-line][class$=left] {
top: -0.4375em;
left: -2.0635em;
@@ -674,6 +799,7 @@
transform-origin: 3.75em 3.75em;
border-radius: 7.5em 0 0 7.5em;
}
+
.swal2-icon.swal2-success [class^=swal2-success-circular-line][class$=right] {
top: -0.6875em;
left: 1.875em;
@@ -681,6 +807,7 @@
transform-origin: 0 3.75em;
border-radius: 0 7.5em 7.5em 0;
}
+
.swal2-icon.swal2-success .swal2-success-ring {
position: absolute;
z-index: 2;
@@ -692,6 +819,7 @@
border: 0.25em solid rgba(165, 220, 134, 0.3);
border-radius: 50%;
}
+
.swal2-icon.swal2-success .swal2-success-fix {
position: absolute;
z-index: 1;
@@ -701,6 +829,7 @@
height: 5.625em;
transform: rotate(-45deg);
}
+
.swal2-icon.swal2-success [class^=swal2-success-line] {
display: block;
position: absolute;
@@ -709,29 +838,34 @@
border-radius: 0.125em;
background-color: #a5dc86;
}
+
.swal2-icon.swal2-success [class^=swal2-success-line][class$=tip] {
top: 2.875em;
left: 0.8125em;
width: 1.5625em;
transform: rotate(45deg);
}
+
.swal2-icon.swal2-success [class^=swal2-success-line][class$=long] {
top: 2.375em;
right: 0.5em;
width: 2.9375em;
transform: rotate(-45deg);
}
+
.swal2-icon.swal2-success.swal2-icon-show .swal2-success-line-tip {
-webkit-animation: swal2-animate-success-line-tip 0.75s;
- animation: swal2-animate-success-line-tip 0.75s;
+ animation: swal2-animate-success-line-tip 0.75s;
}
+
.swal2-icon.swal2-success.swal2-icon-show .swal2-success-line-long {
-webkit-animation: swal2-animate-success-line-long 0.75s;
- animation: swal2-animate-success-line-long 0.75s;
+ animation: swal2-animate-success-line-long 0.75s;
}
+
.swal2-icon.swal2-success.swal2-icon-show .swal2-success-circular-line-right {
-webkit-animation: swal2-rotate-success-circular-line 4.25s ease-in;
- animation: swal2-rotate-success-circular-line 4.25s ease-in;
+ animation: swal2-rotate-success-circular-line 4.25s ease-in;
}
.swal2-progress-steps {
@@ -741,10 +875,12 @@
background: inherit;
font-weight: 600;
}
+
.swal2-progress-steps li {
display: inline-block;
position: relative;
}
+
.swal2-progress-steps .swal2-progress-step {
z-index: 20;
width: 2em;
@@ -755,16 +891,20 @@
line-height: 2em;
text-align: center;
}
+
.swal2-progress-steps .swal2-progress-step.swal2-active-progress-step {
background: #3085d6;
}
-.swal2-progress-steps .swal2-progress-step.swal2-active-progress-step ~ .swal2-progress-step {
+
+.swal2-progress-steps .swal2-progress-step.swal2-active-progress-step~.swal2-progress-step {
background: #add8e6;
color: #fff;
}
-.swal2-progress-steps .swal2-progress-step.swal2-active-progress-step ~ .swal2-progress-step-line {
+
+.swal2-progress-steps .swal2-progress-step.swal2-active-progress-step~.swal2-progress-step-line {
background: #add8e6;
}
+
.swal2-progress-steps .swal2-progress-step-line {
z-index: 10;
width: 2.5em;
@@ -779,12 +919,12 @@
.swal2-show {
-webkit-animation: swal2-show 0.3s;
- animation: swal2-show 0.3s;
+ animation: swal2-show 0.3s;
}
.swal2-hide {
-webkit-animation: swal2-hide 0.15s forwards;
- animation: swal2-hide 0.15s forwards;
+ animation: swal2-hide 0.15s forwards;
}
.swal2-noanimation {
@@ -803,6 +943,7 @@
right: auto;
left: 0;
}
+
.swal2-rtl .swal2-timer-progress-bar {
right: 0;
left: auto;
@@ -812,419 +953,509 @@
.swal2-range input {
width: 100% !important;
}
+
.swal2-range output {
display: none;
}
}
-@media all and (-ms-high-contrast: none), (-ms-high-contrast: active) {
+
+@media all and (-ms-high-contrast: none),
+(-ms-high-contrast: active) {
.swal2-range input {
width: 100% !important;
}
+
.swal2-range output {
display: none;
}
}
+
@-moz-document url-prefix() {
.swal2-close:focus {
outline: 2px solid rgba(50, 100, 150, 0.4);
}
}
+
@-webkit-keyframes swal2-toast-show {
0% {
transform: translateY(-0.625em) rotateZ(2deg);
}
+
33% {
transform: translateY(0) rotateZ(-2deg);
}
+
66% {
transform: translateY(0.3125em) rotateZ(2deg);
}
+
100% {
transform: translateY(0) rotateZ(0deg);
}
}
+
@keyframes swal2-toast-show {
0% {
transform: translateY(-0.625em) rotateZ(2deg);
}
+
33% {
transform: translateY(0) rotateZ(-2deg);
}
+
66% {
transform: translateY(0.3125em) rotateZ(2deg);
}
+
100% {
transform: translateY(0) rotateZ(0deg);
}
}
+
@-webkit-keyframes swal2-toast-hide {
100% {
transform: rotateZ(1deg);
opacity: 0;
}
}
+
@keyframes swal2-toast-hide {
100% {
transform: rotateZ(1deg);
opacity: 0;
}
}
+
@-webkit-keyframes swal2-toast-animate-success-line-tip {
0% {
top: 0.5625em;
left: 0.0625em;
width: 0;
}
+
54% {
top: 0.125em;
left: 0.125em;
width: 0;
}
+
70% {
top: 0.625em;
left: -0.25em;
width: 1.625em;
}
+
84% {
top: 1.0625em;
left: 0.75em;
width: 0.5em;
}
+
100% {
top: 1.125em;
left: 0.1875em;
width: 0.75em;
}
}
+
@keyframes swal2-toast-animate-success-line-tip {
0% {
top: 0.5625em;
left: 0.0625em;
width: 0;
}
+
54% {
top: 0.125em;
left: 0.125em;
width: 0;
}
+
70% {
top: 0.625em;
left: -0.25em;
width: 1.625em;
}
+
84% {
top: 1.0625em;
left: 0.75em;
width: 0.5em;
}
+
100% {
top: 1.125em;
left: 0.1875em;
width: 0.75em;
}
}
+
@-webkit-keyframes swal2-toast-animate-success-line-long {
0% {
top: 1.625em;
right: 1.375em;
width: 0;
}
+
65% {
top: 1.25em;
right: 0.9375em;
width: 0;
}
+
84% {
top: 0.9375em;
right: 0;
width: 1.125em;
}
+
100% {
top: 0.9375em;
right: 0.1875em;
width: 1.375em;
}
}
+
@keyframes swal2-toast-animate-success-line-long {
0% {
top: 1.625em;
right: 1.375em;
width: 0;
}
+
65% {
top: 1.25em;
right: 0.9375em;
width: 0;
}
+
84% {
top: 0.9375em;
right: 0;
width: 1.125em;
}
+
100% {
top: 0.9375em;
right: 0.1875em;
width: 1.375em;
}
}
+
@-webkit-keyframes swal2-show {
0% {
transform: scale(0.7);
}
+
45% {
transform: scale(1.05);
}
+
80% {
transform: scale(0.95);
}
+
100% {
transform: scale(1);
}
}
+
@keyframes swal2-show {
0% {
transform: scale(0.7);
}
+
45% {
transform: scale(1.05);
}
+
80% {
transform: scale(0.95);
}
+
100% {
transform: scale(1);
}
}
+
@-webkit-keyframes swal2-hide {
0% {
transform: scale(1);
opacity: 1;
}
+
100% {
transform: scale(0.5);
opacity: 0;
}
}
+
@keyframes swal2-hide {
0% {
transform: scale(1);
opacity: 1;
}
+
100% {
transform: scale(0.5);
opacity: 0;
}
}
+
@-webkit-keyframes swal2-animate-success-line-tip {
0% {
top: 1.1875em;
left: 0.0625em;
width: 0;
}
+
54% {
top: 1.0625em;
left: 0.125em;
width: 0;
}
+
70% {
top: 2.1875em;
left: -0.375em;
width: 3.125em;
}
+
84% {
top: 3em;
left: 1.3125em;
width: 1.0625em;
}
+
100% {
top: 2.8125em;
left: 0.8125em;
width: 1.5625em;
}
}
+
@keyframes swal2-animate-success-line-tip {
0% {
top: 1.1875em;
left: 0.0625em;
width: 0;
}
+
54% {
top: 1.0625em;
left: 0.125em;
width: 0;
}
+
70% {
top: 2.1875em;
left: -0.375em;
width: 3.125em;
}
+
84% {
top: 3em;
left: 1.3125em;
width: 1.0625em;
}
+
100% {
top: 2.8125em;
left: 0.8125em;
width: 1.5625em;
}
}
+
@-webkit-keyframes swal2-animate-success-line-long {
0% {
top: 3.375em;
right: 2.875em;
width: 0;
}
+
65% {
top: 3.375em;
right: 2.875em;
width: 0;
}
+
84% {
top: 2.1875em;
right: 0;
width: 3.4375em;
}
+
100% {
top: 2.375em;
right: 0.5em;
width: 2.9375em;
}
}
+
@keyframes swal2-animate-success-line-long {
0% {
top: 3.375em;
right: 2.875em;
width: 0;
}
+
65% {
top: 3.375em;
right: 2.875em;
width: 0;
}
+
84% {
top: 2.1875em;
right: 0;
width: 3.4375em;
}
+
100% {
top: 2.375em;
right: 0.5em;
width: 2.9375em;
}
}
+
@-webkit-keyframes swal2-rotate-success-circular-line {
0% {
transform: rotate(-45deg);
}
+
5% {
transform: rotate(-45deg);
}
+
12% {
transform: rotate(-405deg);
}
+
100% {
transform: rotate(-405deg);
}
}
+
@keyframes swal2-rotate-success-circular-line {
0% {
transform: rotate(-45deg);
}
+
5% {
transform: rotate(-45deg);
}
+
12% {
transform: rotate(-405deg);
}
+
100% {
transform: rotate(-405deg);
}
}
+
@-webkit-keyframes swal2-animate-error-x-mark {
0% {
margin-top: 1.625em;
transform: scale(0.4);
opacity: 0;
}
+
50% {
margin-top: 1.625em;
transform: scale(0.4);
opacity: 0;
}
+
80% {
margin-top: -0.375em;
transform: scale(1.15);
}
+
100% {
margin-top: 0;
transform: scale(1);
opacity: 1;
}
}
+
@keyframes swal2-animate-error-x-mark {
0% {
margin-top: 1.625em;
transform: scale(0.4);
opacity: 0;
}
+
50% {
margin-top: 1.625em;
transform: scale(0.4);
opacity: 0;
}
+
80% {
margin-top: -0.375em;
transform: scale(1.15);
}
+
100% {
margin-top: 0;
transform: scale(1);
opacity: 1;
}
}
+
@-webkit-keyframes swal2-animate-error-icon {
0% {
transform: rotateX(100deg);
opacity: 0;
}
+
100% {
transform: rotateX(0deg);
opacity: 1;
}
}
+
@keyframes swal2-animate-error-icon {
0% {
transform: rotateX(100deg);
opacity: 0;
}
+
100% {
transform: rotateX(0deg);
opacity: 1;
}
}
+
@-webkit-keyframes swal2-rotate-loading {
0% {
transform: rotate(0deg);
}
+
100% {
transform: rotate(360deg);
}
}
+
@keyframes swal2-rotate-loading {
0% {
transform: rotate(0deg);
}
+
100% {
transform: rotate(360deg);
}
}
+
body.swal2-shown:not(.swal2-no-backdrop):not(.swal2-toast-shown) {
overflow: hidden;
}
+
body.swal2-height-auto {
height: auto !important;
}
+
body.swal2-no-backdrop .swal2-container {
top: auto;
right: auto;
@@ -1233,64 +1464,85 @@ body.swal2-no-backdrop .swal2-container {
max-width: calc(100% - 0.625em * 2);
background-color: transparent !important;
}
-body.swal2-no-backdrop .swal2-container > .swal2-modal {
+
+body.swal2-no-backdrop .swal2-container>.swal2-modal {
box-shadow: 0 0 10px rgba(0, 0, 0, 0.4);
}
+
body.swal2-no-backdrop .swal2-container.swal2-top {
top: 0;
left: 50%;
transform: translateX(-50%);
}
-body.swal2-no-backdrop .swal2-container.swal2-top-start, body.swal2-no-backdrop .swal2-container.swal2-top-left {
+
+body.swal2-no-backdrop .swal2-container.swal2-top-start,
+body.swal2-no-backdrop .swal2-container.swal2-top-left {
top: 0;
left: 0;
}
-body.swal2-no-backdrop .swal2-container.swal2-top-end, body.swal2-no-backdrop .swal2-container.swal2-top-right {
+
+body.swal2-no-backdrop .swal2-container.swal2-top-end,
+body.swal2-no-backdrop .swal2-container.swal2-top-right {
top: 0;
right: 0;
}
+
body.swal2-no-backdrop .swal2-container.swal2-center {
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
-body.swal2-no-backdrop .swal2-container.swal2-center-start, body.swal2-no-backdrop .swal2-container.swal2-center-left {
+
+body.swal2-no-backdrop .swal2-container.swal2-center-start,
+body.swal2-no-backdrop .swal2-container.swal2-center-left {
top: 50%;
left: 0;
transform: translateY(-50%);
}
-body.swal2-no-backdrop .swal2-container.swal2-center-end, body.swal2-no-backdrop .swal2-container.swal2-center-right {
+
+body.swal2-no-backdrop .swal2-container.swal2-center-end,
+body.swal2-no-backdrop .swal2-container.swal2-center-right {
top: 50%;
right: 0;
transform: translateY(-50%);
}
+
body.swal2-no-backdrop .swal2-container.swal2-bottom {
bottom: 0;
left: 50%;
transform: translateX(-50%);
}
-body.swal2-no-backdrop .swal2-container.swal2-bottom-start, body.swal2-no-backdrop .swal2-container.swal2-bottom-left {
+
+body.swal2-no-backdrop .swal2-container.swal2-bottom-start,
+body.swal2-no-backdrop .swal2-container.swal2-bottom-left {
bottom: 0;
left: 0;
}
-body.swal2-no-backdrop .swal2-container.swal2-bottom-end, body.swal2-no-backdrop .swal2-container.swal2-bottom-right {
+
+body.swal2-no-backdrop .swal2-container.swal2-bottom-end,
+body.swal2-no-backdrop .swal2-container.swal2-bottom-right {
right: 0;
bottom: 0;
}
+
@media print {
body.swal2-shown:not(.swal2-no-backdrop):not(.swal2-toast-shown) {
overflow-y: scroll !important;
}
- body.swal2-shown:not(.swal2-no-backdrop):not(.swal2-toast-shown) > [aria-hidden=true] {
+
+ body.swal2-shown:not(.swal2-no-backdrop):not(.swal2-toast-shown)>[aria-hidden=true] {
display: none;
}
+
body.swal2-shown:not(.swal2-no-backdrop):not(.swal2-toast-shown) .swal2-container {
position: static !important;
}
}
+
body.swal2-toast-shown .swal2-container {
background-color: transparent;
}
+
body.swal2-toast-shown .swal2-container.swal2-top {
top: 0;
right: auto;
@@ -1298,25 +1550,32 @@ body.swal2-toast-shown .swal2-container.swal2-top {
left: 50%;
transform: translateX(-50%);
}
-body.swal2-toast-shown .swal2-container.swal2-top-end, body.swal2-toast-shown .swal2-container.swal2-top-right {
+
+body.swal2-toast-shown .swal2-container.swal2-top-end,
+body.swal2-toast-shown .swal2-container.swal2-top-right {
top: 0;
right: 0;
bottom: auto;
left: auto;
}
-body.swal2-toast-shown .swal2-container.swal2-top-start, body.swal2-toast-shown .swal2-container.swal2-top-left {
+
+body.swal2-toast-shown .swal2-container.swal2-top-start,
+body.swal2-toast-shown .swal2-container.swal2-top-left {
top: 0;
right: auto;
bottom: auto;
left: 0;
}
-body.swal2-toast-shown .swal2-container.swal2-center-start, body.swal2-toast-shown .swal2-container.swal2-center-left {
+
+body.swal2-toast-shown .swal2-container.swal2-center-start,
+body.swal2-toast-shown .swal2-container.swal2-center-left {
top: 50%;
right: auto;
bottom: auto;
left: 0;
transform: translateY(-50%);
}
+
body.swal2-toast-shown .swal2-container.swal2-center {
top: 50%;
right: auto;
@@ -1324,19 +1583,24 @@ body.swal2-toast-shown .swal2-container.swal2-center {
left: 50%;
transform: translate(-50%, -50%);
}
-body.swal2-toast-shown .swal2-container.swal2-center-end, body.swal2-toast-shown .swal2-container.swal2-center-right {
+
+body.swal2-toast-shown .swal2-container.swal2-center-end,
+body.swal2-toast-shown .swal2-container.swal2-center-right {
top: 50%;
right: 0;
bottom: auto;
left: auto;
transform: translateY(-50%);
}
-body.swal2-toast-shown .swal2-container.swal2-bottom-start, body.swal2-toast-shown .swal2-container.swal2-bottom-left {
+
+body.swal2-toast-shown .swal2-container.swal2-bottom-start,
+body.swal2-toast-shown .swal2-container.swal2-bottom-left {
top: auto;
right: auto;
bottom: 0;
left: 0;
}
+
body.swal2-toast-shown .swal2-container.swal2-bottom {
top: auto;
right: auto;
@@ -1344,30 +1608,37 @@ body.swal2-toast-shown .swal2-container.swal2-bottom {
left: 50%;
transform: translateX(-50%);
}
-body.swal2-toast-shown .swal2-container.swal2-bottom-end, body.swal2-toast-shown .swal2-container.swal2-bottom-right {
+
+body.swal2-toast-shown .swal2-container.swal2-bottom-end,
+body.swal2-toast-shown .swal2-container.swal2-bottom-right {
top: auto;
right: 0;
bottom: 0;
left: auto;
}
+
body.swal2-toast-column .swal2-toast {
flex-direction: column;
align-items: stretch;
}
+
body.swal2-toast-column .swal2-toast .swal2-actions {
flex: 1;
align-self: stretch;
height: 2.2em;
margin-top: 0.3125em;
}
+
body.swal2-toast-column .swal2-toast .swal2-loading {
justify-content: center;
}
+
body.swal2-toast-column .swal2-toast .swal2-input {
height: 2em;
margin: 0.3125em auto;
font-size: 1em;
}
+
body.swal2-toast-column .swal2-toast .swal2-validation-message {
font-size: 1em;
}
\ No newline at end of file
diff --git a/EdgeAdmin/web/views/@default/@layout.css b/EdgeAdmin/web/views/@default/@layout.css
index 2109f21..66b2498 100644
--- a/EdgeAdmin/web/views/@default/@layout.css
+++ b/EdgeAdmin/web/views/@default/@layout.css
@@ -7,20 +7,24 @@
overflow-x: hidden;
border-right: 1px #ddd solid;
}
+
.left-box .menu {
width: 95% !important;
}
+
.left-box .menu .item {
line-height: 1.2;
position: relative;
padding-left: 1em !important;
}
+
.left-box .menu .item .icon {
position: absolute;
top: 50%;
left: 0;
margin-top: -0.4em !important;
}
+
.left-box .menu .item.separator {
border-bottom: 1px #eee solid !important;
padding-top: 0;
@@ -28,9 +32,11 @@
margin-top: 0 !important;
margin-bottom: 0 !important;
}
+
.left-box .menu .item.on span {
border-bottom: 1px #666 dashed;
}
+
.left-box .menu .item.off span var {
font-style: normal;
background: #db2828;
@@ -40,33 +46,42 @@
border-radius: 2px;
margin-left: 1em;
}
+
.left-box .menu .item.active {
background: rgba(230, 230, 230, 0.35) !important;
border-radius: 3px;
}
+
.left-box .menu .header {
border-bottom: 1px #ddd solid;
padding-left: 0 !important;
padding-bottom: 1em !important;
}
+
.left-box::-webkit-scrollbar {
width: 4px;
}
+
.left-box.disabled {
opacity: 0.1;
}
+
.left-box.tiny {
top: 10em;
}
+
.left-box.without-tabbar {
top: 3em;
}
+
.left-box.with-menu {
top: 8.7em;
}
+
.left-box.without-menu {
top: 6em;
}
+
.right-box {
position: fixed;
top: 7em;
@@ -77,47 +92,60 @@
padding-bottom: 2em;
overflow-y: auto;
}
+
.right-box h4:first-child {
margin-top: 1em;
}
-.right-box > .comment:first-child {
+
+.right-box>.comment:first-child {
margin-top: 0.5em;
}
+
@media screen and (max-width: 512px) {
.right-box {
left: 13em;
padding-right: 1em;
}
}
+
body.expanded .right-box {
left: 10em;
}
+
.right-box.tiny {
top: 10em;
left: 26.5em;
}
+
.right-box::-webkit-scrollbar {
width: 4px;
}
+
.right-box.without-tabbar {
top: 3em;
}
+
.right-box.with-menu {
top: 8.6em;
}
+
.right-box.without-menu {
top: 6em;
}
+
.main.without-footer .left-box {
bottom: 0.2em;
}
+
.narrow-scrollbar::-webkit-scrollbar {
width: 4px;
}
+
.grid.counter-chart {
margin-top: 1em !important;
margin-left: 0.4em !important;
}
+
.grid.counter-chart .column {
margin-bottom: 1em;
font-size: 0.85em;
@@ -126,203 +154,256 @@ body.expanded .right-box {
border: 1px rgba(0, 0, 0, 0.1) solid;
border-right: 0;
}
+
.grid.counter-chart .column div.value {
margin-top: 1.5em;
font-weight: normal;
}
+
.grid.counter-chart .column div.value span {
font-size: 1.5em;
margin-right: 0.2em;
}
+
.grid.counter-chart .column.with-border {
border-right: 1px rgba(0, 0, 0, 0.1) solid;
}
+
.grid.counter-chart h4 {
color: grey;
position: relative;
font-size: 1em;
text-align: left;
}
+
.grid.counter-chart h4 a {
position: absolute;
right: 0.1em;
font-size: 1.26em;
display: none;
}
+
.grid.counter-chart .column:hover {
background: rgba(0, 0, 0, 0.03) !important;
}
+
.grid.counter-chart .column:hover a {
display: inline;
}
+
.grid.chart-grid {
margin-top: 1em !important;
margin-left: 0.4em !important;
}
+
.grid.chart-grid .column {
margin-bottom: 1em;
border: 1px rgba(0, 0, 0, 0.1) solid;
border-right: 0;
}
+
.grid.chart-grid .column .menu {
margin-top: -0.6em !important;
margin-bottom: -0.6em !important;
}
+
.grid.chart-grid .column h4 span {
font-size: 0.8em;
color: grey;
}
+
.grid.chart-grid .column.with-border {
border-right: 1px rgba(0, 0, 0, 0.1) solid;
}
+
/** 通用 **/
* {
scrollbar-color: rgba(0, 0, 0, 0.2) transparent;
scrollbar-width: thin;
}
+
.clear {
clear: both;
}
+
.hidden {
display: none;
}
+
pre {
white-space: pre-wrap;
}
+
a.disabled,
a.disabled:hover,
a.disabled:active,
span.disabled {
color: #ccc !important;
}
+
a.enabled,
span.enabled,
span.green {
color: #21ba45;
}
+
span.grey,
label.grey,
p.grey {
color: grey !important;
}
+
p.grey {
margin-top: 0.8em;
}
+
span.red,
pre.red {
color: #db2828;
}
+
span.blue {
color: #4183c4;
}
+
span.orange {
color: #ff851b;
}
+
pre:not(.CodeMirror-line) {
font-family: Lato, 'Helvetica Neue', Arial, Helvetica, sans-serif !important;
}
+
tbody {
background: transparent;
}
+
.table-box {
margin-top: 1em;
overflow-x: auto;
}
+
.table-box::-webkit-scrollbar {
height: 6px;
}
+
.table.width30 {
width: 30em !important;
}
+
.table.width35 {
width: 35em !important;
}
+
.table.width40 {
width: 40em !important;
}
+
.table.width1024 {
width: 1024px !important;
}
+
.table th,
.table td {
font-size: 0.9em !important;
}
+
.table tr.active td {
background: rgba(0, 0, 0, 0.01) !important;
}
+
p.comment,
div.comment {
color: #959da6;
padding-top: 0.4em;
font-size: 1em;
}
+
p.comment em,
div.comment em {
font-style: italic !important;
}
+
.truncate {
white-space: nowrap;
-ms-text-overflow: ellipsis;
overflow: hidden;
text-overflow: ellipsis;
}
+
div.margin,
p.margin {
margin-top: 1em;
}
+
.opacity-mask {
opacity: 0.3;
}
+
/** 操作按钮容器 **/
.op.one {
width: 4em;
}
+
.op.two {
width: 7.4em;
}
+
.op.three {
width: 9em;
}
+
.op.four {
width: 12em;
}
+
/** 主菜单 **/
.main-menu {
width: 8em !important;
}
+
.main-menu .ui.menu {
width: 100% !important;
}
+
.main-menu .ui.menu .item.separator {
border-top: 1px rgba(0, 0, 0, 0.2) solid;
height: 1px;
min-height: 0;
padding: 0;
}
+
@media screen and (max-width: 512px) {
.main-menu {
width: auto !important;
}
+
.main-menu .ui.menu {
width: 3.6em !important;
}
+
.main-menu .ui.menu .item.separator {
display: none;
}
+
.main-menu .ui.menu .item {
padding-top: 2em;
padding-bottom: 2.4em;
}
}
+
.main-menu .ui.labeled.icon.menu .item {
font-size: 0.9em;
}
+
.main-menu .ui.menu {
padding-bottom: 3em;
}
+
.main-menu .ui.menu .item .subtitle {
display: none;
}
+
.main-menu .ui.menu .item.expend .subtitle {
display: block;
font-size: 10px;
@@ -330,20 +411,24 @@ p.margin {
margin-top: 0.5em;
color: grey;
}
+
@media screen and (max-width: 512px) {
.main-menu .ui.menu .item.expend .subtitle {
display: none;
}
}
+
.main-menu .ui.menu .sub-items .item {
padding-left: 2.8em !important;
padding-right: 0.4em !important;
}
+
.main-menu .ui.menu .sub-items .item .icon {
position: absolute;
left: 1.1em;
top: 0.93em;
}
+
.main-menu .ui.menu .sub-items .item .label {
margin-left: 0;
margin-right: 0;
@@ -351,53 +436,67 @@ p.margin {
padding-right: 0.4em;
min-width: 2em;
}
+
@media screen and (max-width: 512px) {
.main-menu .ui.menu .sub-items .item {
padding-left: 1em !important;
}
}
+
.main-menu .ui.menu .sub-items .item.active {
background-color: #2185d0 !important;
}
+
/** 扩展UI **/
.field.text {
padding: 0.5em;
}
+
.form .fields:not(.inline) .field {
margin-bottom: 0.5em !important;
}
+
.form .fields:not(.inline) .field .button {
min-width: 5em;
}
+
/** body **/
@keyframes blink {
from {
opacity: 0.1;
}
+
to {
opacity: 0.8;
}
}
+
@keyframes rotation {
from {
transform: rotate(0);
}
+
to {
transform: rotate(360deg);
}
}
+
body .ui.menu .item .blink {
animation: blink 1s infinite;
}
+
body .ui.menu .item:not(:hover) span.rotate {
animation: rotation 3s infinite;
}
+
body.expanded .main-menu {
display: none;
}
+
body.expanded .main {
left: 1em;
}
+
/** 布局相关 */
.top-nav {
border-radius: 0 !important;
@@ -407,6 +506,7 @@ body.expanded .main {
overflow-x: auto;
border: 0 !important;
}
+
.top-nav img.avatar {
width: 1.6em !important;
height: 1.6em !important;
@@ -415,44 +515,57 @@ body.expanded .main {
border-radius: 0.9em;
margin-right: 0.5em !important;
}
+
.top-nav em {
font-style: normal;
font-size: 0.9em;
padding-left: 0.2em;
}
+
.top-nav .item .hover-span span {
display: none;
}
+
.top-nav .item:hover .hover-span span {
display: inline;
}
+
.top-nav .item.red {
color: red !important;
}
+
.top-nav.theme1 {
background: #14539A !important;
}
+
.top-nav.theme2 {
background: #276AC6 !important;
}
+
.top-nav.theme3 {
background: #007D9C !important;
}
+
.top-nav.theme4 {
background: #A12568 !important;
}
+
.top-nav.theme5 {
background: #1C7947 !important;
}
+
.top-nav.theme6 {
background: #1D365D !important;
}
+
.top-nav.theme7 {
background: black !important;
}
+
.top-nav::-webkit-scrollbar {
height: 2px;
}
+
/** 顶部菜单 **/
.top-secondary-menu {
position: fixed;
@@ -462,23 +575,28 @@ body.expanded .main {
z-index: 100;
background: white;
}
+
.top-secondary-menu .menu {
margin-top: 0 !important;
margin-bottom: 0 !important;
border-radius: 0 !important;
}
+
.top-secondary-menu .menu var {
font-style: normal;
}
+
.top-secondary-menu .divider {
margin-top: 0 !important;
margin-bottom: 0 !important;
}
+
@media screen and (max-width: 512px) {
.top-secondary-menu {
left: 4em;
}
}
+
/** 右侧主操作区 **/
.main {
position: absolute;
@@ -488,84 +606,107 @@ body.expanded .main {
padding-right: 0.2em;
right: 1em;
}
+
@media screen and (max-width: 512px) {
.main {
left: 4em;
}
+
.main .main-box {
display: block;
}
}
+
.main.without-menu {
left: 9em;
}
+
.main.without-secondary-menu {
top: 2.9em;
}
+
@media screen and (max-width: 512px) {
.main.without-menu {
left: 4em;
}
}
+
.main table td.title {
width: 10em;
}
+
.main table td.middle-title {
width: 14em;
}
+
.main table td {
vertical-align: top;
}
+
.main table td.color-border {
border-left: 1px #276ac6 solid !important;
}
+
.main table td.vertical-top {
vertical-align: top;
}
+
.main table td.vertical-middle {
vertical-align: middle;
}
+
.main table td[colspan="2"] a {
font-weight: normal;
}
+
.main table td em {
font-weight: normal;
font-style: normal;
font-size: 0.9em;
}
+
.main table td em.grey {
color: grey;
}
+
.main h3 {
font-weight: normal;
margin-top: 1em !important;
position: relative;
}
+
.main h3 span {
font-size: 0.8em;
}
+
.main h3 span.label {
color: #6435c9;
}
+
.main h3 a {
margin-left: 1em;
font-size: 14px !important;
right: 1em;
}
+
.main h4 {
font-weight: normal;
}
+
.main form h4 {
margin-top: 0.6em;
}
+
.main td span.small {
font-size: 0.8em;
}
+
.main .button.mini {
font-size: 0.8em;
padding: 0.2em;
margin-left: 1em;
}
+
.main-menu {
position: fixed;
/**top: 1.05em;**/
@@ -574,89 +715,114 @@ body.expanded .main {
overflow-y: auto;
z-index: 10;
}
+
.main-menu .menu {
border: 0 !important;
box-shadow: none !important;
}
+
.main-menu.theme1 {
background: #14539A !important;
}
+
.main-menu.theme1 .menu {
background: #14539A !important;
}
+
.main-menu.theme2 {
background: #276AC6 !important;
}
+
.main-menu.theme2 .menu {
background: #276AC6 !important;
}
+
.main-menu.theme3 {
background: #007D9C !important;
}
+
.main-menu.theme3 .menu {
background: #007D9C !important;
}
+
.main-menu.theme4 {
background: #A12568 !important;
}
+
.main-menu.theme4 .menu {
background: #A12568 !important;
}
+
.main-menu.theme5 {
background: #1C7947 !important;
}
+
.main-menu.theme5 .menu {
background: #1C7947 !important;
}
+
.main-menu.theme6 {
background: #1D365D !important;
}
+
.main-menu.theme6 .menu {
background: #1D365D !important;
}
+
.main-menu.theme7 {
background: black !important;
}
+
.main-menu.theme7 .menu {
background: black !important;
}
+
.main-menu::-webkit-scrollbar {
width: 4px;
}
+
.main .tab-menu {
margin-top: 0.3em !important;
margin-bottom: 0 !important;
overflow-x: auto;
overflow-y: hidden;
}
+
.main .tab-menu .item {
padding: 0 1em !important;
}
+
.main .tab-menu .item var {
font-style: normal;
}
+
.main .tab-menu .item span {
font-size: 0.8em;
padding-left: 0.3em;
}
+
.main .tab-menu .item .icon {
margin-left: 0.6em;
}
+
.main .tab-menu .item.active.title {
font-weight: normal !important;
margin-right: 1em !important;
border-radius: 0 !important;
}
+
.main .tab-menu .item:hover {
background: #f8f8f9 !important;
border-width: 1px;
}
+
.main .tab-menu .item.active:not(.title) {
font-weight: normal !important;
border: none;
border-radius: 0 !important;
color: #2185d0 !important;
}
+
.main .tab-menu .item.active:not(.title) .bottom-indicator {
border-bottom: 1px #2185d0 solid;
position: absolute;
@@ -664,6 +830,7 @@ body.expanded .main {
right: 0;
bottom: 1px;
}
+
.main .tab-menu .item.active:not(.title).icon .bottom-indicator {
border-bottom: 1px #2185d0 solid;
position: absolute;
@@ -671,12 +838,15 @@ body.expanded .main {
right: 0.6em;
bottom: 1px;
}
+
.main .tab-menu .item.active.blue {
font-weight: bold !important;
}
+
.main .tab-menu::-webkit-scrollbar {
height: 4px;
}
+
.main .go-top-btn {
position: fixed;
right: 2.6em;
@@ -687,14 +857,17 @@ body.expanded .main {
z-index: 999999;
background: white;
}
+
/** 右侧文本子菜单 **/
.text.menu {
overflow-x: auto;
}
+
.text.menu::-webkit-scrollbar {
width: 4px;
height: 4px;
}
+
/** 脚部相关样式 **/
#footer {
position: fixed;
@@ -706,27 +879,34 @@ body.expanded .main {
z-index: 10;
overflow-x: auto;
}
+
#footer::-webkit-scrollbar {
height: 2px;
}
+
#footer a {
font-size: 0.9em;
}
+
#footer a form {
display: none;
}
+
#footer a:hover span,
#footer a:active span {
display: none;
}
+
#footer a:hover form,
#footer a:active form {
display: block;
}
+
#footer form input {
padding: 0;
margin: 0;
}
+
#footer-outer-box {
z-index: 999999;
position: fixed;
@@ -736,6 +916,7 @@ body.expanded .main {
background: rgba(0, 0, 0, 0.8);
bottom: 2.6em;
}
+
#footer-outer-box .qrcode {
width: 20em;
position: absolute;
@@ -744,95 +925,119 @@ body.expanded .main {
margin-top: -14em;
margin-left: -10em;
}
+
#footer-outer-box .qrcode img {
width: 100%;
}
+
#footer-outer-box .qrcode a {
position: absolute;
right: 0.5em;
top: 0.5em;
}
+
@media screen and (max-width: 512px) {
#footer-outer-box .qrcode {
margin-left: 0;
left: 3.5em;
}
}
+
/** Vue **/
[v-cloak] {
display: none !important;
}
+
/** auto complete **/
.autocomplete-box .menu {
background: #eee !important;
}
+
.autocomplete-box .menu::-webkit-scrollbar {
width: 4px;
}
+
.autocomplete-box .menu .item {
border-top: none !important;
}
+
select.auto-width {
width: auto !important;
}
+
/** column **/
@media screen and (max-width: 512px) {
.column:not(.one) {
width: 100% !important;
}
}
+
label[for] {
cursor: pointer !important;
}
+
label.blue {
color: #2185d0 !important;
}
+
/** Menu **/
.first-menu .menu.text {
margin-top: 0 !important;
margin-bottom: 0 !important;
}
+
.first-menu .divider {
margin-top: 0 !important;
margin-bottom: 0 !important;
}
+
.second-menu .menu.text {
margin-top: 0 !important;
margin-bottom: 0 !important;
}
+
.second-menu .menu.text em {
font-style: normal;
}
+
.second-menu .divider {
margin-top: 0 !important;
}
+
.menu a {
outline: none;
}
+
/** var **/
span.olive,
var.olive {
color: #b5cc18 !important;
}
+
span.dash {
border-bottom: 1px dashed grey;
}
+
span.hover:hover {
background: #eee;
}
+
var.normal {
font-style: normal;
}
+
/** checkbox **/
.checkbox label a,
.checkbox label {
font-size: 0.9em !important;
}
+
/** page **/
.page {
margin-top: 1em;
border-left: 1px solid #ddd;
}
+
.page a {
display: inline-block;
background: #fafafa;
@@ -843,86 +1048,109 @@ var.normal {
border: 1px solid #ddd;
border-left: 0;
}
+
.page a.active {
background: #2185d0 !important;
color: white;
}
+
.page a:hover {
background: #eee;
}
+
.page select {
padding-top: 0.3em !important;
padding-bottom: 0.3em !important;
}
+
/** popup **/
.swal2-html-container {
overflow-x: hidden;
}
+
.swal2-close,
.swal2-close:focus {
border: 0;
}
+
.swal2-confirm:focus,
.swal2-cancel:focus {
border: 3px #ddd solid !important;
}
+
.swal2-confirm,
.swal2-cancel {
border: 3px #fff solid !important;
}
+
.swal2-cancel {
margin-left: 2em !important;
}
+
/** 排序 **/
.sortable-ghost {
background: #ddd !important;
opacity: 0.1;
}
+
.sortable-drag {
opacity: 1;
}
+
.icon.handle {
cursor: pointer;
}
+
.label.port-label {
margin-top: 0.4em !important;
margin-bottom: 0.4em !important;
display: block;
line-height: 1.5;
}
+
.label {
word-break: break-all;
}
+
td .label.small {
margin-bottom: 0.2em !important;
}
+
td {
word-break: break-all;
}
+
.source-code-box .CodeMirror {
border: 1px solid #eee;
height: auto !important;
}
+
.source-code-box .CodeMirror-vscrollbar {
width: 6px;
border-radius: 3px !important;
}
+
.source-code-box .CodeMirror-vscrollbar::-webkit-scrollbar-thumb {
border-radius: 2px;
}
+
.scroll-box {
overflow-y: auto;
}
+
.scroll-box::-webkit-scrollbar {
width: 4px;
}
+
input.error {
border: 1px #e0b4b4 solid !important;
}
+
textarea.wide-code {
font-family: Menlo, Monaco, "Courier New", monospace !important;
line-height: 1.6 !important;
}
+
.combo-box .menu {
max-height: 17em;
overflow-y: auto;
@@ -931,7 +1159,66 @@ textarea.wide-code {
border-top: 0;
z-index: 100;
}
+
.combo-box .menu::-webkit-scrollbar {
width: 4px;
}
-/*# sourceMappingURL=@layout.css.map */
\ No newline at end of file
+
+/*# sourceMappingURL=@layout.css.map */
+/* Override Primary Button Color for WAF Platform */
+.ui.primary.button,
+.ui.primary.buttons .button {
+ background-color: #0f2c54 !important;
+ color: #ffffff !important;
+}
+
+.ui.primary.button:hover,
+.ui.primary.buttons .button:hover {
+ background-color: #0a1f3a !important;
+}
+
+.ui.primary.button:focus,
+.ui.primary.buttons .button:focus {
+ background-color: #08192e !important;
+}
+
+.ui.primary.button:active,
+.ui.primary.buttons .button:active,
+.ui.primary.active.button {
+ background-color: #050d18 !important;
+}
+
+.text-primary,
+.blue {
+ color: #0f2c54 !important;
+}
+
+/* Override Semantic UI Default Blue */
+.ui.blue.button,
+.ui.blue.buttons .button {
+ background-color: #0f2c54 !important;
+ color: #ffffff !important;
+}
+
+.ui.blue.button:hover,
+.ui.blue.buttons .button:hover {
+ background-color: #0a1f3a !important;
+}
+
+.ui.basic.blue.button,
+.ui.basic.blue.buttons .button {
+ box-shadow: 0 0 0 1px #0f2c54 inset !important;
+ color: #0f2c54 !important;
+}
+
+.ui.basic.blue.button:hover,
+.ui.basic.blue.buttons .button:hover {
+ background: transparent !important;
+ box-shadow: 0 0 0 1px #0a1f3a inset !important;
+ color: #0a1f3a !important;
+}
+
+.ui.menu .active.item {
+ border-color: #2185d0 !important;
+ color: #0f2c54 !important;
+}
\ No newline at end of file
diff --git a/EdgeAdmin/web/views/@default/@layout.html b/EdgeAdmin/web/views/@default/@layout.html
index 708bdc6..722a93c 100644
--- a/EdgeAdmin/web/views/@default/@layout.html
+++ b/EdgeAdmin/web/views/@default/@layout.html
@@ -1,15 +1,16 @@
+
{$ htmlEncode .teaTitle}
-
+
{$if eq .teaFaviconFileId 0}
-
+
{$else}
-
+
{$end}
-
+
{$TEA.SEMANTIC}
{$TEA.VUE}
@@ -20,7 +21,7 @@
window.BRAND_DOCS_SITE = {$ jsonEncode .brandConfig.docsSite};
window.BRAND_DOCS_PREFIX = {$ jsonEncode .brandConfig.docsPathPrefix};
window.BRAND_PRODUCT_NAME = {$ jsonEncode .brandConfig.productName};
-
+
// 确保 teaName 和 teaVersion 在 Vue 初始化前可用
if (typeof window.TEA === "undefined") {
window.TEA = {};
@@ -36,122 +37,152 @@
-
-
-
-
+
+
+
+
-
+
-
+
+
-
-
-
diff --git a/EdgeAdmin/web/views/@default/httpdns/clusters/clusterSettings.html b/EdgeAdmin/web/views/@default/httpdns/clusters/clusterSettings.html
index 809eb1d..cd411ec 100644
--- a/EdgeAdmin/web/views/@default/httpdns/clusters/clusterSettings.html
+++ b/EdgeAdmin/web/views/@default/httpdns/clusters/clusterSettings.html
@@ -66,30 +66,37 @@
自动远程启动
-
-
-
-
+
访问日志
-
-
-
-
+
+
+ 时区
+
+
+ 当前:{{timeZoneLocation.name}}
+ ({{timeZoneLocation.offset}})
+
+
+
+ {{tz.name}} ({{tz.offset}})
+
+
+
+
+
+
启用当前集群
-
-
-
-
+
@@ -110,4 +117,4 @@
-
\ No newline at end of file
+
diff --git a/EdgeAdmin/web/views/@default/httpdns/clusters/clusterSettings.js b/EdgeAdmin/web/views/@default/httpdns/clusters/clusterSettings.js
index a487d0e..4f3f97c 100644
--- a/EdgeAdmin/web/views/@default/httpdns/clusters/clusterSettings.js
+++ b/EdgeAdmin/web/views/@default/httpdns/clusters/clusterSettings.js
@@ -7,4 +7,27 @@ Tea.context(function () {
if (!this.settings) {
this.settings = {}
}
+
+ let toBool = function (v) {
+ if (typeof v === "boolean") {
+ return v
+ }
+ if (typeof v === "number") {
+ return v === 1
+ }
+ if (typeof v === "string") {
+ let s = v.toLowerCase().trim()
+ return s === "1" || s === "true" || s === "on" || s === "yes" || s === "enabled"
+ }
+ return false
+ }
+
+ this.settings.autoRemoteStart = toBool(this.settings.autoRemoteStart)
+ this.settings.accessLogIsOn = toBool(this.settings.accessLogIsOn)
+ this.settings.isOn = toBool(this.settings.isOn)
+
+ if (!this.settings.timeZone || this.settings.timeZone.length == 0) {
+ this.settings.timeZone = "Asia/Shanghai"
+ }
})
+
diff --git a/EdgeAdmin/web/views/@default/httpdns/clusters/create.html b/EdgeAdmin/web/views/@default/httpdns/clusters/create.html
index 7b4872d..b1e532c 100644
--- a/EdgeAdmin/web/views/@default/httpdns/clusters/create.html
+++ b/EdgeAdmin/web/views/@default/httpdns/clusters/create.html
@@ -43,7 +43,7 @@
节点安装根目录
-
+
@@ -59,4 +59,4 @@
-
\ No newline at end of file
+
diff --git a/EdgeAdmin/web/views/@default/httpdns/clusters/createNode.html b/EdgeAdmin/web/views/@default/httpdns/clusters/createNode.html
index 011fc63..2b9a796 100644
--- a/EdgeAdmin/web/views/@default/httpdns/clusters/createNode.html
+++ b/EdgeAdmin/web/views/@default/httpdns/clusters/createNode.html
@@ -19,7 +19,7 @@
安装目录
-
+
diff --git a/EdgeAdmin/web/views/@default/httpdns/clusters/index.html b/EdgeAdmin/web/views/@default/httpdns/clusters/index.html
index 88163a3..d8298c0 100644
--- a/EdgeAdmin/web/views/@default/httpdns/clusters/index.html
+++ b/EdgeAdmin/web/views/@default/httpdns/clusters/index.html
@@ -51,6 +51,12 @@
:class="{red:cluster.countAllNodes > cluster.countActiveNodes}">{{cluster.countAllNodes}}
-
+
+
@@ -67,4 +73,4 @@
-
\ No newline at end of file
+
diff --git a/EdgeAdmin/web/views/@default/httpdns/clusters/upgradeRemote.html b/EdgeAdmin/web/views/@default/httpdns/clusters/upgradeRemote.html
index 3416c5b..be8cc61 100644
--- a/EdgeAdmin/web/views/@default/httpdns/clusters/upgradeRemote.html
+++ b/EdgeAdmin/web/views/@default/httpdns/clusters/upgradeRemote.html
@@ -1,3 +1,62 @@
-{$layout}
+{$layout}
-姝ゅ姛鑳芥殏鏈紑鏀俱€?/p>
\ No newline at end of file
+
+
+
+
+ 所有需要升级的节点
+ 批量升级({{countCheckedNodes()}})
+
+
+
+
+
+
+
+ 节点名
+ 访问IP
+ SSH地址
+ 版本变化
+ 节点状态
+ 操作
+
+
+
+
+
+
+
+
+ {{node.name}}
+ [详情]
+
+
+ {{node.accessIP}}
+ -
+
+
+
+ {{node.loginParams.host}}:{{node.loginParams.port}}
+
+ 没有设置
+
+ v{{node.oldVersion}} -> v{{node.newVersion}}
+
+
+
升级中...
+
+ 已升级成功
+ 升级过程中发生错误:{{node.installStatus.error}}
+
+
+ 等待升级
+
+
+ 升级
+ 升级中...
+ 升级
+
+
+
+
+
diff --git a/EdgeAdmin/web/views/@default/httpdns/clusters/upgradeRemote.js b/EdgeAdmin/web/views/@default/httpdns/clusters/upgradeRemote.js
new file mode 100644
index 0000000..ee7c383
--- /dev/null
+++ b/EdgeAdmin/web/views/@default/httpdns/clusters/upgradeRemote.js
@@ -0,0 +1,147 @@
+Tea.context(function () {
+ this.isInstalling = false
+ this.isBatch = false
+ let installingNode = null
+
+ this.nodes.forEach(function (v) {
+ v.isChecked = false
+ })
+
+ this.$delay(function () {
+ this.reload()
+ })
+
+ let that = this
+
+ this.checkNodes = function (isChecked) {
+ this.nodes.forEach(function (v) {
+ v.isChecked = isChecked
+ })
+ }
+
+ this.countCheckedNodes = function () {
+ return that.nodes.$count(function (k, v) {
+ return v.isChecked
+ })
+ }
+
+ this.installNode = function (node) {
+ let that = this
+ if (this.isBatch) {
+ installingNode = node
+ that.isInstalling = true
+ node.isInstalling = true
+
+ that.$post("$")
+ .params({
+ nodeId: node.id
+ })
+ } else {
+ teaweb.confirm("确定要开始升级此节点吗?", function () {
+ installingNode = node
+ that.isInstalling = true
+ node.isInstalling = true
+
+ that.$post("$")
+ .params({
+ nodeId: node.id
+ })
+ })
+ }
+ }
+
+ this.installBatch = function () {
+ let that = this
+ this.isBatch = true
+ teaweb.confirm("确定要批量升级选中的节点吗?", function () {
+ that.installNext()
+ })
+ }
+
+ this.installNext = function () {
+ let nextNode = this.nodes.$find(function (k, v) {
+ return v.isChecked
+ })
+
+ if (nextNode == null) {
+ teaweb.success("全部升级成功", function () {
+ teaweb.reload()
+ })
+ } else {
+ this.installNode(nextNode)
+ }
+ return
+ }
+
+ this.reload = function () {
+ let that = this
+ if (installingNode != null) {
+ this.$post("/httpdns/clusters/upgradeStatus")
+ .params({
+ nodeId: installingNode.id
+ })
+ .success(function (resp) {
+ if (resp.data.status != null) {
+ installingNode.installStatus = resp.data.status
+ if (installingNode.installStatus.isFinished) {
+ if (installingNode.installStatus.isOk) {
+ installingNode.isChecked = false
+ installingNode = null
+ if (that.isBatch) {
+ that.installNext()
+ } else {
+ teaweb.success("升级成功", function () {
+ teaweb.reload()
+ })
+ }
+ } else {
+ let nodeId = installingNode.id
+ let errMsg = installingNode.installStatus.error
+ that.isInstalling = false
+ installingNode.isInstalling = false
+ installingNode = null
+
+ switch (resp.data.status.errorCode) {
+ case "EMPTY_LOGIN":
+ case "EMPTY_SSH_HOST":
+ case "EMPTY_SSH_PORT":
+ case "EMPTY_GRANT":
+ teaweb.warn("需要填写SSH登录信息", function () {
+ teaweb.popup("/httpdns/clusters/updateNodeSSH?nodeId=" + nodeId, {
+ height: "20em",
+ callback: function () {
+ teaweb.reload()
+ }
+ })
+ })
+ return
+ case "CREATE_ROOT_DIRECTORY_FAILED":
+ teaweb.warn("创建根目录失败,请检查目录权限或手工创建:" + errMsg)
+ return
+ case "INSTALL_HELPER_FAILED":
+ teaweb.warn("安装助手失败:" + errMsg)
+ return
+ case "TEST_FAILED":
+ teaweb.warn("环境测试失败:" + errMsg)
+ return
+ case "RPC_TEST_FAILED":
+ teaweb.confirm("html:要升级的节点到API服务之间的RPC通讯测试失败,具体错误:" + errMsg + ", 现在修改API信息?", function () {
+ window.location = "/settings/api"
+ })
+ return
+ default:
+ teaweb.warn("升级失败:" + errMsg)
+ }
+ }
+ }
+ }
+ })
+ .done(function () {
+ setTimeout(this.reload, 3000)
+ })
+ } else {
+ setTimeout(this.reload, 3000)
+ }
+ }
+})
+
diff --git a/EdgeAdmin/web/views/@default/ns/clusters/cluster/index.html b/EdgeAdmin/web/views/@default/ns/clusters/cluster/index.html
index 57b5f7c..78b0bfd 100644
--- a/EdgeAdmin/web/views/@default/ns/clusters/cluster/index.html
+++ b/EdgeAdmin/web/views/@default/ns/clusters/cluster/index.html
@@ -52,7 +52,7 @@
{{node.name}}
-
+
v{{node.status.version}} -> v{{latestVersion}}
@@ -112,4 +112,4 @@
-
\ No newline at end of file
+
diff --git a/EdgeAdmin/web/views/@default/settings/authority/index.html b/EdgeAdmin/web/views/@default/settings/authority/index.html
index 0696884..7e50216 100644
--- a/EdgeAdmin/web/views/@default/settings/authority/index.html
+++ b/EdgeAdmin/web/views/@default/settings/authority/index.html
@@ -97,4 +97,4 @@
-
+
\ No newline at end of file
diff --git a/EdgeAdmin/web/views/@default/settings/ui/index.html b/EdgeAdmin/web/views/@default/settings/ui/index.html
index bca8794..3c528df 100644
--- a/EdgeAdmin/web/views/@default/settings/ui/index.html
+++ b/EdgeAdmin/web/views/@default/settings/ui/index.html
@@ -1,45 +1,38 @@
{$layout}
\ No newline at end of file
diff --git a/EdgeAdmin/web/views/@default/settings/upgrade/index.html b/EdgeAdmin/web/views/@default/settings/upgrade/index.html
index 79a92a0..53ab4c6 100644
--- a/EdgeAdmin/web/views/@default/settings/upgrade/index.html
+++ b/EdgeAdmin/web/views/@default/settings/upgrade/index.html
@@ -1,3 +1,139 @@
{$layout}
-
\ No newline at end of file
+
+
+
+
+
+
+
+
+
+
+ 手动升级
+ 全部升级({{totalUpgradeCount}})
+
+
+
+
+
+
+
+
+
+
+
+ {{mod.name}}
+ {{mod.count}}个待升级
+
+ 升级所有{{mod.name}}
+
+
+
+
+
+
+
+
+ {{cluster.name}}
+ {{cluster.count}}个待升级
+
+
+ 批量升级({{countCheckedNodesInCluster(cluster)}})
+ 升级集群内所有节点
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 节点名
+ 访问IP
+ SSH地址
+ 版本变化
+ 节点状态
+ 操作
+
+
+
+
+
+
+
+
+
+
+ {{node.name}}
+
+
+
+ {{node.accessIP}}
+ -
+
+
+
+ {{node.loginParams.host}}:{{node.loginParams.port}}
+
+ 没有设置
+
+
+ v{{node.oldVersion}}
+ 未知
+ -> v{{node.newVersion}}
+
+
+
+
+ 升级中...
+
+
+
+ 已升级成功
+
+ 升级过程中发生错误:{{node.installStatus.error}}
+
+
+ 等待升级
+
+
+ 升级
+ 升级中...
+
+
+
+
+
+
+
+
diff --git a/EdgeAdmin/web/views/@default/settings/upgrade/index.js b/EdgeAdmin/web/views/@default/settings/upgrade/index.js
new file mode 100644
index 0000000..3a984c4
--- /dev/null
+++ b/EdgeAdmin/web/views/@default/settings/upgrade/index.js
@@ -0,0 +1,457 @@
+Tea.context(function () {
+ let that = this
+
+ // 计算总待升级数
+ this.totalUpgradeCount = 0
+ this.modules.forEach(function (mod) {
+ mod.expanded = true
+ that.totalUpgradeCount += mod.count
+ if (mod.clusters != null) {
+ mod.clusters.forEach(function (cluster) {
+ cluster.expanded = true
+ if (cluster.nodes != null) {
+ cluster.nodes.forEach(function (node) {
+ node.isUpgrading = false
+ node.isChecked = false
+ })
+ }
+ })
+ }
+ })
+
+ // 正在升级的节点ID集合(按模块)
+ this.upgradingNodeIds = {
+ "node": [],
+ "dns": [],
+ "httpdns": []
+ }
+
+ // 启动状态轮询
+ this.$delay(function () {
+ this.pollStatus()
+ })
+
+ /**
+ * 获取节点详情页URL
+ */
+ this.nodeDetailURL = function (moduleCode, clusterId, nodeId) {
+ switch (moduleCode) {
+ case "node":
+ return "/clusters/cluster/node?clusterId=" + clusterId + "&nodeId=" + nodeId
+ case "dns":
+ return "/ns/clusters/cluster/node?clusterId=" + clusterId + "&nodeId=" + nodeId
+ case "httpdns":
+ return "/httpdns/clusters/cluster/node?clusterId=" + clusterId + "&nodeId=" + nodeId
+ default:
+ return "#"
+ }
+ }
+
+ /**
+ * 判断节点升级是否已完成(成功)
+ */
+ this.isNodeUpgradeFinished = function (node) {
+ return node.installStatus != null && node.installStatus.isFinished && node.installStatus.isOk
+ }
+
+ /**
+ * 全选/取消全选
+ */
+ this.toggleCheckAll = function (cluster) {
+ if (cluster.nodes == null) return
+ let allChecked = that.isAllChecked(cluster)
+ cluster.nodes.forEach(function (node) {
+ if (!that.isNodeUpgradeFinished(node)) {
+ node.isChecked = !allChecked
+ }
+ })
+ }
+
+ /**
+ * 是否全部选中
+ */
+ this.isAllChecked = function (cluster) {
+ if (cluster.nodes == null || cluster.nodes.length == 0) return false
+ let checkableNodes = cluster.nodes.filter(function (node) {
+ return !that.isNodeUpgradeFinished(node)
+ })
+ if (checkableNodes.length == 0) return false
+ return checkableNodes.every(function (node) { return node.isChecked })
+ }
+
+ /**
+ * 计算集群内选中的节点数
+ */
+ this.countCheckedNodesInCluster = function (cluster) {
+ if (cluster.nodes == null) return 0
+ return cluster.nodes.filter(function (node) { return node.isChecked }).length
+ }
+
+ /**
+ * 全部升级
+ */
+ this.upgradeAll = function () {
+ var vue = this
+ teaweb.confirm("确定要升级所有模块的所有待升级节点吗?", function () {
+ vue.$post("/settings/upgrade/upgradeNode")
+ .params({
+ module: "",
+ scope: "all",
+ clusterId: 0,
+ nodeId: 0
+ })
+ .success(function () {
+ // 标记所有节点为升级中
+ that.modules.forEach(function (mod) {
+ if (mod.clusters != null) {
+ mod.clusters.forEach(function (cluster) {
+ if (cluster.nodes != null) {
+ cluster.nodes.forEach(function (node) {
+ node.installStatus = {
+ isRunning: true,
+ isFinished: false,
+ isOk: false,
+ error: "",
+ errorCode: ""
+ }
+ node.isUpgrading = true
+ that.trackNode(mod.code, node.id)
+ })
+ }
+ })
+ }
+ })
+ })
+ .fail(function (resp) {
+ teaweb.warn("升级请求失败:" + resp.message)
+ })
+ })
+ }
+
+ /**
+ * 按模块升级
+ */
+ this.upgradeModule = function (moduleCode) {
+ var vue = this
+ teaweb.confirm("确定要升级该模块的所有待升级节点吗?", function () {
+ vue.$post("/settings/upgrade/upgradeNode")
+ .params({
+ module: moduleCode,
+ scope: "module",
+ clusterId: 0,
+ nodeId: 0
+ })
+ .success(function () {
+ that.markModuleUpgrading(moduleCode)
+ })
+ .fail(function (resp) {
+ teaweb.warn("升级请求失败:" + resp.message)
+ })
+ })
+ }
+
+ /**
+ * 按集群升级
+ */
+ this.upgradeCluster = function (moduleCode, clusterId) {
+ var vue = this
+ teaweb.confirm("确定要升级该集群的所有待升级节点吗?", function () {
+ vue.$post("/settings/upgrade/upgradeNode")
+ .params({
+ module: moduleCode,
+ scope: "cluster",
+ clusterId: clusterId,
+ nodeId: 0
+ })
+ .success(function () {
+ that.markClusterUpgrading(moduleCode, clusterId)
+ })
+ .fail(function (resp) {
+ teaweb.warn("升级请求失败:" + resp.message)
+ })
+ })
+ }
+
+ /**
+ * 批量升级集群内选中的节点
+ */
+ this.upgradeBatchInCluster = function (moduleCode, cluster) {
+ if (cluster.nodes == null) return
+ var checkedNodes = cluster.nodes.filter(function (node) { return node.isChecked })
+ if (checkedNodes.length == 0) return
+
+ var vue = this
+ teaweb.confirm("确定要批量升级选中的 " + checkedNodes.length + " 个节点吗?", function () {
+ checkedNodes.forEach(function (node) {
+ node.installStatus = {
+ isRunning: true,
+ isFinished: false,
+ isOk: false,
+ error: "",
+ errorCode: ""
+ }
+ node.isUpgrading = true
+ node.isChecked = false
+ that.trackNode(moduleCode, node.id)
+
+ vue.$post("/settings/upgrade/upgradeNode")
+ .params({
+ module: moduleCode,
+ scope: "node",
+ clusterId: 0,
+ nodeId: node.id
+ })
+ })
+ })
+ }
+
+ /**
+ * 升级单个节点
+ */
+ this.upgradeNode = function (moduleCode, node) {
+ var vue = this
+ teaweb.confirm("确定要升级节点 \"" + node.name + "\" 吗?", function () {
+ node.installStatus = {
+ isRunning: true,
+ isFinished: false,
+ isOk: false,
+ error: "",
+ errorCode: ""
+ }
+ node.isUpgrading = true
+ that.trackNode(moduleCode, node.id)
+
+ vue.$post("/settings/upgrade/upgradeNode")
+ .params({
+ module: moduleCode,
+ scope: "node",
+ clusterId: 0,
+ nodeId: node.id
+ })
+ .success(function () { })
+ .fail(function (resp) {
+ node.isUpgrading = false
+ teaweb.warn("升级请求失败:" + resp.message)
+ })
+ })
+ }
+
+ /**
+ * 标记模块下所有节点为升级中
+ */
+ this.markModuleUpgrading = function (moduleCode) {
+ that.modules.forEach(function (mod) {
+ if (mod.code == moduleCode && mod.clusters != null) {
+ mod.clusters.forEach(function (cluster) {
+ if (cluster.nodes != null) {
+ cluster.nodes.forEach(function (node) {
+ node.installStatus = {
+ isRunning: true,
+ isFinished: false,
+ isOk: false,
+ error: "",
+ errorCode: ""
+ }
+ node.isUpgrading = true
+ that.trackNode(moduleCode, node.id)
+ })
+ }
+ })
+ }
+ })
+ }
+
+ /**
+ * 标记集群下所有节点为升级中
+ */
+ this.markClusterUpgrading = function (moduleCode, clusterId) {
+ that.modules.forEach(function (mod) {
+ if (mod.code == moduleCode && mod.clusters != null) {
+ mod.clusters.forEach(function (cluster) {
+ if (cluster.id == clusterId && cluster.nodes != null) {
+ cluster.nodes.forEach(function (node) {
+ node.installStatus = {
+ isRunning: true,
+ isFinished: false,
+ isOk: false,
+ error: "",
+ errorCode: ""
+ }
+ node.isUpgrading = true
+ that.trackNode(moduleCode, node.id)
+ })
+ }
+ })
+ }
+ })
+ }
+
+ /**
+ * 追踪节点升级状态
+ */
+ this.trackNode = function (moduleCode, nodeId) {
+ if (that.upgradingNodeIds[moduleCode] == null) {
+ that.upgradingNodeIds[moduleCode] = []
+ }
+ if (that.upgradingNodeIds[moduleCode].indexOf(nodeId) < 0) {
+ that.upgradingNodeIds[moduleCode].push(nodeId)
+ }
+ }
+
+ /**
+ * 状态轮询
+ */
+ this.pollStatus = function () {
+ var vue = this
+
+ // 检查是否有正在升级的节点
+ let hasUpgrading = false
+ for (let key in that.upgradingNodeIds) {
+ if (that.upgradingNodeIds[key].length > 0) {
+ hasUpgrading = true
+ break
+ }
+ }
+
+ if (!hasUpgrading) {
+ setTimeout(function () { that.pollStatus() }, 5000)
+ return
+ }
+
+ vue.$post("/settings/upgrade/status")
+ .params({
+ nodeIdsJSON: JSON.stringify(that.upgradingNodeIds)
+ })
+ .success(function (resp) {
+ let statuses = resp.data.statuses
+ if (statuses == null) {
+ return
+ }
+
+ // 更新各模块节点状态
+ for (let moduleCode in statuses) {
+ let nodeStatuses = statuses[moduleCode]
+ if (nodeStatuses == null) {
+ continue
+ }
+ nodeStatuses.forEach(function (ns) {
+ that.updateNodeStatus(moduleCode, ns.id, ns.installStatus)
+ })
+ }
+ })
+ .done(function () {
+ setTimeout(function () { that.pollStatus() }, 3000)
+ })
+ }
+
+ /**
+ * 更新节点安装状态
+ */
+ this.updateNodeStatus = function (moduleCode, nodeId, installStatus) {
+ that.modules.forEach(function (mod) {
+ if (mod.code == moduleCode && mod.clusters != null) {
+ mod.clusters.forEach(function (cluster) {
+ if (cluster.nodes != null) {
+ cluster.nodes.forEach(function (node) {
+ if (node.id == nodeId && installStatus != null) {
+ node.installStatus = installStatus
+ // 升级完成后移除跟踪
+ if (installStatus.isFinished) {
+ node.isUpgrading = false
+ let idx = that.upgradingNodeIds[moduleCode].indexOf(nodeId)
+ if (idx >= 0) {
+ that.upgradingNodeIds[moduleCode].splice(idx, 1)
+ }
+
+ if (installStatus.isOk) {
+ // 升级成功,延迟后从列表中移除
+ setTimeout(function () {
+ let nIdx = cluster.nodes.indexOf(node)
+ if (nIdx >= 0) {
+ cluster.nodes.splice(nIdx, 1)
+ cluster.count--
+ mod.count--
+ that.totalUpgradeCount--
+
+ if (cluster.count <= 0) {
+ let cIdx = mod.clusters.indexOf(cluster)
+ if (cIdx >= 0) {
+ mod.clusters.splice(cIdx, 1)
+ }
+ }
+ if (mod.count <= 0) {
+ let mIdx = that.modules.indexOf(mod)
+ if (mIdx >= 0) {
+ that.modules.splice(mIdx, 1)
+ }
+ }
+ }
+ }, 2000)
+ } else {
+ // 升级失败,根据 errorCode 给出具体提示
+ that.handleUpgradeError(moduleCode, node, installStatus)
+ }
+ }
+ }
+ })
+ }
+ })
+ }
+ })
+ }
+
+ /**
+ * 处理升级错误,根据 errorCode 提供更友好的提示
+ */
+ this.handleUpgradeError = function (moduleCode, node, installStatus) {
+ let errorCode = installStatus.errorCode || ""
+ let errMsg = installStatus.error || ""
+
+ switch (errorCode) {
+ case "EMPTY_LOGIN":
+ case "EMPTY_SSH_HOST":
+ case "EMPTY_SSH_PORT":
+ case "EMPTY_GRANT":
+ // SSH 信息未配置的错误,不弹窗(页面上已有"没有设置"提示)
+ break
+ case "CREATE_ROOT_DIRECTORY_FAILED":
+ teaweb.warn("节点 \"" + node.name + "\" 创建根目录失败:" + errMsg)
+ break
+ case "INSTALL_HELPER_FAILED":
+ teaweb.warn("节点 \"" + node.name + "\" 安装助手失败:" + errMsg)
+ break
+ case "TEST_FAILED":
+ teaweb.warn("节点 \"" + node.name + "\" 环境测试失败:" + errMsg)
+ break
+ case "RPC_TEST_FAILED":
+ teaweb.warn("节点 \"" + node.name + "\" RPC通讯测试失败:" + errMsg)
+ break
+ }
+ }
+
+ /**
+ * 更新自动升级状态
+ */
+ this.updateAutoUpgrade = function () {
+ var vue = this
+
+ // @change 已经翻转了值,先记录新值并立即恢复
+ let newValue = that.config.autoUpgrade
+ that.config.autoUpgrade = !newValue
+
+ let msg = newValue ? "确定要开启自动升级功能吗?开启后节点会自动下载安装新版本。" : "确定要关闭自动升级功能吗?关闭后只能通过这里手动执行升级。"
+ teaweb.confirm(msg, function () {
+ vue.$post("/settings/upgrade")
+ .params({
+ autoUpgrade: newValue ? 1 : 0
+ })
+ .success(function () {
+ that.config.autoUpgrade = newValue
+ teaweb.successToast("设置保存成功")
+ })
+ .fail(function (resp) {
+ teaweb.warn("设置保存失败:" + resp.message)
+ })
+ })
+ }
+})
diff --git a/EdgeAdmin/web/views/@default/users/createPopup.html b/EdgeAdmin/web/views/@default/users/createPopup.html
index 92ed641..63de930 100644
--- a/EdgeAdmin/web/views/@default/users/createPopup.html
+++ b/EdgeAdmin/web/views/@default/users/createPopup.html
@@ -39,7 +39,7 @@
- HTTPDNS关联集群
+ HTTPDNS关联集群
[未选择]
diff --git a/EdgeAdmin/web/views/@default/users/setting/index.css b/EdgeAdmin/web/views/@default/users/setting/index.css
index 98fa343..985fb65 100644
--- a/EdgeAdmin/web/views/@default/users/setting/index.css
+++ b/EdgeAdmin/web/views/@default/users/setting/index.css
@@ -1,3 +1,6 @@
+.ui.table.definition td.title {
+ min-width: 12em;
+}
.feature-boxes .feature-box {
margin-bottom: 1em;
width: 24em;
diff --git a/EdgeAdmin/web/views/@default/users/setting/index.html b/EdgeAdmin/web/views/@default/users/setting/index.html
index ea41281..1ac64cb 100644
--- a/EdgeAdmin/web/views/@default/users/setting/index.html
+++ b/EdgeAdmin/web/views/@default/users/setting/index.html
@@ -6,7 +6,7 @@
- 允许注册
+ 允许注册
@@ -40,7 +40,7 @@
登录设置
- 检查客户端区域
+ 检查客户端区域
- 启用电子邮箱绑定功能
+ 启用电子邮箱绑定功能
- 启用找回密码功能
+ 启用找回密码功能
@@ -146,7 +146,7 @@
手机号码相关
- 启用手机号码绑定功能
+ 启用手机号码绑定功能
- 开通CDN服务
+ 开通CDN服务
@@ -254,7 +254,7 @@
DDoS高防
- 开通DDoS高防管理
+ 开通DDoS高防管理
@@ -269,7 +269,7 @@
智能DNS服务
- 开通智能DNS服务
+ 开通智能DNS服务
@@ -284,7 +284,7 @@
HTTPDNS服务
- 开通HTTPDNS服务
+ 开通HTTPDNS服务
diff --git a/EdgeCommon/pkg/iplibrary/reader_maxmind.go b/EdgeCommon/pkg/iplibrary/reader_maxmind.go
index 15d3557..828198e 100644
--- a/EdgeCommon/pkg/iplibrary/reader_maxmind.go
+++ b/EdgeCommon/pkg/iplibrary/reader_maxmind.go
@@ -7,9 +7,7 @@ import (
"github.com/oschwald/geoip2-golang"
"net"
"os"
- "path/filepath"
"sync"
- "time"
)
// MaxMindReader MaxMind GeoIP2 Reader
@@ -19,6 +17,9 @@ type MaxMindReader struct {
meta *Meta
initialized bool
mutex sync.RWMutex
+
+ // 临时文件路径,Destroy 时自动清理
+ tmpFiles []string
}
// NewMaxMindReader 创建 MaxMind Reader
@@ -66,27 +67,9 @@ func NewMaxMindReaderFromBytes(cityDBData, asnDBData []byte) (*MaxMindReader, er
return nil, fmt.Errorf("city database data is required")
}
- // 创建临时文件,使用更唯一的文件名避免冲突
- tmpDir := os.TempDir()
- pid := os.Getpid()
- // 使用时间戳增加唯一性,避免同一进程多次调用时的冲突
- timestamp := time.Now().UnixNano()
- cityTmpFile := filepath.Join(tmpDir, fmt.Sprintf("geolite2-city-%d-%d.mmdb", pid, timestamp))
- asnTmpFile := filepath.Join(tmpDir, fmt.Sprintf("geolite2-asn-%d-%d.mmdb", pid, timestamp))
-
- // 如果临时文件已存在,先删除(可能是之前崩溃留下的)
- os.Remove(cityTmpFile)
- os.Remove(asnTmpFile)
-
- // 写入 City 数据库到临时文件
- if err := os.WriteFile(cityTmpFile, cityDBData, 0644); err != nil {
- return nil, fmt.Errorf("write city database to temp file failed: %w", err)
- }
-
- // 打开 City 数据库
- db, err := geoip2.Open(cityTmpFile)
+ // 直接从内存字节加载,避免在 /tmp 持续生成 mmdb 临时文件。
+ db, err := geoip2.FromBytes(cityDBData)
if err != nil {
- os.Remove(cityTmpFile)
return nil, fmt.Errorf("open MaxMind city database failed: %w", err)
}
@@ -94,16 +77,11 @@ func NewMaxMindReaderFromBytes(cityDBData, asnDBData []byte) (*MaxMindReader, er
db: db,
}
- // 写入并打开 ASN 数据库(可选)
+ // 加载 ASN 数据库(可选)
if len(asnDBData) > 0 {
- if err := os.WriteFile(asnTmpFile, asnDBData, 0644); err == nil {
- dbASN, err := geoip2.Open(asnTmpFile)
- if err == nil {
- reader.dbASN = dbASN
- } else {
- // ASN 数据库打开失败,清理临时文件但不影响主功能
- os.Remove(asnTmpFile)
- }
+ dbASN, err := geoip2.FromBytes(asnDBData)
+ if err == nil {
+ reader.dbASN = dbASN
}
}
@@ -174,7 +152,7 @@ func (this *MaxMindReader) Meta() *Meta {
return this.meta
}
-// Destroy 销毁 Reader
+// Destroy 销毁 Reader 并清理临时文件
func (this *MaxMindReader) Destroy() {
this.mutex.Lock()
defer this.mutex.Unlock()
@@ -187,6 +165,10 @@ func (this *MaxMindReader) Destroy() {
this.dbASN.Close()
this.dbASN = nil
}
+ for _, f := range this.tmpFiles {
+ os.Remove(f)
+ }
+ this.tmpFiles = nil
this.initialized = false
}
diff --git a/EdgeCommon/pkg/rpc/pb/model_httpdns_cluster.pb.go b/EdgeCommon/pkg/rpc/pb/model_httpdns_cluster.pb.go
index 55e3ef1..4a4935f 100644
--- a/EdgeCommon/pkg/rpc/pb/model_httpdns_cluster.pb.go
+++ b/EdgeCommon/pkg/rpc/pb/model_httpdns_cluster.pb.go
@@ -38,6 +38,7 @@ type HTTPDNSCluster struct {
UpdatedAt int64 `protobuf:"varint,11,opt,name=updatedAt,proto3" json:"updatedAt,omitempty"`
AutoRemoteStart bool `protobuf:"varint,12,opt,name=autoRemoteStart,proto3" json:"autoRemoteStart,omitempty"`
AccessLogIsOn bool `protobuf:"varint,13,opt,name=accessLogIsOn,proto3" json:"accessLogIsOn,omitempty"`
+ TimeZone string `protobuf:"bytes,14,opt,name=timeZone,proto3" json:"timeZone,omitempty"`
}
func (x *HTTPDNSCluster) Reset() {
@@ -161,6 +162,13 @@ func (x *HTTPDNSCluster) GetAccessLogIsOn() bool {
return false
}
+func (x *HTTPDNSCluster) GetTimeZone() string {
+ if x != nil {
+ return x.TimeZone
+ }
+ return ""
+}
+
var File_models_model_httpdns_cluster_proto protoreflect.FileDescriptor
var file_models_model_httpdns_cluster_proto_rawDesc = []byte{
diff --git a/EdgeCommon/pkg/rpc/pb/service_httpdns_cluster.pb.go b/EdgeCommon/pkg/rpc/pb/service_httpdns_cluster.pb.go
index 970c13c..8120273 100644
--- a/EdgeCommon/pkg/rpc/pb/service_httpdns_cluster.pb.go
+++ b/EdgeCommon/pkg/rpc/pb/service_httpdns_cluster.pb.go
@@ -35,6 +35,7 @@ type CreateHTTPDNSClusterRequest struct {
IsDefault bool `protobuf:"varint,8,opt,name=isDefault,proto3" json:"isDefault,omitempty"`
AutoRemoteStart bool `protobuf:"varint,9,opt,name=autoRemoteStart,proto3" json:"autoRemoteStart,omitempty"`
AccessLogIsOn bool `protobuf:"varint,10,opt,name=accessLogIsOn,proto3" json:"accessLogIsOn,omitempty"`
+ TimeZone string `protobuf:"bytes,11,opt,name=timeZone,proto3" json:"timeZone,omitempty"`
}
func (x *CreateHTTPDNSClusterRequest) Reset() {
@@ -137,6 +138,13 @@ func (x *CreateHTTPDNSClusterRequest) GetAccessLogIsOn() bool {
return false
}
+func (x *CreateHTTPDNSClusterRequest) GetTimeZone() string {
+ if x != nil {
+ return x.TimeZone
+ }
+ return ""
+}
+
type CreateHTTPDNSClusterResponse struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
@@ -198,6 +206,7 @@ type UpdateHTTPDNSClusterRequest struct {
IsDefault bool `protobuf:"varint,9,opt,name=isDefault,proto3" json:"isDefault,omitempty"`
AutoRemoteStart bool `protobuf:"varint,10,opt,name=autoRemoteStart,proto3" json:"autoRemoteStart,omitempty"`
AccessLogIsOn bool `protobuf:"varint,11,opt,name=accessLogIsOn,proto3" json:"accessLogIsOn,omitempty"`
+ TimeZone string `protobuf:"bytes,12,opt,name=timeZone,proto3" json:"timeZone,omitempty"`
}
func (x *UpdateHTTPDNSClusterRequest) Reset() {
@@ -307,6 +316,13 @@ func (x *UpdateHTTPDNSClusterRequest) GetAccessLogIsOn() bool {
return false
}
+func (x *UpdateHTTPDNSClusterRequest) GetTimeZone() string {
+ if x != nil {
+ return x.TimeZone
+ }
+ return ""
+}
+
type DeleteHTTPDNSClusterRequest struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
diff --git a/EdgeCommon/pkg/rpc/pb/service_httpdns_node_grpc.pb.go b/EdgeCommon/pkg/rpc/pb/service_httpdns_node_grpc.pb.go
index 31b3576..3f40be0 100644
--- a/EdgeCommon/pkg/rpc/pb/service_httpdns_node_grpc.pb.go
+++ b/EdgeCommon/pkg/rpc/pb/service_httpdns_node_grpc.pb.go
@@ -27,7 +27,10 @@ const (
HTTPDNSNodeService_UpdateHTTPDNSNodeStatus_FullMethodName = "/pb.HTTPDNSNodeService/updateHTTPDNSNodeStatus"
HTTPDNSNodeService_UpdateHTTPDNSNodeLogin_FullMethodName = "/pb.HTTPDNSNodeService/updateHTTPDNSNodeLogin"
HTTPDNSNodeService_CheckHTTPDNSNodeLatestVersion_FullMethodName = "/pb.HTTPDNSNodeService/checkHTTPDNSNodeLatestVersion"
- HTTPDNSNodeService_DownloadHTTPDNSNodeInstallationFile_FullMethodName = "/pb.HTTPDNSNodeService/downloadHTTPDNSNodeInstallationFile"
+ HTTPDNSNodeService_DownloadHTTPDNSNodeInstallationFile_FullMethodName = "/pb.HTTPDNSNodeService/downloadHTTPDNSNodeInstallationFile"
+ HTTPDNSNodeService_CountAllUpgradeHTTPDNSNodesWithClusterId_FullMethodName = "/pb.HTTPDNSNodeService/countAllUpgradeHTTPDNSNodesWithClusterId"
+ HTTPDNSNodeService_FindAllUpgradeHTTPDNSNodesWithClusterId_FullMethodName = "/pb.HTTPDNSNodeService/findAllUpgradeHTTPDNSNodesWithClusterId"
+ HTTPDNSNodeService_UpgradeHTTPDNSNode_FullMethodName = "/pb.HTTPDNSNodeService/upgradeHTTPDNSNode"
)
// HTTPDNSNodeServiceClient is the client API for HTTPDNSNodeService service.
@@ -46,6 +49,12 @@ type HTTPDNSNodeServiceClient interface {
CheckHTTPDNSNodeLatestVersion(ctx context.Context, in *CheckHTTPDNSNodeLatestVersionRequest, opts ...grpc.CallOption) (*CheckHTTPDNSNodeLatestVersionResponse, error)
// 下载最新HTTPDNS节点安装文件
DownloadHTTPDNSNodeInstallationFile(ctx context.Context, in *DownloadHTTPDNSNodeInstallationFileRequest, opts ...grpc.CallOption) (*DownloadHTTPDNSNodeInstallationFileResponse, error)
+ // 计算需要升级的HTTPDNS节点数量
+ CountAllUpgradeHTTPDNSNodesWithClusterId(ctx context.Context, in *CountAllUpgradeHTTPDNSNodesWithClusterIdRequest, opts ...grpc.CallOption) (*RPCCountResponse, error)
+ // 列出所有需要升级的HTTPDNS节点
+ FindAllUpgradeHTTPDNSNodesWithClusterId(ctx context.Context, in *FindAllUpgradeHTTPDNSNodesWithClusterIdRequest, opts ...grpc.CallOption) (*FindAllUpgradeHTTPDNSNodesWithClusterIdResponse, error)
+ // 升级单个HTTPDNS节点
+ UpgradeHTTPDNSNode(ctx context.Context, in *UpgradeHTTPDNSNodeRequest, opts ...grpc.CallOption) (*RPCSuccess, error)
}
type hTTPDNSNodeServiceClient struct {
@@ -146,6 +155,36 @@ func (c *hTTPDNSNodeServiceClient) DownloadHTTPDNSNodeInstallationFile(ctx conte
return out, nil
}
+func (c *hTTPDNSNodeServiceClient) CountAllUpgradeHTTPDNSNodesWithClusterId(ctx context.Context, in *CountAllUpgradeHTTPDNSNodesWithClusterIdRequest, opts ...grpc.CallOption) (*RPCCountResponse, error) {
+ cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
+ out := new(RPCCountResponse)
+ err := c.cc.Invoke(ctx, HTTPDNSNodeService_CountAllUpgradeHTTPDNSNodesWithClusterId_FullMethodName, in, out, cOpts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
+func (c *hTTPDNSNodeServiceClient) FindAllUpgradeHTTPDNSNodesWithClusterId(ctx context.Context, in *FindAllUpgradeHTTPDNSNodesWithClusterIdRequest, opts ...grpc.CallOption) (*FindAllUpgradeHTTPDNSNodesWithClusterIdResponse, error) {
+ cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
+ out := new(FindAllUpgradeHTTPDNSNodesWithClusterIdResponse)
+ err := c.cc.Invoke(ctx, HTTPDNSNodeService_FindAllUpgradeHTTPDNSNodesWithClusterId_FullMethodName, in, out, cOpts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
+func (c *hTTPDNSNodeServiceClient) UpgradeHTTPDNSNode(ctx context.Context, in *UpgradeHTTPDNSNodeRequest, opts ...grpc.CallOption) (*RPCSuccess, error) {
+ cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
+ out := new(RPCSuccess)
+ err := c.cc.Invoke(ctx, HTTPDNSNodeService_UpgradeHTTPDNSNode_FullMethodName, in, out, cOpts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
// HTTPDNSNodeServiceServer is the server API for HTTPDNSNodeService service.
// All implementations must embed UnimplementedHTTPDNSNodeServiceServer
// for forward compatibility.
@@ -162,6 +201,12 @@ type HTTPDNSNodeServiceServer interface {
CheckHTTPDNSNodeLatestVersion(context.Context, *CheckHTTPDNSNodeLatestVersionRequest) (*CheckHTTPDNSNodeLatestVersionResponse, error)
// 下载最新HTTPDNS节点安装文件
DownloadHTTPDNSNodeInstallationFile(context.Context, *DownloadHTTPDNSNodeInstallationFileRequest) (*DownloadHTTPDNSNodeInstallationFileResponse, error)
+ // 计算需要升级的HTTPDNS节点数量
+ CountAllUpgradeHTTPDNSNodesWithClusterId(context.Context, *CountAllUpgradeHTTPDNSNodesWithClusterIdRequest) (*RPCCountResponse, error)
+ // 列出所有需要升级的HTTPDNS节点
+ FindAllUpgradeHTTPDNSNodesWithClusterId(context.Context, *FindAllUpgradeHTTPDNSNodesWithClusterIdRequest) (*FindAllUpgradeHTTPDNSNodesWithClusterIdResponse, error)
+ // 升级单个HTTPDNS节点
+ UpgradeHTTPDNSNode(context.Context, *UpgradeHTTPDNSNodeRequest) (*RPCSuccess, error)
mustEmbedUnimplementedHTTPDNSNodeServiceServer()
}
@@ -199,6 +244,15 @@ func (UnimplementedHTTPDNSNodeServiceServer) CheckHTTPDNSNodeLatestVersion(conte
func (UnimplementedHTTPDNSNodeServiceServer) DownloadHTTPDNSNodeInstallationFile(context.Context, *DownloadHTTPDNSNodeInstallationFileRequest) (*DownloadHTTPDNSNodeInstallationFileResponse, error) {
return nil, status.Error(codes.Unimplemented, "method DownloadHTTPDNSNodeInstallationFile not implemented")
}
+func (UnimplementedHTTPDNSNodeServiceServer) CountAllUpgradeHTTPDNSNodesWithClusterId(context.Context, *CountAllUpgradeHTTPDNSNodesWithClusterIdRequest) (*RPCCountResponse, error) {
+ return nil, status.Error(codes.Unimplemented, "method CountAllUpgradeHTTPDNSNodesWithClusterId not implemented")
+}
+func (UnimplementedHTTPDNSNodeServiceServer) FindAllUpgradeHTTPDNSNodesWithClusterId(context.Context, *FindAllUpgradeHTTPDNSNodesWithClusterIdRequest) (*FindAllUpgradeHTTPDNSNodesWithClusterIdResponse, error) {
+ return nil, status.Error(codes.Unimplemented, "method FindAllUpgradeHTTPDNSNodesWithClusterId not implemented")
+}
+func (UnimplementedHTTPDNSNodeServiceServer) UpgradeHTTPDNSNode(context.Context, *UpgradeHTTPDNSNodeRequest) (*RPCSuccess, error) {
+ return nil, status.Error(codes.Unimplemented, "method UpgradeHTTPDNSNode not implemented")
+}
func (UnimplementedHTTPDNSNodeServiceServer) mustEmbedUnimplementedHTTPDNSNodeServiceServer() {}
func (UnimplementedHTTPDNSNodeServiceServer) testEmbeddedByValue() {}
@@ -382,6 +436,60 @@ func _HTTPDNSNodeService_DownloadHTTPDNSNodeInstallationFile_Handler(srv interfa
return interceptor(ctx, in, info, handler)
}
+func _HTTPDNSNodeService_CountAllUpgradeHTTPDNSNodesWithClusterId_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(CountAllUpgradeHTTPDNSNodesWithClusterIdRequest)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(HTTPDNSNodeServiceServer).CountAllUpgradeHTTPDNSNodesWithClusterId(ctx, in)
+ }
+ info := &grpc.UnaryServerInfo{
+ Server: srv,
+ FullMethod: HTTPDNSNodeService_CountAllUpgradeHTTPDNSNodesWithClusterId_FullMethodName,
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(HTTPDNSNodeServiceServer).CountAllUpgradeHTTPDNSNodesWithClusterId(ctx, req.(*CountAllUpgradeHTTPDNSNodesWithClusterIdRequest))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
+func _HTTPDNSNodeService_FindAllUpgradeHTTPDNSNodesWithClusterId_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(FindAllUpgradeHTTPDNSNodesWithClusterIdRequest)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(HTTPDNSNodeServiceServer).FindAllUpgradeHTTPDNSNodesWithClusterId(ctx, in)
+ }
+ info := &grpc.UnaryServerInfo{
+ Server: srv,
+ FullMethod: HTTPDNSNodeService_FindAllUpgradeHTTPDNSNodesWithClusterId_FullMethodName,
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(HTTPDNSNodeServiceServer).FindAllUpgradeHTTPDNSNodesWithClusterId(ctx, req.(*FindAllUpgradeHTTPDNSNodesWithClusterIdRequest))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
+func _HTTPDNSNodeService_UpgradeHTTPDNSNode_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(UpgradeHTTPDNSNodeRequest)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(HTTPDNSNodeServiceServer).UpgradeHTTPDNSNode(ctx, in)
+ }
+ info := &grpc.UnaryServerInfo{
+ Server: srv,
+ FullMethod: HTTPDNSNodeService_UpgradeHTTPDNSNode_FullMethodName,
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(HTTPDNSNodeServiceServer).UpgradeHTTPDNSNode(ctx, req.(*UpgradeHTTPDNSNodeRequest))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
// HTTPDNSNodeService_ServiceDesc is the grpc.ServiceDesc for HTTPDNSNodeService service.
// It's only intended for direct use with grpc.RegisterService,
// and not to be introspected or modified (even as a copy)
@@ -425,6 +533,18 @@ var HTTPDNSNodeService_ServiceDesc = grpc.ServiceDesc{
MethodName: "downloadHTTPDNSNodeInstallationFile",
Handler: _HTTPDNSNodeService_DownloadHTTPDNSNodeInstallationFile_Handler,
},
+ {
+ MethodName: "countAllUpgradeHTTPDNSNodesWithClusterId",
+ Handler: _HTTPDNSNodeService_CountAllUpgradeHTTPDNSNodesWithClusterId_Handler,
+ },
+ {
+ MethodName: "findAllUpgradeHTTPDNSNodesWithClusterId",
+ Handler: _HTTPDNSNodeService_FindAllUpgradeHTTPDNSNodesWithClusterId_Handler,
+ },
+ {
+ MethodName: "upgradeHTTPDNSNode",
+ Handler: _HTTPDNSNodeService_UpgradeHTTPDNSNode_Handler,
+ },
},
Streams: []grpc.StreamDesc{},
Metadata: "service_httpdns_node.proto",
diff --git a/EdgeCommon/pkg/rpc/pb/service_ns_node_grpc.pb.go b/EdgeCommon/pkg/rpc/pb/service_ns_node_grpc.pb.go
index 97acd0d..faf19a1 100644
--- a/EdgeCommon/pkg/rpc/pb/service_ns_node_grpc.pb.go
+++ b/EdgeCommon/pkg/rpc/pb/service_ns_node_grpc.pb.go
@@ -46,6 +46,8 @@ const (
NSNodeService_UpdateNSNodeDDoSProtection_FullMethodName = "/pb.NSNodeService/updateNSNodeDDoSProtection"
NSNodeService_FindNSNodeAPIConfig_FullMethodName = "/pb.NSNodeService/findNSNodeAPIConfig"
NSNodeService_UpdateNSNodeAPIConfig_FullMethodName = "/pb.NSNodeService/updateNSNodeAPIConfig"
+ NSNodeService_FindAllUpgradeNSNodesWithNSClusterId_FullMethodName = "/pb.NSNodeService/findAllUpgradeNSNodesWithNSClusterId"
+ NSNodeService_UpgradeNSNode_FullMethodName = "/pb.NSNodeService/upgradeNSNode"
)
// NSNodeServiceClient is the client API for NSNodeService service.
@@ -108,6 +110,10 @@ type NSNodeServiceClient interface {
FindNSNodeAPIConfig(ctx context.Context, in *FindNSNodeAPIConfigRequest, opts ...grpc.CallOption) (*FindNSNodeAPIConfigResponse, error)
// 修改某个节点的API相关配置
UpdateNSNodeAPIConfig(ctx context.Context, in *UpdateNSNodeAPIConfigRequest, opts ...grpc.CallOption) (*RPCSuccess, error)
+ // 列出所有需要升级的NS节点
+ FindAllUpgradeNSNodesWithNSClusterId(ctx context.Context, in *FindAllUpgradeNSNodesWithNSClusterIdRequest, opts ...grpc.CallOption) (*FindAllUpgradeNSNodesWithNSClusterIdResponse, error)
+ // 升级单个NS节点
+ UpgradeNSNode(ctx context.Context, in *UpgradeNSNodeRequest, opts ...grpc.CallOption) (*RPCSuccess, error)
}
type nSNodeServiceClient struct {
@@ -391,6 +397,26 @@ func (c *nSNodeServiceClient) UpdateNSNodeAPIConfig(ctx context.Context, in *Upd
return out, nil
}
+func (c *nSNodeServiceClient) FindAllUpgradeNSNodesWithNSClusterId(ctx context.Context, in *FindAllUpgradeNSNodesWithNSClusterIdRequest, opts ...grpc.CallOption) (*FindAllUpgradeNSNodesWithNSClusterIdResponse, error) {
+ cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
+ out := new(FindAllUpgradeNSNodesWithNSClusterIdResponse)
+ err := c.cc.Invoke(ctx, NSNodeService_FindAllUpgradeNSNodesWithNSClusterId_FullMethodName, in, out, cOpts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
+func (c *nSNodeServiceClient) UpgradeNSNode(ctx context.Context, in *UpgradeNSNodeRequest, opts ...grpc.CallOption) (*RPCSuccess, error) {
+ cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
+ out := new(RPCSuccess)
+ err := c.cc.Invoke(ctx, NSNodeService_UpgradeNSNode_FullMethodName, in, out, cOpts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
// NSNodeServiceServer is the server API for NSNodeService service.
// All implementations should embed UnimplementedNSNodeServiceServer
// for forward compatibility.
@@ -451,6 +477,10 @@ type NSNodeServiceServer interface {
FindNSNodeAPIConfig(context.Context, *FindNSNodeAPIConfigRequest) (*FindNSNodeAPIConfigResponse, error)
// 修改某个节点的API相关配置
UpdateNSNodeAPIConfig(context.Context, *UpdateNSNodeAPIConfigRequest) (*RPCSuccess, error)
+ // 列出所有需要升级的NS节点
+ FindAllUpgradeNSNodesWithNSClusterId(context.Context, *FindAllUpgradeNSNodesWithNSClusterIdRequest) (*FindAllUpgradeNSNodesWithNSClusterIdResponse, error)
+ // 升级单个NS节点
+ UpgradeNSNode(context.Context, *UpgradeNSNodeRequest) (*RPCSuccess, error)
}
// UnimplementedNSNodeServiceServer should be embedded to have
@@ -541,6 +571,12 @@ func (UnimplementedNSNodeServiceServer) FindNSNodeAPIConfig(context.Context, *Fi
func (UnimplementedNSNodeServiceServer) UpdateNSNodeAPIConfig(context.Context, *UpdateNSNodeAPIConfigRequest) (*RPCSuccess, error) {
return nil, status.Errorf(codes.Unimplemented, "method UpdateNSNodeAPIConfig not implemented")
}
+func (UnimplementedNSNodeServiceServer) FindAllUpgradeNSNodesWithNSClusterId(context.Context, *FindAllUpgradeNSNodesWithNSClusterIdRequest) (*FindAllUpgradeNSNodesWithNSClusterIdResponse, error) {
+ return nil, status.Errorf(codes.Unimplemented, "method FindAllUpgradeNSNodesWithNSClusterId not implemented")
+}
+func (UnimplementedNSNodeServiceServer) UpgradeNSNode(context.Context, *UpgradeNSNodeRequest) (*RPCSuccess, error) {
+ return nil, status.Errorf(codes.Unimplemented, "method UpgradeNSNode not implemented")
+}
func (UnimplementedNSNodeServiceServer) testEmbeddedByValue() {}
// UnsafeNSNodeServiceServer may be embedded to opt out of forward compatibility for this service.
@@ -1036,6 +1072,42 @@ func _NSNodeService_UpdateNSNodeAPIConfig_Handler(srv interface{}, ctx context.C
return interceptor(ctx, in, info, handler)
}
+func _NSNodeService_FindAllUpgradeNSNodesWithNSClusterId_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(FindAllUpgradeNSNodesWithNSClusterIdRequest)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(NSNodeServiceServer).FindAllUpgradeNSNodesWithNSClusterId(ctx, in)
+ }
+ info := &grpc.UnaryServerInfo{
+ Server: srv,
+ FullMethod: NSNodeService_FindAllUpgradeNSNodesWithNSClusterId_FullMethodName,
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(NSNodeServiceServer).FindAllUpgradeNSNodesWithNSClusterId(ctx, req.(*FindAllUpgradeNSNodesWithNSClusterIdRequest))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
+func _NSNodeService_UpgradeNSNode_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(UpgradeNSNodeRequest)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(NSNodeServiceServer).UpgradeNSNode(ctx, in)
+ }
+ info := &grpc.UnaryServerInfo{
+ Server: srv,
+ FullMethod: NSNodeService_UpgradeNSNode_FullMethodName,
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(NSNodeServiceServer).UpgradeNSNode(ctx, req.(*UpgradeNSNodeRequest))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
// NSNodeService_ServiceDesc is the grpc.ServiceDesc for NSNodeService service.
// It's only intended for direct use with grpc.RegisterService,
// and not to be introspected or modified (even as a copy)
@@ -1147,6 +1219,14 @@ var NSNodeService_ServiceDesc = grpc.ServiceDesc{
MethodName: "updateNSNodeAPIConfig",
Handler: _NSNodeService_UpdateNSNodeAPIConfig_Handler,
},
+ {
+ MethodName: "findAllUpgradeNSNodesWithNSClusterId",
+ Handler: _NSNodeService_FindAllUpgradeNSNodesWithNSClusterId_Handler,
+ },
+ {
+ MethodName: "upgradeNSNode",
+ Handler: _NSNodeService_UpgradeNSNode_Handler,
+ },
},
Streams: []grpc.StreamDesc{
{
diff --git a/EdgeCommon/pkg/rpc/protos/models/model_httpdns_cluster.proto b/EdgeCommon/pkg/rpc/protos/models/model_httpdns_cluster.proto
index a32dcc5..3f38b02 100644
--- a/EdgeCommon/pkg/rpc/protos/models/model_httpdns_cluster.proto
+++ b/EdgeCommon/pkg/rpc/protos/models/model_httpdns_cluster.proto
@@ -17,4 +17,5 @@ message HTTPDNSCluster {
int64 updatedAt = 11;
bool autoRemoteStart = 12;
bool accessLogIsOn = 13;
+ string timeZone = 14;
}
diff --git a/EdgeCommon/pkg/rpc/protos/service_httpdns_cluster.proto b/EdgeCommon/pkg/rpc/protos/service_httpdns_cluster.proto
index 8aae475..9167467 100644
--- a/EdgeCommon/pkg/rpc/protos/service_httpdns_cluster.proto
+++ b/EdgeCommon/pkg/rpc/protos/service_httpdns_cluster.proto
@@ -29,6 +29,7 @@ message CreateHTTPDNSClusterRequest {
bool isDefault = 8;
bool autoRemoteStart = 9;
bool accessLogIsOn = 10;
+ string timeZone = 11;
}
message CreateHTTPDNSClusterResponse {
@@ -47,6 +48,7 @@ message UpdateHTTPDNSClusterRequest {
bool isDefault = 9;
bool autoRemoteStart = 10;
bool accessLogIsOn = 11;
+ string timeZone = 12;
}
message DeleteHTTPDNSClusterRequest {
diff --git a/EdgeCommon/pkg/rpc/protos/service_httpdns_node.proto b/EdgeCommon/pkg/rpc/protos/service_httpdns_node.proto
index 53b8b4c..052a6f7 100644
--- a/EdgeCommon/pkg/rpc/protos/service_httpdns_node.proto
+++ b/EdgeCommon/pkg/rpc/protos/service_httpdns_node.proto
@@ -22,6 +22,15 @@ service HTTPDNSNodeService {
// 下载最新HTTPDNS节点安装文件
rpc downloadHTTPDNSNodeInstallationFile (DownloadHTTPDNSNodeInstallationFileRequest) returns (DownloadHTTPDNSNodeInstallationFileResponse);
+
+ // 计算需要升级的HTTPDNS节点数量
+ rpc countAllUpgradeHTTPDNSNodesWithClusterId (CountAllUpgradeHTTPDNSNodesWithClusterIdRequest) returns (RPCCountResponse);
+
+ // 列出所有需要升级的HTTPDNS节点
+ rpc findAllUpgradeHTTPDNSNodesWithClusterId (FindAllUpgradeHTTPDNSNodesWithClusterIdRequest) returns (FindAllUpgradeHTTPDNSNodesWithClusterIdResponse);
+
+ // 升级单个HTTPDNS节点
+ rpc upgradeHTTPDNSNode (UpgradeHTTPDNSNodeRequest) returns (RPCSuccess);
}
message CreateHTTPDNSNodeRequest {
@@ -103,3 +112,30 @@ message DownloadHTTPDNSNodeInstallationFileResponse {
string version = 4;
string filename = 5;
}
+
+// 计算需要升级的HTTPDNS节点数量
+message CountAllUpgradeHTTPDNSNodesWithClusterIdRequest {
+ int64 clusterId = 1;
+}
+
+// 列出所有需要升级的HTTPDNS节点
+message FindAllUpgradeHTTPDNSNodesWithClusterIdRequest {
+ int64 clusterId = 1;
+}
+
+message FindAllUpgradeHTTPDNSNodesWithClusterIdResponse {
+ repeated HTTPDNSNodeUpgrade nodes = 1;
+
+ message HTTPDNSNodeUpgrade {
+ HTTPDNSNode node = 1;
+ string os = 2;
+ string arch = 3;
+ string oldVersion = 4;
+ string newVersion = 5;
+ }
+}
+
+// 升级单个HTTPDNS节点
+message UpgradeHTTPDNSNodeRequest {
+ int64 nodeId = 1;
+}
diff --git a/EdgeCommon/pkg/rpc/protos/service_ns_node.proto b/EdgeCommon/pkg/rpc/protos/service_ns_node.proto
index 0bed186..2546c88 100644
--- a/EdgeCommon/pkg/rpc/protos/service_ns_node.proto
+++ b/EdgeCommon/pkg/rpc/protos/service_ns_node.proto
@@ -25,6 +25,12 @@ service NSNodeService {
// 计算需要升级的NS节点数量
rpc countAllUpgradeNSNodesWithNSClusterId (CountAllUpgradeNSNodesWithNSClusterIdRequest) returns (RPCCountResponse);
+ // 列出所有需要升级的NS节点
+ rpc findAllUpgradeNSNodesWithNSClusterId (FindAllUpgradeNSNodesWithNSClusterIdRequest) returns (FindAllUpgradeNSNodesWithNSClusterIdResponse);
+
+ // 升级单个NS节点
+ rpc upgradeNSNode (UpgradeNSNodeRequest) returns (RPCSuccess);
+
// 创建NS节点
rpc createNSNode (CreateNSNodeRequest) returns (CreateNSNodeResponse);
@@ -316,4 +322,26 @@ message FindNSNodeAPIConfigResponse {
message UpdateNSNodeAPIConfigRequest {
int64 nsNodeId = 1;
bytes apiNodeAddrsJSON = 2;
+}
+
+// 列出所有需要升级的NS节点
+message FindAllUpgradeNSNodesWithNSClusterIdRequest {
+ int64 nsClusterId = 1;
+}
+
+message FindAllUpgradeNSNodesWithNSClusterIdResponse {
+ repeated NSNodeUpgrade nodes = 1;
+
+ message NSNodeUpgrade {
+ NSNode nsNode = 1;
+ string os = 2;
+ string arch = 3;
+ string oldVersion = 4;
+ string newVersion = 5;
+ }
+}
+
+// 升级单个NS节点
+message UpgradeNSNodeRequest {
+ int64 nsNodeId = 1;
}
\ No newline at end of file
diff --git a/EdgeCommon/pkg/systemconfigs/settings.go b/EdgeCommon/pkg/systemconfigs/settings.go
index e7578b3..26f3f7a 100644
--- a/EdgeCommon/pkg/systemconfigs/settings.go
+++ b/EdgeCommon/pkg/systemconfigs/settings.go
@@ -17,4 +17,5 @@ const (
SettingCodeStandaloneInstanceInitialized SettingCode = "standaloneInstanceInitialized" // 单体实例初始化状态
SettingCodeHTTPDNSDefaultBackupClusterId SettingCode = "httpdnsDefaultBackupClusterId" // HTTPDNS默认备用集群ID
+ SettingCodeUpgradeConfig SettingCode = "upgradeConfig" // 升级设置
)
diff --git a/EdgeCommon/pkg/userconfigs/user_features.go b/EdgeCommon/pkg/userconfigs/user_features.go
index 9afcde0..84a3fb9 100644
--- a/EdgeCommon/pkg/userconfigs/user_features.go
+++ b/EdgeCommon/pkg/userconfigs/user_features.go
@@ -58,7 +58,7 @@ func (this *UserFeature) ToPB() *pb.UserFeature {
func FindAllUserFeatures() []*UserFeature {
return []*UserFeature{
{
- Name: "记录访问日志",
+ Name: "访问日志记录",
Code: UserFeatureCodeServerAccessLog,
Description: "用户可以开启服务的访问日志。",
SupportPlan: true,
@@ -106,7 +106,7 @@ func FindAllUserFeatures() []*UserFeature {
SupportPlan: false,
},
{
- Name: "开启WAF",
+ Name: "WAF",
Code: UserFeatureCodeServerWAF,
Description: "用户可以开启WAF功能并可以设置黑白名单等。",
SupportPlan: true,
@@ -136,7 +136,7 @@ func FindAllUserFeatures() []*UserFeature {
SupportPlan: true,
},
{
- Name: "页面优化",
+ Name: "页面动态加密",
Code: UserFeatureCodeServerOptimization,
Description: "用户可以开启页面优化功能。",
SupportPlan: true,
diff --git a/EdgeDNS/internal/const/const.go b/EdgeDNS/internal/const/const.go
index bae51c9..1770316 100644
--- a/EdgeDNS/internal/const/const.go
+++ b/EdgeDNS/internal/const/const.go
@@ -1,7 +1,7 @@
package teaconst
const (
- Version = "1.4.8" //1.3.8.2
+ Version = "1.4.9" //1.3.8.2
ProductName = "Edge DNS"
ProcessName = "edge-dns"
diff --git a/EdgeHttpDNS/Changelog及升级指南_v1.4.8.txt b/EdgeHttpDNS/Changelog及升级指南_v1.4.8.txt
deleted file mode 100644
index 7ef524d..0000000
--- a/EdgeHttpDNS/Changelog及升级指南_v1.4.8.txt
+++ /dev/null
@@ -1,64 +0,0 @@
-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 边缘节点也已同步更新至配套版本(会自动升级)。
diff --git a/EdgeHttpDNS/HTTPDNS主计划-V1.2.md b/EdgeHttpDNS/HTTPDNS主计划-V1.2.md
deleted file mode 100644
index 40879b5..0000000
--- a/EdgeHttpDNS/HTTPDNS主计划-V1.2.md
+++ /dev/null
@@ -1,147 +0,0 @@
-# HTTPDNS 主计划(V1.2 现行设计)
-
-## 1. 目标
-1. 构建独立的 HTTPDNS 管理闭环:集群、应用、域名、自定义解析、访问日志、运行日志、解析测试。
-2. 方案以当前已确认的页面与交互为准,不保留历史分支设计。
-3. 优先保证可运维、可灰度、可观测,先落地稳定版本。
-
-## 2. 信息架构(菜单)
-1. 左侧 HTTPDNS 菜单顺序:
- - 集群管理
- - 应用管理
- - 访问日志
- - 运行日志
- - 解析测试
-2. 不再保留独立“全局配置”菜单。
-3. 不再保留独立“SDK接入引导”菜单。
-
-## 3. 核心设计约束
-1. SNI 防护策略固定为“隐匿 SNI”(不提供 level1/level3、mask/empty切换入口)。
-2. 服务入口按“集群服务域名”管理,不使用全局单入口。
-3. 回源协议默认 HTTPS,不提供开关。
-4. 域名校验默认开启,不在用户侧暴露开关。
-5. 自定义解析先做精简版:不支持 SDNS 参数匹配。
-
-## 4. 集群管理
-
-### 4.1 集群列表
-1. 字段:集群名称、服务域名、节点数、在线节点数、状态、操作。
-2. 操作:节点列表、集群设置、删除集群。
-
-### 4.2 节点列表
-1. 字段:节点名称、IP、CPU、内存、负载、状态、操作。
-2. IP 列不展示“[下线]/[宕机]”附加标识。
-
-### 4.3 集群设置
-1. 页面布局对齐智能DNS:左侧菜单 + 右侧配置区(`left-box with-menu` / `right-box with-menu`)。
-2. 配置分组:
- - 基础设置
- - TLS
-3. 基础设置字段:
- - 集群名称
- - 服务域名
- - 默认解析 TTL(秒)
- - 降级超时容忍度(毫秒)
- - 节点安装根目录(默认 `/opt/edge-httpdns`)
- - 启用当前集群
- - 默认集群(勾选)
-4. TLS 配置:
- - 样式与交互对齐智能DNS TLS页
- - 维护并绑定该集群服务域名使用的证书
- - 保证节点回源链路为 HTTPS
-
-## 5. 应用管理
-
-### 5.1 应用列表
-1. 字段:应用名称、AppID、绑定域名数、状态、操作。
-2. 操作:域名列表、应用设置、SDK集成、删除应用。
-3. 删除应用页面交互风格对齐“删除集群”页面。
-
-### 5.2 应用设置
-1. 页面布局对齐智能DNS设置页风格(左侧菜单 + 右侧配置区)。
-2. 分组:
- - 基础配置
- - 认证与密钥
-3. 基础配置字段:
- - AppID(只读)
- - 主集群
- - 备集群(可选)
- - 应用启用
- - SNI 防护配置(文案展示:隐匿 SNI)
-4. 认证与密钥字段:
- - 请求验签(状态展示 + 独立启停按钮 + 确认提示)
- - 加签 Secret(查看、复制、重置、最近更新时间)
-5. 交互约束:
- - 强制 HTTPS 传输,不再提供独立“数据加密 Secret”配置项。
- - 密钥操作区使用紧凑图标样式,减少视觉噪音。
-
-## 6. 域名管理与自定义解析
-
-### 6.1 域名管理
-1. 页面采用框架标准顶部 tab + 面包屑样式。
-2. 字段:
- - 域名列表
- - 规则策略(仅展示数字,表示该域名规则数,可点击)
- - 操作(自定义解析、解绑)
-3. 入口:在域名行操作中直接进入“自定义解析”。
-
-### 6.2 自定义解析(精简版)
-1. 规则字段:
- - 规则名称
- - 线路
- - 解析记录值
- - TTL
- - 状态
-2. 线路联动:
- - 第一层:`中国地区` / `境外`
- - 中国地区:运营商 -> 大区 -> 省份
- - 境外:洲 -> 国家/地区(亚洲内使用中国香港/中国澳门/中国台湾)
-3. 解析记录:
- - 每条规则最多 10 条
- - 支持 A / AAAA
- - 可开启权重调度
-4. 不包含 SDNS 参数配置。
-
-## 7. 访问日志
-1. 菜单与页面文案统一为“访问日志”(不再使用“解析日志”)。
-2. 页面结构:筛选区与列表区分离,间距与智能DNS访问日志风格一致。
-3. 列字段:集群、节点、域名、类型、概要。
-4. 概要展示:
- - 使用单行拼接
- - 按“访问信息 -> 解析结果”顺序
- - 不显示字段名堆叠
-
-## 8. 运行日志
-1. 字段与智能DNS运行日志保持一致。
-2. 级别样式使用文字着色,不使用大块背景色。
-
-## 9. 解析测试
-1. 去掉“API在线沙盒”标题与右侧等待占位图标区。
-2. 解析配置区标题统一为“解析测试”。
-3. 测试参数保留:目标应用、所属集群、解析域名、模拟客户端IP、解析类型(A/AAAA)。
-4. 所属集群使用下拉框选择。
-5. 解析域名使用下拉框选择(按当前目标应用联动展示)。
-6. 去掉 SDNS 参数。
-7. 结果区保留核心结果展示,参考阿里云风格的简洁结果布局。
-
-## 10. SDK 集成
-1. SDK 集成不作为左侧独立菜单。
-2. 在“应用管理”操作列进入 SDK 集成页。
-3. 页面只保留:
- - SDK 下载
- - 集成文档
-4. 卡片与按钮采用紧凑布局,避免按钮区域拥挤。
-
-## 11. SDK 与服务端接口(现行)
-1. 解析接口:`/resolve`
- - SDK 请求域名解析结果的主接口。
-2. 启动配置接口:`/bootstrap`(规划/联调口径)
- - 用于 SDK 获取可用服务域名与策略参数(替代节点IP调度模式)。
-3. SDK 地址策略:优先主集群服务域名,不可用时切备集群;失败后按客户端降级策略处理。
-
-## 12. 本文明确不包含
-1. 不包含全局配置独立页面设计。
-2. 不包含 SDK 接入向导独立菜单设计。
-3. 不包含 SNI level1/level3、ECH 控制台、Public SNI 池分级配置。
-4. 不包含 SDNS 参数匹配链路。
-5. 不包含第三方 DNS 依赖与复用方案。
diff --git a/EdgeHttpDNS/HTTPDNS后端开发计划.md b/EdgeHttpDNS/HTTPDNS后端开发计划.md
deleted file mode 100644
index 9d08cd3..0000000
--- a/EdgeHttpDNS/HTTPDNS后端开发计划.md
+++ /dev/null
@@ -1,255 +0,0 @@
-# HTTPDNS后端开发计划(V1.0)
-
-## 0. 文档信息
-- 目标文件:`EdgeHttpDNS/HTTPDNS后端开发计划.md`
-- 交付范围:`EdgeAdmin + EdgeAPI + EdgeHttpDNS + SDK对接接口`
-- 交付策略:一次性全量交付(非分阶段)
-- 核心约束:
- - 仅新协议
- - 无 `/bootstrap`
- - `/resolve` 使用 GET 参数
- - 线路匹配仅基于客户端 IP 归属
- - 独立 `edgeHTTPDNS*` 数据表
- - 新增独立节点角色 `NodeRoleHTTPDNS`
- - 访问日志 MySQL + ClickHouse 双写(查询优先 ClickHouse)
- - 不复用智能DNS(EdgeDNS/NS)模块的 DAO/Service/Store,HTTPDNS 独立实现(可参考并复制所需能力)
-
-## 1. 目标与成功标准
-1. 将 HTTPDNS 从当前 Admin 侧 mock/store 方案落地为真实后端能力。
-2. 打通“配置 -> 下发 -> 解析 -> 日志 -> 查询”闭环。
-3. 与当前前端设计严格对齐:
- - 菜单:集群管理、应用管理、访问日志、运行日志、解析测试
- - SNI 固定为“隐匿 SNI”
- - 自定义解析不含 SDNS 参数
-4. 成功标准:
- - 管理页面均通过 RPC 读取真实数据,无本地 mock 依赖
- - `/resolve` 可按应用/域名/线路返回解析结果
- - 访问日志与运行日志可查询、可筛选、可分页
- - 节点配置与状态可下发和回传
- - 主备集群服务域名可在应用设置中配置并生效
- - EdgeHttpDNS 支持 SNI 与 Host 解耦路由,并可执行 WAF 动态验签与隐匿 SNI 转发
-
-## 2. 架构与边界
-### 2.1 服务边界
-1. EdgeAdmin:仅负责页面动作与 RPC 编排,不存业务状态。
-2. EdgeAPI:负责数据存储、策略匹配、接口服务、日志汇聚。
-3. EdgeHttpDNS(HTTPDNS节点):负责执行解析、上报运行日志/访问日志、接收任务。
-4. SDK:手动配置应用关联主备服务域名,调用 `/resolve` 获取结果。
-
-### 2.2 不做项
-1. 不做 `/bootstrap` 接口。
-2. 不做 ECH / SNI 分级策略。
-3. 不做 SDNS 参数匹配。
-4. 不做第三方 DNS 依赖复用。
-
-## 3. 公开接口与契约(需新增/调整)
-### 3.1 HTTP 解析接口
-1. `GET /resolve`
-2. 请求参数:
- - `appId`(必填)
- - `dn`(必填)
- - `qtype`(可选,A/AAAA,默认 A)
- - `cip`(可选)
- - `sid`、`sdk_version`、`os`(可选,用于日志)
- - `nonce`、`exp`、`sign`(可选,验签开启时必需)
-3. 响应结构(统一):
- - `code`、`message`、`requestId`
- - `data`:
- - `domain`
- - `qtype`
- - `ttl`
- - `records[]`(`type`,`ip`,`weight?`,`line?`,`region?`)
- - `client`(`ip`,`region`,`carrier`,`country`)
- - `summary`(命中规则摘要)
-4. 错误码最低集合:
- - app 无效/禁用
- - 域名未绑定
- - 验签失败
- - 无可用解析记录
- - 内部解析失败/超时
-
-### 3.2 管理 RPC(EdgeAdmin -> EdgeAPI)
-1. 新增服务:
- - `HTTPDNSClusterService`
- - `HTTPDNSNodeService`
- - `HTTPDNSAppService`
- - `HTTPDNSDomainService`
- - `HTTPDNSRuleService`
- - `HTTPDNSAccessLogService`
- - `HTTPDNSRuntimeLogService`
- - `HTTPDNSSandboxService`
-2. 最小方法集:
- - 集群:增删改查、设置默认集群、TLS证书绑定、节点列表/状态
- - 应用:增删改查、主备集群设置、启停、验签开关、密钥重置
- - 域名:绑定/解绑/列表
- - 自定义解析:规则增删改查、启停、排序
- - 日志:访问日志分页查询、运行日志分页查询
- - 测试:在线解析测试调用(入参包含 appId、clusterId、domain、qtype、clientIp)
-
-### 3.3 节点日志上报 RPC(EdgeHttpDNS -> EdgeAPI)
-1. `CreateHTTPDNSAccessLogs`(批量)
-2. `CreateHTTPDNSRuntimeLogs`(批量)
-3. 幂等键:`requestId + nodeId`
-4. 支持高吞吐批量提交和失败重试
-
-### 3.4 节点路由与 WAF 策略下发契约(EdgeAPI -> EdgeHttpDNS)
-1. 下发内容最小集合:
- - `appId/domain/serviceDomain`
- - `sniMode`(固定为隐匿 SNI)
- - `hostRouteMode`(SNI 与 Host 解耦)
- - `wafVerifyEnabled`
- - `wafVerifyPolicy`(验签字段、时效窗口、失败动作)
-2. 节点执行口径:
- - 入站按 `serviceDomain` 接入,按 Host/业务域名做路由匹配
- - TLS 握手与业务 Host 解耦,避免真实业务域名暴露在 SNI
- - 命中需要验签的应用时,先执行 WAF 动态验签,再继续解析链路
-3. 失败处置:
- - 验签失败按策略拒绝并记录运行日志、访问日志错误码
- - 路由未命中返回统一错误码并上报审计日志
-
-## 4. 数据模型设计(独立 HTTPDNS 表)
-1. `edgeHTTPDNSClusters`
- - `id,name,isOn,isDefault,serviceDomain,defaultTTL,fallbackTimeoutMs,installDir,tlsPolicyJSON,createdAt,updatedAt`
-2. `edgeHTTPDNSNodes`
- - `id,clusterId,name,isOn,isUp,isInstalled,isActive,statusJSON,installStatusJSON,installDir,uniqueId,secret,createdAt,updatedAt`
-3. `edgeHTTPDNSApps`
- - `id,name,appId,isOn,primaryClusterId,backupClusterId,sniMode(fixed_hide),createdAt,updatedAt`
-4. `edgeHTTPDNSAppSecrets`
- - `id,appId,signEnabled,signSecretEnc,signUpdatedAt,updatedAt`
-5. `edgeHTTPDNSDomains`
- - `id,appId,domain,isOn,createdAt,updatedAt`
-6. `edgeHTTPDNSCustomRules`
- - `id,appId,domainId,ruleName,lineScope,lineCarrier,lineRegion,lineProvince,lineContinent,lineCountry,ttl,isOn,priority,updatedAt`
-7. `edgeHTTPDNSCustomRuleRecords`
- - `id,ruleId,recordType,recordValue,weight,sort`
-8. `edgeHTTPDNSAccessLogs`
- - `id,requestId,clusterId,nodeId,appId,domain,qtype,clientIP,clientRegion,carrier,sdkVersion,os,resultIPs,status,errorCode,costMs,createdAt,day`
-9. `edgeHTTPDNSRuntimeLogs`
- - `id,clusterId,nodeId,level,type,tag,description,count,createdAt,day`
-
-### 4.1 索引与唯一约束
-1. 唯一:`edgeHTTPDNSApps.appId`
-2. 唯一:`edgeHTTPDNSDomains(appId,domain)`
-3. 唯一:`edgeHTTPDNSAccessLogs(requestId,nodeId)`
-4. 索引:
- - 访问日志:`day,clusterId,nodeId,domain,status,createdAt`
- - 规则匹配:`domainId,isOn,priority,lineScope,...`
- - 应用查询:`name,appId,isOn`
-
-## 5. 解析引擎实现(EdgeAPI)
-1. 输入校验:`appId/dn/qtype`
-2. 应用与域名校验:
- - app 存在且启用
- - 域名已绑定到 app
-3. 线路归属:
- - `cip` 优先,其次 remote IP
- - 映射字段:运营商/大区/省份/洲/国家
-4. 规则匹配:
- - 精确匹配 > 半精确 > 默认
- - 同级按 `priority` 从小到大
-5. 记录返回:
- - 权重关闭:返回全部记录
- - 权重开启:按权重算法返回单条或子集(固定口径)
-6. TTL 取值:
- - 命中规则取规则 TTL
- - 未命中规则取集群默认 TTL
-7. 验签:
- - `signEnabled=true` 时必须通过签名校验
- - `signEnabled=false` 时跳过签名校验
-8. 访问日志:
- - 解析结束异步写日志
- - 双写 MySQL/ClickHouse
-
-## 6. 节点与任务链路
-1. 在 `EdgeCommon/pkg/nodeconfigs` 增加 `NodeRoleHTTPDNS`。
-2. 在任务系统增加 HTTPDNS 任务类型:
- - 配置变更
- - 应用变更
- - 域名变更
- - 规则变更
- - 证书变更
- - 路由与 WAF 策略变更
-3. EdgeHttpDNS 增加 HTTPDNS 子服务:
- - 接收配置快照
- - 执行解析
- - 上报运行/访问日志
- - 执行 SNI/Host 解耦路由
- - 执行 WAF 动态验签
- - 执行隐匿 SNI 转发
-4. 复用现有安装升级框架,但节点角色、任务通道、日志 tag 独立。
-
-## 7. EdgeAdmin 后端改造
-1. 将 `internal/web/actions/default/httpdns/*` 的 store/mock 读写改为 RPC。
-2. 删除/停用旧能力路由:
- - `/httpdns/policies`
- - `/httpdns/guide`
- - `/httpdns/ech`
-3. 保留必要跳转,避免旧链接 404。
-4. `sandbox/test` 改为调用真实解析服务(可保留测试开关)。
-5. 解析测试页面交互固定为:
- - 配置区标题“解析测试”
- - 所属集群使用下拉框
- - 解析域名使用下拉框并按目标应用联动
-
-## 8. 安全与审计
-1. Secret 持久化使用加密存储(至少密文列),返回时脱敏。
-2. 操作审计记录:
- - 验签开关启停
- - Sign Secret 重置
- - 应用主备集群修改
-3. 验签失败日志保留 `requestId,errorCode,sourceIP`。
-4. 防滥用:
- - `/resolve` 增加基础限流与异常请求过滤(按 appId + IP 维度)。
-5. 节点侧安全执行:
- - WAF 动态验签失败必须留存审计日志(含 requestId/appId/sourceIP)
- - SNI/Host 解耦路由命中结果需可追踪(用于问题回溯)
-
-## 9. 测试与验收
-### 9.1 单元测试
-1. 规则匹配优先级与线路匹配
-2. 验签成功/失败路径
-3. 权重返回算法
-4. DAO CRUD 与唯一约束
-
-### 9.2 集成测试
-1. EdgeAdmin -> RPC -> DB 全链路
-2. `/resolve` 各错误码分支
-3. 节点日志上报双写(MySQL+CH)
-4. CH 不可用时 MySQL 回退查询
-5. EdgeAPI 策略下发 -> EdgeHttpDNS 路由/WAF 执行 -> 日志落库全链路
-
-### 9.3 回归测试
-1. 智能DNS功能不受影响
-2. 菜单与权限不串模块
-3. 旧入口跳转正确,无新增 404
-
-### 9.4 验收用例
-1. 应用配置主备服务域名后,SDK可解析成功
-2. 主集群故障时可切备集群
-3. 自定义解析按线路返回预期 IP
-4. 访问日志筛选与概要展示正确
-5. 运行日志级别/字段与智能DNS一致
-6. EdgeHttpDNS 可在 SNI 与 Host 解耦场景下正确路由到目标应用
-7. 开启 WAF 动态验签后,合法请求通过、非法签名请求被拒绝且有审计日志
-
-## 10. 发布与回滚
-1. 发布顺序:
- - DB migration
- - EdgeAPI(DAO+RPC+resolve)
- - EdgeHttpDNS(角色+上报)
- - EdgeAdmin(RPC切换)
-2. 开关控制:
- - `httpdns.resolve.enabled`
- - `httpdns.log.clickhouse.enabled`
-3. 回滚策略:
- - 关闭 `resolve` 新实现开关
- - 访问日志读取切回 MySQL
- - Admin 保留只读能力
-
-## 11. 默认值与固定决策
-1. 无 `/bootstrap`,SDK手动配置主备服务域名。
-2. `SNI` 固定“隐匿 SNI”。
-3. 自定义解析无 SDNS 参数。
-4. 线路仅客户端 IP 归属。
-5. 日志双写,查询优先 ClickHouse。
-6. 节点角色独立:`NodeRoleHTTPDNS`。
diff --git a/EdgeHttpDNS/HTTPDNS用户使用手册.md b/EdgeHttpDNS/HTTPDNS用户使用手册.md
deleted file mode 100644
index a755c7b..0000000
--- a/EdgeHttpDNS/HTTPDNS用户使用手册.md
+++ /dev/null
@@ -1,98 +0,0 @@
-# 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 代码中同步更新。
diff --git a/EdgeHttpDNS/HTTPDNS管理员配置手册.md b/EdgeHttpDNS/HTTPDNS管理员配置手册.md
deleted file mode 100644
index 5981f4b..0000000
--- a/EdgeHttpDNS/HTTPDNS管理员配置手册.md
+++ /dev/null
@@ -1,82 +0,0 @@
-# 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 证书是否有效,以及防火墙端口是否开放。
diff --git a/EdgeHttpDNS/SNI隐匿开发计划.md b/EdgeHttpDNS/SNI隐匿开发计划.md
deleted file mode 100644
index ff6c205..0000000
--- a/EdgeHttpDNS/SNI隐匿开发计划.md
+++ /dev/null
@@ -1,92 +0,0 @@
-# SNI隐匿开发计划(HTTPDNS专项)
-
-## 0. 目标
-在明文网络层(DNS 与 TLS ClientHello)中不出现真实业务域名;真实业务域名仅出现在加密后的 HTTP 层(Host / :authority)中传输。
-
-## 1. 固定原则
-1. 只做 SNI 隐匿能力,不引入其他无关能力描述。
-2. 客户端不走系统 DNS 解析业务域名。
-3. TLS 握手阶段不发送真实业务域名 SNI。
-4. CDN/WAF 节点必须支持“空SNI接入 + Host路由”。
-5. 真实域名只在 HTTPS 加密通道内携带。
-
-## 2. 端到端链路(目标形态)
-1. App 调用 SDK,请求解析业务域名。
-2. SDK 从 HTTPDNS 获取业务域名对应的“接入 IP 列表”(不是业务域名 DNS)。
-3. SDK 直连接入 IP 发起 TLS:
- - SNI 置空(或不发送)
- - 不出现真实业务域名
-4. TLS 建立后发起 HTTPS 请求:
- - Host / :authority = 真实业务域名
-5. CDN/WAF 节点在解密后读取 Host,将流量路由到对应业务源站。
-
-## 3. SDK 改造要求
-### 3.1 连接行为
-1. 提供“按 IP 直连”的请求通道。
-2. TLS 握手时固定空 SNI,不允许带真实域名。
-3. HTTP 层强制写入真实 Host / :authority。
-
-### 3.2 证书校验
-1. 仍必须做证书链校验(不允许关闭 TLS 安全校验)。
-2. 证书校验目标为接入层证书(CDN/WAF 对外证书),而非业务源站证书。
-
-### 3.3 多IP与容错
-1. HTTPDNS 返回多个接入 IP 时,SDK 按顺序/策略重试。
-2. 连接失败可切换下一 IP。
-3. 缓存与过期策略保持稳定,避免频繁抖动。
-
-### 3.4 多端一致性
-1. Android/iOS/Flutter 需保证一致行为:
- - 空 SNI
- - Host 注入
- - 失败重试策略
-2. 文档与示例代码同步更新。
-
-## 4. CDN/WAF 节点改造要求
-### 4.1 TLS 接入
-1. 支持无 SNI ClientHello 的 TLS 握手。
-2. 为接入域名部署有效证书(覆盖客户端连接目标)。
-
-### 4.2 路由逻辑
-1. 以 Host / :authority 作为业务路由主键。
-2. 路由匹配前做标准化:
- - 小写化
- - 去端口
-3. Host 未命中时返回明确错误(4xx),禁止兜底到默认站点。
-
-### 4.3 回源行为
-1. 节点到源站可继续使用 HTTPS 回源。
-2. 回源主机名与证书校验按现有网关策略执行。
-
-### 4.4 可观测性
-1. 增加日志字段:
- - `tlsSniPresent`(是否携带 SNI)
- - `host`
- - `routeResult`
-2. 可按“空SNI请求占比、Host路由命中率”监控。
-
-## 5. 控制面(管理端)要求
-1. 页面仅展示“已启用 SNI 隐匿(空SNI)”,不提供策略切换。
-2. 集群侧需可检查“节点是否支持空SNI接入”。
-3. 发布配置时支持灰度与回滚。
-
-## 6. 验收标准
-1. 抓包验证:
- - DNS 明文流量中不出现真实业务域名
- - TLS ClientHello 中不出现真实业务域名 SNI
-2. 请求验证:
- - HTTPS 请求 Host 为真实业务域名
- - CDN/WAF 按 Host 正确路由
-3. 稳定性验证:
- - 多 IP 切换成功
- - 节点故障时请求可恢复
-
-## 7. 上线顺序
-1. 先升级 CDN/WAF 节点能力(空SNI接入 + Host路由)。
-2. 再升级 SDK(空SNI + Host注入)。
-3. 最后按应用灰度开启,观察指标后全量。
-
-## 8. 风险与约束
-1. 若 CDN/WAF 不支持空 SNI,链路会在握手阶段失败。
-2. 若 Host 路由不严格,可能出现串站风险。
-3. 若客户端错误关闭证书校验,会引入严重安全风险。
diff --git a/EdgeHttpDNS/internal/const/const.go b/EdgeHttpDNS/internal/const/const.go
index 6503055..f254982 100644
--- a/EdgeHttpDNS/internal/const/const.go
+++ b/EdgeHttpDNS/internal/const/const.go
@@ -1,7 +1,7 @@
package teaconst
const (
- Version = "1.4.8"
+ Version = "1.4.9"
ProductName = "Edge HTTPDNS"
ProcessName = "edge-httpdns"
diff --git a/EdgeHttpDNS/internal/nodes/resolve_server.go b/EdgeHttpDNS/internal/nodes/resolve_server.go
index 0b7f30d..a4e4d12 100644
--- a/EdgeHttpDNS/internal/nodes/resolve_server.go
+++ b/EdgeHttpDNS/internal/nodes/resolve_server.go
@@ -157,8 +157,8 @@ func NewResolveServer(quitCh <-chan struct{}, snapshotManager *SnapshotManager)
instance.handler = mux
instance.tlsConfig = &tls.Config{
- MinVersion: tls.VersionTLS11,
- NextProtos: []string{"http/1.1"},
+ MinVersion: tls.VersionTLS11,
+ NextProtos: []string{"http/1.1"},
GetCertificate: instance.getCertificate,
}
@@ -212,7 +212,7 @@ func (s *ResolveServer) getCertificate(_ *tls.ClientHelloInfo) (*tls.Certificate
type snapshotTLSConfig struct {
Listen []*serverconfigs.NetworkAddressConfig `json:"listen"`
- SSLPolicy *sslconfigs.SSLPolicy `json:"sslPolicy"`
+ SSLPolicy *sslconfigs.SSLPolicy `json:"sslPolicy"`
}
func (s *ResolveServer) parseTLSConfig(snapshot *LoadedSnapshot) *snapshotTLSConfig {
@@ -270,23 +270,24 @@ func (s *ResolveServer) desiredAddrs(snapshot *LoadedSnapshot) []string {
func (s *ResolveServer) reloadCertFromSnapshot(snapshot *LoadedSnapshot) {
cfg := s.parseTLSConfig(snapshot)
if cfg == nil || cfg.SSLPolicy == nil || len(cfg.SSLPolicy.Certs) == 0 {
+ // 没有TLS配置,标记已处理(不需要重试)
s.certMu.Lock()
s.certSnapshotAt = snapshot.LoadedAt
s.certMu.Unlock()
+ reportRuntimeLog("info", "tls", "resolve", "no TLS policy in cluster snapshot, skipped cert reload", fmt.Sprintf("cert-skip-%d", snapshot.LoadedAt))
return
}
if err := cfg.SSLPolicy.Init(context.Background()); err != nil {
log.Println("[HTTPDNS_NODE][resolve]init SSLPolicy failed:", err.Error())
- s.certMu.Lock()
- s.certSnapshotAt = snapshot.LoadedAt
- s.certMu.Unlock()
+ reportRuntimeLog("error", "tls", "resolve", "init SSLPolicy failed: "+err.Error(), fmt.Sprintf("cert-err-%d", snapshot.LoadedAt))
+ // 不更新 certSnapshotAt,下次 watchLoop 会重试
return
}
cert := cfg.SSLPolicy.FirstCert()
if cert == nil {
- s.certMu.Lock()
- s.certSnapshotAt = snapshot.LoadedAt
- s.certMu.Unlock()
+ log.Println("[HTTPDNS_NODE][resolve]SSLPolicy has no valid certificate after Init")
+ reportRuntimeLog("error", "tls", "resolve", "SSLPolicy has no valid certificate after Init", fmt.Sprintf("cert-err-%d", snapshot.LoadedAt))
+ // 不更新 certSnapshotAt,下次 watchLoop 会重试
return
}
@@ -295,6 +296,7 @@ func (s *ResolveServer) reloadCertFromSnapshot(snapshot *LoadedSnapshot) {
s.certSnapshotAt = snapshot.LoadedAt
s.certMu.Unlock()
log.Println("[HTTPDNS_NODE][resolve]TLS certificate reloaded from snapshot")
+ reportRuntimeLog("info", "tls", "resolve", "TLS certificate reloaded from snapshot successfully", fmt.Sprintf("cert-ok-%d", snapshot.LoadedAt))
}
func (s *ResolveServer) startListener(addr string) error {
@@ -561,27 +563,29 @@ func (s *ResolveServer) handleResolve(writer http.ResponseWriter, request *http.
},
})
- s.enqueueAccessLog(&pb.HTTPDNSAccessLog{
- RequestId: requestID,
- ClusterId: snapshot.ClusterID,
- NodeId: snapshot.NodeID,
- AppId: loadedApp.App.GetAppId(),
- AppName: loadedApp.App.GetName(),
- Domain: domain,
- Qtype: qtype,
- ClientIP: clientProfile.IP,
- ClientRegion: clientProfile.RegionText,
- Carrier: clientProfile.Carrier,
- SdkVersion: strings.TrimSpace(query.Get("sdk_version")),
- Os: strings.TrimSpace(query.Get("os")),
- ResultIPs: strings.Join(resultIPs, ","),
- Status: "success",
- ErrorCode: "none",
- CostMs: int32(time.Since(startAt).Milliseconds()),
- CreatedAt: time.Now().Unix(),
- Day: time.Now().Format("20060102"),
- Summary: summary,
- })
+ if s.isAccessLogEnabled(snapshot) {
+ s.enqueueAccessLog(&pb.HTTPDNSAccessLog{
+ RequestId: requestID,
+ ClusterId: snapshot.ClusterID,
+ NodeId: snapshot.NodeID,
+ AppId: loadedApp.App.GetAppId(),
+ AppName: loadedApp.App.GetName(),
+ Domain: domain,
+ Qtype: qtype,
+ ClientIP: clientProfile.IP,
+ ClientRegion: clientProfile.RegionText,
+ Carrier: clientProfile.Carrier,
+ SdkVersion: strings.TrimSpace(query.Get("sdk_version")),
+ Os: strings.TrimSpace(query.Get("os")),
+ ResultIPs: strings.Join(resultIPs, ","),
+ Status: "success",
+ ErrorCode: "none",
+ CostMs: int32(time.Since(startAt).Milliseconds()),
+ CreatedAt: time.Now().Unix(),
+ Day: time.Now().Format("20060102"),
+ Summary: summary,
+ })
+ }
}
func pickDefaultTTL(snapshot *LoadedSnapshot, app *pb.HTTPDNSApp) int32 {
@@ -655,27 +659,29 @@ func (s *ResolveServer) writeFailedResolve(
nodeID = snapshot.NodeID
}
- s.enqueueAccessLog(&pb.HTTPDNSAccessLog{
- RequestId: requestID,
- ClusterId: clusterID,
- NodeId: nodeID,
- AppId: appID,
- AppName: appName,
- Domain: domain,
- Qtype: qtype,
- ClientIP: clientProfile.IP,
- ClientRegion: clientProfile.RegionText,
- Carrier: clientProfile.Carrier,
- SdkVersion: strings.TrimSpace(query.Get("sdk_version")),
- Os: strings.TrimSpace(query.Get("os")),
- ResultIPs: "",
- Status: "failed",
- ErrorCode: errorCode,
- CostMs: int32(time.Since(startAt).Milliseconds()),
- CreatedAt: time.Now().Unix(),
- Day: time.Now().Format("20060102"),
- Summary: summary,
- })
+ if s.isAccessLogEnabled(snapshot) {
+ s.enqueueAccessLog(&pb.HTTPDNSAccessLog{
+ RequestId: requestID,
+ ClusterId: clusterID,
+ NodeId: nodeID,
+ AppId: appID,
+ AppName: appName,
+ Domain: domain,
+ Qtype: qtype,
+ ClientIP: clientProfile.IP,
+ ClientRegion: clientProfile.RegionText,
+ Carrier: clientProfile.Carrier,
+ SdkVersion: strings.TrimSpace(query.Get("sdk_version")),
+ Os: strings.TrimSpace(query.Get("os")),
+ ResultIPs: "",
+ Status: "failed",
+ ErrorCode: errorCode,
+ CostMs: int32(time.Since(startAt).Milliseconds()),
+ CreatedAt: time.Now().Unix(),
+ Day: time.Now().Format("20060102"),
+ Summary: summary,
+ })
+ }
}
func (s *ResolveServer) writeResolveJSON(writer http.ResponseWriter, status int, resp *resolveResponse) {
@@ -1424,6 +1430,17 @@ func ruleRegionSummary(rule *pb.HTTPDNSCustomRule) string {
return ""
}
+func (s *ResolveServer) isAccessLogEnabled(snapshot *LoadedSnapshot) bool {
+ if snapshot == nil || snapshot.ClusterID <= 0 {
+ return true
+ }
+ cluster := snapshot.Clusters[snapshot.ClusterID]
+ if cluster == nil {
+ return true
+ }
+ return cluster.GetAccessLogIsOn()
+}
+
func (s *ResolveServer) enqueueAccessLog(item *pb.HTTPDNSAccessLog) {
if item == nil {
return
diff --git a/EdgeHttpDNS/internal/nodes/snapshot_manager.go b/EdgeHttpDNS/internal/nodes/snapshot_manager.go
index 07e3041..5c10860 100644
--- a/EdgeHttpDNS/internal/nodes/snapshot_manager.go
+++ b/EdgeHttpDNS/internal/nodes/snapshot_manager.go
@@ -37,6 +37,8 @@ type SnapshotManager struct {
locker sync.RWMutex
snapshot *LoadedSnapshot
+
+ timezone string
}
func NewSnapshotManager(quitCh <-chan struct{}) *SnapshotManager {
@@ -144,7 +146,7 @@ func (m *SnapshotManager) RefreshNow(reason string) error {
}
snapshot := &LoadedSnapshot{
- LoadedAt: time.Now().Unix(),
+ LoadedAt: time.Now().UnixNano(),
NodeID: nodeResp.GetNode().GetId(),
ClusterID: nodeResp.GetNode().GetClusterId(),
Clusters: clusters,
@@ -156,5 +158,36 @@ func (m *SnapshotManager) RefreshNow(reason string) error {
m.locker.Unlock()
reportRuntimeLog("info", "config", "snapshot", "snapshot refreshed: "+reason, fmt.Sprintf("snapshot-%d", time.Now().UnixNano()))
+
+ // timezone sync - prefer current node's cluster timezone
+ var timeZone string
+ if snapshot.ClusterID > 0 {
+ if cluster := clusters[snapshot.ClusterID]; cluster != nil && len(cluster.GetTimeZone()) > 0 {
+ timeZone = cluster.GetTimeZone()
+ }
+ }
+ // fallback to any non-empty cluster timezone for compatibility
+ if len(timeZone) == 0 {
+ for _, cluster := range clusters {
+ if cluster != nil && len(cluster.GetTimeZone()) > 0 {
+ timeZone = cluster.GetTimeZone()
+ break
+ }
+ }
+ }
+ if len(timeZone) == 0 {
+ timeZone = "Asia/Shanghai"
+ }
+ if m.timezone != timeZone {
+ location, err := time.LoadLocation(timeZone)
+ if err != nil {
+ log.Println("[HTTPDNS_NODE][TIMEZONE]change time zone failed:", err.Error())
+ } else {
+ log.Println("[HTTPDNS_NODE][TIMEZONE]change time zone to '" + timeZone + "'")
+ time.Local = location
+ m.timezone = timeZone
+ }
+ }
+
return nil
}
diff --git a/EdgeHttpDNS/sdk/.tmp_android_bundle/README.md b/EdgeHttpDNS/sdk/.tmp_android_bundle/README.md
deleted file mode 100644
index 717b47f..0000000
--- a/EdgeHttpDNS/sdk/.tmp_android_bundle/README.md
+++ /dev/null
@@ -1,77 +0,0 @@
-# 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`
diff --git a/EdgeHttpDNS/sdk/.tmp_android_bundle/alicloud-android-crashdefend-0.0.6.jar b/EdgeHttpDNS/sdk/.tmp_android_bundle/alicloud-android-crashdefend-0.0.6.jar
deleted file mode 100644
index c2547d6..0000000
Binary files a/EdgeHttpDNS/sdk/.tmp_android_bundle/alicloud-android-crashdefend-0.0.6.jar and /dev/null differ
diff --git a/EdgeHttpDNS/sdk/.tmp_android_bundle/alicloud-android-httpdns-2.6.7.aar b/EdgeHttpDNS/sdk/.tmp_android_bundle/alicloud-android-httpdns-2.6.7.aar
deleted file mode 100644
index 6bacaf9..0000000
Binary files a/EdgeHttpDNS/sdk/.tmp_android_bundle/alicloud-android-httpdns-2.6.7.aar and /dev/null differ
diff --git a/EdgeHttpDNS/sdk/.tmp_android_bundle/alicloud-android-ipdetector-1.2.0.aar b/EdgeHttpDNS/sdk/.tmp_android_bundle/alicloud-android-ipdetector-1.2.0.aar
deleted file mode 100644
index 843f9d7..0000000
Binary files a/EdgeHttpDNS/sdk/.tmp_android_bundle/alicloud-android-ipdetector-1.2.0.aar and /dev/null differ
diff --git a/EdgeHttpDNS/sdk/.tmp_android_bundle/alicloud-android-logger-1.2.0.aar b/EdgeHttpDNS/sdk/.tmp_android_bundle/alicloud-android-logger-1.2.0.aar
deleted file mode 100644
index d3bb217..0000000
Binary files a/EdgeHttpDNS/sdk/.tmp_android_bundle/alicloud-android-logger-1.2.0.aar and /dev/null differ
diff --git a/EdgeHttpDNS/sdk/.tmp_android_bundle/proguard-rules.pro b/EdgeHttpDNS/sdk/.tmp_android_bundle/proguard-rules.pro
deleted file mode 100644
index c1def44..0000000
--- a/EdgeHttpDNS/sdk/.tmp_android_bundle/proguard-rules.pro
+++ /dev/null
@@ -1,68 +0,0 @@
-# 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 ;
- public ;
-}
-
--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 ;
- public ;
-}
--keep enum com.alibaba.sdk.android.httpdns.Region {*;}
--keep class com.alibaba.sdk.android.httpdns.exception.InitException{*;}
diff --git a/EdgeHttpDNS/sdk/android/.gitignore b/EdgeHttpDNS/sdk/android/.gitignore
deleted file mode 100644
index 6990041..0000000
--- a/EdgeHttpDNS/sdk/android/.gitignore
+++ /dev/null
@@ -1,26 +0,0 @@
-.DS_Store
-*.swp
-
-# Kiro IDE
-.kiro/
-
-# VSCode
-.vscode/
-
-# Gradle
-build
-.gradle/
-target/
-
-# Intellij project files
-*.iml
-*.ipr
-*.iws
-.idea/
-
-# sonar
-.sonar/
-
-# Android
-local.properties
-nohup.out
diff --git a/EdgeHttpDNS/sdk/android/README.md b/EdgeHttpDNS/sdk/android/README.md
deleted file mode 100644
index 717b47f..0000000
--- a/EdgeHttpDNS/sdk/android/README.md
+++ /dev/null
@@ -1,77 +0,0 @@
-# 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`
diff --git a/EdgeHttpDNS/sdk/android/app/.gitignore b/EdgeHttpDNS/sdk/android/app/.gitignore
deleted file mode 100644
index 0ce017c..0000000
--- a/EdgeHttpDNS/sdk/android/app/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-/build
-/libs/alicloud-android-httpdns-*.aar
diff --git a/EdgeHttpDNS/sdk/android/demo/.gitignore b/EdgeHttpDNS/sdk/android/demo/.gitignore
deleted file mode 100644
index 42afabf..0000000
--- a/EdgeHttpDNS/sdk/android/demo/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-/build
\ No newline at end of file
diff --git a/EdgeHttpDNS/sdk/dist/alicloud-android-crashdefend-0.0.6.jar b/EdgeHttpDNS/sdk/dist/alicloud-android-crashdefend-0.0.6.jar
deleted file mode 100644
index c2547d6..0000000
Binary files a/EdgeHttpDNS/sdk/dist/alicloud-android-crashdefend-0.0.6.jar and /dev/null differ
diff --git a/EdgeHttpDNS/sdk/dist/alicloud-android-httpdns-2.6.7.aar b/EdgeHttpDNS/sdk/dist/alicloud-android-httpdns-2.6.7.aar
deleted file mode 100644
index 6bacaf9..0000000
Binary files a/EdgeHttpDNS/sdk/dist/alicloud-android-httpdns-2.6.7.aar and /dev/null differ
diff --git a/EdgeHttpDNS/sdk/dist/alicloud-android-ipdetector-1.2.0.aar b/EdgeHttpDNS/sdk/dist/alicloud-android-ipdetector-1.2.0.aar
deleted file mode 100644
index 843f9d7..0000000
Binary files a/EdgeHttpDNS/sdk/dist/alicloud-android-ipdetector-1.2.0.aar and /dev/null differ
diff --git a/EdgeHttpDNS/sdk/dist/alicloud-android-logger-1.2.0.aar b/EdgeHttpDNS/sdk/dist/alicloud-android-logger-1.2.0.aar
deleted file mode 100644
index d3bb217..0000000
Binary files a/EdgeHttpDNS/sdk/dist/alicloud-android-logger-1.2.0.aar and /dev/null differ
diff --git a/EdgeHttpDNS/sdk/dist/proguard-rules.pro b/EdgeHttpDNS/sdk/dist/proguard-rules.pro
deleted file mode 100644
index c1def44..0000000
--- a/EdgeHttpDNS/sdk/dist/proguard-rules.pro
+++ /dev/null
@@ -1,68 +0,0 @@
-# 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 ;
- public ;
-}
-
--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 ;
- public ;
-}
--keep enum com.alibaba.sdk.android.httpdns.Region {*;}
--keep class com.alibaba.sdk.android.httpdns.exception.InitException{*;}
diff --git a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/.gitignore b/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/.gitignore
deleted file mode 100644
index b2618b1..0000000
--- a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/.gitignore
+++ /dev/null
@@ -1,41 +0,0 @@
-.dart_tool/
-.packages
-build/
-ios/Pods/
-ios/Frameworks/
-.DS_Store
-
-
-# Android 常见忽略项(避免提交本地构建/IDE/密钥等产物)
-# 参考:Android 项目通用 .gitignore
-# 构建与产物
-*.apk
-*.aab
-*.ap_
-*.dex
-*.class
-captures/
-.externalNativeBuild/
-.cxx/
-
-# Gradle
-.gradle/
-local.properties
-
-# Android Studio / IntelliJ
-*.iml
-.idea/
-
-# Eclipse(少数场景仍可能出现)
-.classpath
-.project
-.settings/
-bin/
-gen/
-out/
-
-# 密钥与敏感文件
-*.jks
-*.keystore
-*.hprof
-google-services.json
diff --git a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/android/.gitignore b/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/android/.gitignore
deleted file mode 100644
index 368ba9b..0000000
--- a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/android/.gitignore
+++ /dev/null
@@ -1,39 +0,0 @@
-gradle-wrapper.jar
-/.gradle
-/captures/
-/gradlew
-/gradlew.bat
-/local.properties
-GeneratedPluginRegistrant.java
-.cxx/
-
-# Remember to never publicly share your keystore.
-# See https://flutter.dev/to/reference-keystore
-key.properties
-**/*.keystore
-**/*.jks
-
-# Android 常见忽略项(与 packages/httpdns_plugin/.gitignore 同步)
-# 构建与产物
-*.apk
-*.aab
-*.ap_
-*.dex
-*.class
-.externalNativeBuild/
-
-# Android Studio / IntelliJ
-*.iml
-.idea/
-
-# Eclipse(可能遗留的工程类型)
-.classpath
-.project
-.settings/
-bin/
-gen/
-out/
-
-# 调试与敏感文件
-*.hprof
-google-services.json
\ No newline at end of file
diff --git a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/ios/.gitignore b/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/ios/.gitignore
deleted file mode 100644
index 7a7f987..0000000
--- a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/ios/.gitignore
+++ /dev/null
@@ -1,34 +0,0 @@
-**/dgph
-*.mode1v3
-*.mode2v3
-*.moved-aside
-*.pbxuser
-*.perspectivev3
-**/*sync/
-.sconsign.dblite
-.tags*
-**/.vagrant/
-**/DerivedData/
-Icon?
-**/Pods/
-**/.symlinks/
-profile
-xcuserdata
-**/.generated/
-Flutter/App.framework
-Flutter/Flutter.framework
-Flutter/Flutter.podspec
-Flutter/Generated.xcconfig
-Flutter/ephemeral/
-Flutter/app.flx
-Flutter/app.zip
-Flutter/flutter_assets/
-Flutter/flutter_export_environment.sh
-ServiceDefinitions.json
-Runner/GeneratedPluginRegistrant.*
-
-# Exceptions to above rules.
-!default.mode1v3
-!default.mode2v3
-!default.pbxuser
-!default.perspectivev3
diff --git a/EdgeHttpDNS/sdk/ios/.gitignore b/EdgeHttpDNS/sdk/ios/.gitignore
deleted file mode 100644
index 8e4699b..0000000
--- a/EdgeHttpDNS/sdk/ios/.gitignore
+++ /dev/null
@@ -1,58 +0,0 @@
-# OS generated files #
-######################
-.DS_Store
-.DS_Store?
-._*
-.Spotlight-V100
-.Trashes
-Icon?
-ehthumbs.db
-Thumbs.db
-src/Documentation/*
-src/docs/docset/*
-src/docs/docset-installed.txt
-src/aws-ios-sdk-*.zip
-
-# Xcode generated files #
-######################
-xcuserdata
-*.xccheckout
-
-# cocoapods
-######################
-Pods/
-*.xcworkspace
-
-# Patched code #
-######################
-*.bak
-
-# Built assets #
-######################
-build
-Build/
-Products/
-infer-out/
-#*.properties
-.sonar/
-compile_commands.json
-oclint.xml
-sonar-reports/
-tmpFileRunSonarSh
-xcodebuild.log
-
-
-# Stuff that can't be committed #
-######################
-credentials.json
-Pods
-Podfile.lock
-Documentation
-Scripts/build.sh
-Scripts/gcovr
-Scripts/jenkins.py
-Scripts/ocunit2junit
-.idea/
-.cursor/
-.claude/
-.AGENTS.md
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHTTPDNS.podspec b/EdgeHttpDNS/sdk/ios/AlicloudHTTPDNS.podspec
deleted file mode 100644
index 9e1bbb2..0000000
--- a/EdgeHttpDNS/sdk/ios/AlicloudHTTPDNS.podspec
+++ /dev/null
@@ -1,51 +0,0 @@
-Pod::Spec.new do |s|
- s.name = "AlicloudHTTPDNS"
- s.version = "1.0.0"
- s.summary = "Aliyun Mobile Service HTTPDNS iOS SDK (source distribution)."
- s.description = <<-DESC
- HTTPDNS iOS SDK 源码分发版本,提供通过 HTTP(S) 进行域名解析、
- IPv4/IPv6 支持、鉴权签名、可选参数加密、内存与 SQLite 持久化缓存、
- 区域调度与降级到本地解析等能力。
- DESC
-
- s.homepage = "https://www.aliyun.com/product/httpdns"
- s.authors = { "zhouzhuo" => "yecan.xyc@alibaba-inc.com" }
-
- # 注意:发布到 Specs 仓库前,请将 git 地址指向正式仓库并按版本打 tag
- s.source = { :git => "https://github.com/aliyun/alibabacloud-httpdns-ios-sdk", :tag => s.version.to_s }
-
- s.platform = :ios, "12.0"
- s.requires_arc = true
-
- # 以源码方式集成,仅收敛 SDK 源码目录
- s.source_files = "AlicloudHttpDNS/**/*.{h,m}"
-
- # 资源:隐私清单
- s.resources = "resource/PrivacyInfo.xcprivacy"
-
- # 公开头文件(由 umbrella 头导入的稳定接口)
- s.public_header_files = [
- "AlicloudHttpDNS/AlicloudHttpDNS.h",
- "AlicloudHttpDNS/HttpdnsService.h",
- "AlicloudHttpDNS/HttpdnsEdgeService.h",
- "AlicloudHttpDNS/Model/HttpdnsResult.h",
- "AlicloudHttpDNS/Model/HttpdnsRequest.h",
- "AlicloudHttpDNS/Log/HttpdnsLog.h",
- "AlicloudHttpDNS/Log/HttpdnsLoggerProtocol.h",
- "AlicloudHttpDNS/HttpdnsDegradationDelegate.h",
- "AlicloudHttpDNS/Config/HttpdnsPublicConstant.h",
- "AlicloudHttpDNS/IpStack/HttpdnsIpStackDetector.h"
- ]
-
- # 系统库与框架
- s.frameworks = ["CoreTelephony", "SystemConfiguration"]
- s.libraries = ["sqlite3.0", "resolv", "z"]
-
- # 链接器参数:保留 Objective‑C 分类
- s.pod_target_xcconfig = {
- 'OTHER_LDFLAGS' => '$(inherited) -ObjC'
- }
- s.user_target_xcconfig = {
- 'OTHER_LDFLAGS' => '$(inherited) -ObjC'
- }
-end
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTests/Network/.gitignore b/EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTests/Network/.gitignore
deleted file mode 100644
index 1ec5ebc..0000000
--- a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTests/Network/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-server.pem
diff --git a/EdgeHttpDNS/新建文本文档.txt b/EdgeHttpDNS/新建文本文档.txt
deleted file mode 100644
index 6b422d2..0000000
--- a/EdgeHttpDNS/新建文本文档.txt
+++ /dev/null
@@ -1,50 +0,0 @@
-1.4.7版本changelog(重大版本)
-
-1、将edge-node边缘节点的日志处理逻辑做了改造,由原来的发送给api组件再存入mysql,改成写入本地再由fluent-bit上传至clickhouse;
-2、将edge-dns节点的日志处理逻辑做了改造,由原来的发送给api组件再存入mysql,改成写入本地再由fluent-bit上传至clickhouse;
-3、edge-admin新增了clickhouse配置页面;
-4、edge-admin新增了双写、单写mysql、单写clickhouse的日志策略;
-5、优化了日志展示内容,可以查看更详细的日志内容;
-7、node和dns节点新增了fluent-bit自动安装和配置逻辑,可以在平台新增边缘节点时直接完成fluent-bit的安装和配置;
-8、新增clickhouse自动安装和配置脚本;
-9、优化了edge-user的新增网站逻辑,新增了日志、统计、websocket、waf等必要功能的开关,让网站接入操作更简便;
-10、优化了登录界面和后台风格,优化了部分功能展示,让平台整体显得更专业。
-
-1.4.7版本升级步骤
-
-1、将edge-api、edge-admin、edge-user三个组件的configs文件夹、平台的mysql数据库文件备份一下;
-
-2、杀掉进程
-killall -9 edge-api
-killall -9 edge-admin
-killall -9 edge-user
-
-3、上传文件到/data/并解压(下面的命令不会覆盖原有有用配置)
-unzip -o edge-admin-linux-amd64-v1.4.7.zip -d /data/
-unzip -o edge-user-linux-amd64-v1.4.7.zip -d /data/
-
-4、依次运行edge-api、edge-admin、edge-user
-
-cd /data/edge-admin/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、检查进程 ps aux | grep edge,看下对应进程是否在;
-6、检查端口 ss -tuln,看下对应端口是否监听;
-7、检查平台,登录平台,看下版本是否1.4.7,看下(node、dns)边缘节点是否最新(会自动升级),点一下各个页面看是否正常;
-8、使用clickhouse安装脚本完成clickhouse安装,并在管理平台--系统设置--高级设置--日志数据库(clickhouse)进行配置;
-9、在管理平台--网站列表--日志策略,新增日志策略,选“文件+clickhouse”、公用、停用默认数据库存储;
-9、检查业务,打开某个经过waf的网站,查看网站是否正常打开,查看日志显示是否正常;
-10、完成升级。
-
-特别说明:
-1、边缘节点的fluent-bit会自动安装,不需要手工安装和配置;
-2、edge-node和edge-dns支持在ubuntu22.04和aws2023系统安装运行,可通过平台下发成功。
diff --git a/EdgeNode/internal/const/const.go b/EdgeNode/internal/const/const.go
index 49184b0..ae07326 100644
--- a/EdgeNode/internal/const/const.go
+++ b/EdgeNode/internal/const/const.go
@@ -1,7 +1,7 @@
package teaconst
const (
- Version = "1.4.8" //1.3.8.2
+ Version = "1.4.9" //1.3.8.2
ProductName = "Edge Node"
ProcessName = "edge-node"
diff --git a/EdgePlus/pkg/utils/edition.go b/EdgePlus/pkg/utils/edition.go
index c3e540a..30a2819 100644
--- a/EdgePlus/pkg/utils/edition.go
+++ b/EdgePlus/pkg/utils/edition.go
@@ -17,7 +17,7 @@ func FindAllEditions() []*EditionDefinition {
MaxNodes: 20,
},
{
- Name: "专业版",
+ Name: "商业版",
Code: EditionPro,
MaxNodes: 100,
},
diff --git a/EdgeUser/internal/const/const.go b/EdgeUser/internal/const/const.go
index 8ab824f..d085702 100644
--- a/EdgeUser/internal/const/const.go
+++ b/EdgeUser/internal/const/const.go
@@ -1,7 +1,7 @@
package teaconst
const (
- Version = "1.4.8" //1.3.8.2
+ Version = "1.4.9" //1.3.8.2
ProductName = "Edge User"
ProcessName = "edge-user"
diff --git a/EdgeUser/internal/web/actions/default/httpdns/apps/sdk_check.go b/EdgeUser/internal/web/actions/default/httpdns/apps/sdk_check.go
index 1325000..09156d8 100644
--- a/EdgeUser/internal/web/actions/default/httpdns/apps/sdk_check.go
+++ b/EdgeUser/internal/web/actions/default/httpdns/apps/sdk_check.go
@@ -28,19 +28,20 @@ func (this *SdkCheckAction) RunGet(params struct {
return
}
+ version := strings.TrimSpace(params.Version)
t := strings.ToLower(strings.TrimSpace(params.Type))
if t == "doc" {
- docPath := findUploadedSDKDocPath(platform, params.Version)
+ docPath := findUploadedSDKDocPath(platform, version)
if len(docPath) == 0 {
this.Data["exists"] = false
- this.Data["message"] = "Documentation is unavailable, please contact admin"
+ this.Data["message"] = "当前平台/版本尚未上传集成文档"
this.Success()
return
}
downloadURL := "/httpdns/apps/sdk/doc?platform=" + url.QueryEscape(platform)
- if len(strings.TrimSpace(params.Version)) > 0 {
- downloadURL += "&version=" + url.QueryEscape(strings.TrimSpace(params.Version))
+ if len(version) > 0 {
+ downloadURL += "&version=" + url.QueryEscape(version)
}
this.Data["exists"] = true
this.Data["url"] = downloadURL
@@ -48,17 +49,17 @@ func (this *SdkCheckAction) RunGet(params struct {
return
}
- archivePath := findSDKArchivePath(filename, params.Version)
+ archivePath := findSDKArchivePath(filename, version)
if len(archivePath) == 0 {
this.Data["exists"] = false
- this.Data["message"] = "SDK package is unavailable, please contact admin"
+ this.Data["message"] = "当前平台/版本尚未上传 SDK 安装包"
this.Success()
return
}
downloadURL := "/httpdns/apps/sdk/download?platform=" + url.QueryEscape(platform)
- if len(strings.TrimSpace(params.Version)) > 0 {
- downloadURL += "&version=" + url.QueryEscape(strings.TrimSpace(params.Version))
+ if len(version) > 0 {
+ downloadURL += "&version=" + url.QueryEscape(version)
}
downloadURL += "&raw=1"
this.Data["exists"] = true
diff --git a/EdgeUser/internal/web/actions/default/httpdns/apps/sdk_doc.go b/EdgeUser/internal/web/actions/default/httpdns/apps/sdk_doc.go
index ce7edb2..8286a46 100644
--- a/EdgeUser/internal/web/actions/default/httpdns/apps/sdk_doc.go
+++ b/EdgeUser/internal/web/actions/default/httpdns/apps/sdk_doc.go
@@ -3,7 +3,6 @@ package apps
import (
"os"
"path/filepath"
- "strings"
"github.com/TeaOSLab/EdgeUser/internal/web/actions/actionutils"
)
@@ -20,7 +19,7 @@ func (this *SdkDocAction) RunGet(params struct {
Platform string
Version string
}) {
- platform, _, readmeRelativePath, _, err := resolveSDKPlatform(params.Platform)
+ platform, _, _, _, err := resolveSDKPlatform(params.Platform)
if err != nil {
this.Data["exists"] = false
this.Data["message"] = err.Error()
@@ -28,35 +27,25 @@ func (this *SdkDocAction) RunGet(params struct {
return
}
- var data []byte
- uploadedDocPath := findUploadedSDKDocPath(platform, params.Version)
- if len(uploadedDocPath) > 0 {
- data, err = os.ReadFile(uploadedDocPath)
- }
-
- sdkRoot, sdkRootErr := findSDKRoot()
- if len(data) == 0 && sdkRootErr == nil {
- readmePath := filepath.Join(sdkRoot, readmeRelativePath)
- data, err = os.ReadFile(readmePath)
- }
-
- if len(data) == 0 {
- localDocPath := findLocalSDKDocPath(platform)
- if len(localDocPath) > 0 {
- data, err = os.ReadFile(localDocPath)
- }
- }
-
- if len(data) == 0 || err != nil {
+ docPath := findUploadedSDKDocPath(platform, params.Version)
+ if len(docPath) == 0 {
this.Data["exists"] = false
- this.Data["message"] = "SDK documentation is unavailable for current platform, please contact admin"
+ this.Data["message"] = "当前平台/版本尚未上传集成文档"
this.Success()
return
}
- downloadName := filepath.Base(uploadedDocPath)
+ data, err := os.ReadFile(docPath)
+ if err != nil || len(data) == 0 {
+ this.Data["exists"] = false
+ this.Data["message"] = "读取集成文档失败"
+ this.Success()
+ return
+ }
+
+ downloadName := filepath.Base(docPath)
if len(downloadName) == 0 || downloadName == "." || downloadName == string(filepath.Separator) {
- downloadName = "httpdns-sdk-" + strings.ToLower(platform) + ".md"
+ downloadName = "sdk-doc.md"
}
this.AddHeader("Content-Type", "text/markdown; charset=utf-8")
diff --git a/EdgeUser/internal/web/actions/default/httpdns/apps/sdk_download.go b/EdgeUser/internal/web/actions/default/httpdns/apps/sdk_download.go
index 0f6f4a7..f184927 100644
--- a/EdgeUser/internal/web/actions/default/httpdns/apps/sdk_download.go
+++ b/EdgeUser/internal/web/actions/default/httpdns/apps/sdk_download.go
@@ -32,7 +32,7 @@ func (this *SdkDownloadAction) RunGet(params struct {
archivePath := findSDKArchivePath(filename, params.Version)
if len(archivePath) == 0 {
this.Data["exists"] = false
- this.Data["message"] = "SDK archive is unavailable for current platform, please contact admin: " + filename
+ this.Data["message"] = "当前平台/版本尚未上传 SDK 安装包"
this.Success()
return
}
@@ -40,7 +40,7 @@ func (this *SdkDownloadAction) RunGet(params struct {
fp, err := os.Open(archivePath)
if err != nil {
this.Data["exists"] = false
- this.Data["message"] = "failed to open SDK archive: " + err.Error()
+ this.Data["message"] = "打开 SDK 安装包失败: " + err.Error()
this.Success()
return
}
diff --git a/EdgeUser/internal/web/actions/default/httpdns/apps/sdk_helpers.go b/EdgeUser/internal/web/actions/default/httpdns/apps/sdk_helpers.go
index a1095c6..236d5c9 100644
--- a/EdgeUser/internal/web/actions/default/httpdns/apps/sdk_helpers.go
+++ b/EdgeUser/internal/web/actions/default/httpdns/apps/sdk_helpers.go
@@ -1,16 +1,183 @@
package apps
import (
+ "encoding/json"
"errors"
"os"
"path/filepath"
- "sort"
"strings"
"time"
"github.com/iwind/TeaGo/Tea"
)
+type sdkUploadMeta struct {
+ Platform string `json:"platform"`
+ Version string `json:"version"`
+ FileType string `json:"fileType"` // sdk | doc
+ Filename string `json:"filename"`
+ UpdatedAt int64 `json:"updatedAt"`
+}
+
+type sdkUploadMetaRecord struct {
+ Meta sdkUploadMeta
+ Dir string
+ FilePath string
+}
+
+func sdkUploadMetaFilename(platform string, version string, fileType string) string {
+ platform = strings.ToLower(strings.TrimSpace(platform))
+ version = strings.TrimSpace(version)
+ fileType = strings.ToLower(strings.TrimSpace(fileType))
+ return ".httpdns-sdk-meta-" + platform + "-v" + version + "-" + fileType + ".json"
+}
+
+func isSDKUploadMetaFile(name string) bool {
+ name = strings.ToLower(strings.TrimSpace(name))
+ return strings.HasPrefix(name, ".httpdns-sdk-meta-") && strings.HasSuffix(name, ".json")
+}
+
+func parseSDKPlatformFromDownloadFilename(downloadFilename string) string {
+ name := strings.ToLower(strings.TrimSpace(downloadFilename))
+ if !strings.HasPrefix(name, "httpdns-sdk-") || !strings.HasSuffix(name, ".zip") {
+ return ""
+ }
+
+ platform := strings.TrimSuffix(strings.TrimPrefix(name, "httpdns-sdk-"), ".zip")
+ switch platform {
+ case "android", "ios", "flutter":
+ return platform
+ default:
+ return ""
+ }
+}
+
+func listSDKUploadMetaRecords() []sdkUploadMetaRecord {
+ type wrapped struct {
+ record sdkUploadMetaRecord
+ modTime time.Time
+ }
+
+ byKey := map[string]wrapped{}
+ for _, dir := range sdkUploadSearchDirs() {
+ entries, err := os.ReadDir(dir)
+ if err != nil {
+ continue
+ }
+
+ for _, entry := range entries {
+ if entry.IsDir() {
+ continue
+ }
+
+ name := entry.Name()
+ if !isSDKUploadMetaFile(name) {
+ continue
+ }
+
+ metaPath := filepath.Join(dir, name)
+ data, err := os.ReadFile(metaPath)
+ if err != nil || len(data) == 0 {
+ continue
+ }
+
+ var meta sdkUploadMeta
+ if err = json.Unmarshal(data, &meta); err != nil {
+ continue
+ }
+
+ meta.Platform = strings.ToLower(strings.TrimSpace(meta.Platform))
+ meta.Version = strings.TrimSpace(meta.Version)
+ meta.FileType = strings.ToLower(strings.TrimSpace(meta.FileType))
+ meta.Filename = filepath.Base(strings.TrimSpace(meta.Filename))
+ if len(meta.Platform) == 0 || len(meta.Version) == 0 || len(meta.Filename) == 0 {
+ continue
+ }
+ if meta.FileType != "sdk" && meta.FileType != "doc" {
+ continue
+ }
+ if strings.Contains(meta.Filename, "..") || strings.Contains(meta.Filename, "/") || strings.Contains(meta.Filename, "\\") {
+ continue
+ }
+
+ filePath := filepath.Join(dir, meta.Filename)
+ fileStat, err := os.Stat(filePath)
+ if err != nil || fileStat.IsDir() || fileStat.Size() <= 0 {
+ continue
+ }
+
+ metaStat, err := os.Stat(metaPath)
+ if err != nil {
+ continue
+ }
+ if meta.UpdatedAt <= 0 {
+ meta.UpdatedAt = metaStat.ModTime().Unix()
+ }
+
+ key := meta.Platform + "|" + meta.Version + "|" + meta.FileType
+ current := wrapped{
+ record: sdkUploadMetaRecord{
+ Meta: meta,
+ Dir: dir,
+ FilePath: filePath,
+ },
+ modTime: metaStat.ModTime(),
+ }
+ old, ok := byKey[key]
+ if !ok ||
+ current.record.Meta.UpdatedAt > old.record.Meta.UpdatedAt ||
+ (current.record.Meta.UpdatedAt == old.record.Meta.UpdatedAt && current.modTime.After(old.modTime)) ||
+ (current.record.Meta.UpdatedAt == old.record.Meta.UpdatedAt && current.modTime.Equal(old.modTime) && current.record.FilePath > old.record.FilePath) {
+ byKey[key] = current
+ }
+ }
+ }
+
+ result := make([]sdkUploadMetaRecord, 0, len(byKey))
+ for _, item := range byKey {
+ result = append(result, item.record)
+ }
+ return result
+}
+
+func findSDKUploadFileByMeta(platform string, version string, fileType string) string {
+ platform = strings.ToLower(strings.TrimSpace(platform))
+ version = strings.TrimSpace(version)
+ fileType = strings.ToLower(strings.TrimSpace(fileType))
+ if len(platform) == 0 || len(version) == 0 {
+ return ""
+ }
+
+ for _, record := range listSDKUploadMetaRecords() {
+ if record.Meta.Platform == platform && record.Meta.Version == version && record.Meta.FileType == fileType {
+ return record.FilePath
+ }
+ }
+ return ""
+}
+
+func findNewestSDKUploadFileByMeta(platform string, fileType string) string {
+ platform = strings.ToLower(strings.TrimSpace(platform))
+ fileType = strings.ToLower(strings.TrimSpace(fileType))
+ if len(platform) == 0 {
+ return ""
+ }
+
+ var foundPath string
+ var foundUpdatedAt int64
+ for _, record := range listSDKUploadMetaRecords() {
+ if record.Meta.Platform != platform || record.Meta.FileType != fileType {
+ continue
+ }
+
+ if len(foundPath) == 0 || record.Meta.UpdatedAt > foundUpdatedAt || (record.Meta.UpdatedAt == foundUpdatedAt && record.FilePath > foundPath) {
+ foundPath = record.FilePath
+ foundUpdatedAt = record.Meta.UpdatedAt
+ }
+ }
+ return foundPath
+}
+
func sdkUploadDir() string {
dirs := sdkUploadDirs()
if len(dirs) > 0 {
@@ -27,6 +194,7 @@ func sdkUploadDirs() []string {
filepath.Clean(Tea.Root + "/../edge-user/data/httpdns/sdk"),
filepath.Clean(Tea.Root + "/../../data/httpdns/sdk"),
}
+
results := make([]string, 0, len(candidates))
seen := map[string]bool{}
for _, dir := range candidates {
@@ -54,67 +222,6 @@ func sdkUploadSearchDirs() []string {
return results
}
-func findFirstExistingDir(paths []string) string {
- for _, path := range paths {
- stat, err := os.Stat(path)
- if err == nil && stat.IsDir() {
- return path
- }
- }
- return ""
-}
-
-func findFirstExistingFile(paths []string) string {
- for _, path := range paths {
- stat, err := os.Stat(path)
- if err == nil && !stat.IsDir() && stat.Size() > 0 {
- return path
- }
- }
- return ""
-}
-
-func findNewestExistingFile(paths []string) string {
- type fileInfo struct {
- path string
- modTime time.Time
- }
- result := fileInfo{}
- for _, path := range paths {
- stat, err := os.Stat(path)
- if err != nil || stat.IsDir() {
- continue
- }
- if stat.Size() <= 0 {
- continue
- }
- if len(result.path) == 0 || stat.ModTime().After(result.modTime) || (stat.ModTime().Equal(result.modTime) && path > result.path) {
- result.path = path
- result.modTime = stat.ModTime()
- }
- }
- return result.path
-}
-
-func findSDKRoot() (string, error) {
- candidates := []string{
- filepath.Clean(Tea.Root + "/EdgeHttpDNS/sdk"),
- filepath.Clean(Tea.Root + "/edge-httpdns/sdk"),
- filepath.Clean(Tea.Root + "/edge-httpdns/edge-httpdns/sdk"),
- filepath.Clean(Tea.Root + "/../EdgeHttpDNS/sdk"),
- filepath.Clean(Tea.Root + "/../../EdgeHttpDNS/sdk"),
- filepath.Clean(Tea.Root + "/../edge-httpdns/sdk"),
- filepath.Clean(Tea.Root + "/../../edge-httpdns/sdk"),
- }
-
- dir := findFirstExistingDir(candidates)
- if len(dir) > 0 {
- return dir, nil
- }
-
- return "", errors.New("SDK files are not found on current server")
-}
-
func resolveSDKPlatform(platform string) (key string, relativeDir string, readmeRelativePath string, downloadFilename string, err error) {
switch strings.ToLower(strings.TrimSpace(platform)) {
case "android":
@@ -122,52 +229,23 @@ func resolveSDKPlatform(platform string) (key string, relativeDir string, readme
case "ios":
return "ios", "ios", "ios/README.md", "httpdns-sdk-ios.zip", nil
case "flutter":
- return "flutter", "flutter/aliyun_httpdns", "flutter/aliyun_httpdns/README.md", "httpdns-sdk-flutter.zip", nil
+ return "flutter", "flutter/new_httpdns", "flutter/new_httpdns/README.md", "httpdns-sdk-flutter.zip", nil
default:
- return "", "", "", "", errors.New("invalid platform, expected one of: android, ios, flutter")
+ return "", "", "", "", errors.New("不支持的平台,可选值:android、ios、flutter")
}
}
func findSDKArchivePath(downloadFilename string, version string) string {
- searchDirs := sdkUploadSearchDirs()
-
- normalizedVersion := strings.TrimSpace(version)
- base := strings.TrimSuffix(downloadFilename, ".zip")
- if len(normalizedVersion) > 0 {
- versionFiles := []string{}
- for _, dir := range searchDirs {
- versionFiles = append(versionFiles, filepath.Join(dir, base+"-v"+normalizedVersion+".zip"))
- }
- if path := findFirstExistingFile(versionFiles); len(path) > 0 {
- return path
- }
+ platform := parseSDKPlatformFromDownloadFilename(downloadFilename)
+ if len(platform) == 0 {
return ""
}
- patternName := base + "-v*.zip"
- matches := []string{}
- for _, dir := range searchDirs {
- found, _ := filepath.Glob(filepath.Join(dir, patternName))
- for _, file := range found {
- stat, err := os.Stat(file)
- if err == nil && !stat.IsDir() {
- matches = append(matches, file)
- }
- }
+ normalizedVersion := strings.TrimSpace(version)
+ if len(normalizedVersion) > 0 {
+ return findSDKUploadFileByMeta(platform, normalizedVersion, "sdk")
}
- if len(matches) > 0 {
- return findNewestExistingFile(matches)
- }
-
- exactFiles := []string{}
- for _, dir := range searchDirs {
- exactFiles = append(exactFiles, filepath.Join(dir, downloadFilename))
- }
- if path := findFirstExistingFile(exactFiles); len(path) > 0 {
- return path
- }
-
- return ""
+ return findNewestSDKUploadFileByMeta(platform, "sdk")
}
func findUploadedSDKDocPath(platform string, version string) string {
@@ -176,43 +254,9 @@ func findUploadedSDKDocPath(platform string, version string) string {
return ""
}
- searchDirs := sdkUploadSearchDirs()
normalizedVersion := strings.TrimSpace(version)
if len(normalizedVersion) > 0 {
- exactVersion := []string{}
- for _, dir := range searchDirs {
- exactVersion = append(exactVersion, filepath.Join(dir, "httpdns-sdk-"+platform+"-v"+normalizedVersion+".md"))
- }
- if file := findFirstExistingFile(exactVersion); len(file) > 0 {
- return file
- }
- return ""
+ return findSDKUploadFileByMeta(platform, normalizedVersion, "doc")
}
-
- matches := []string{}
- for _, dir := range searchDirs {
- pattern := filepath.Join(dir, "httpdns-sdk-"+platform+"-v*.md")
- found, _ := filepath.Glob(pattern)
- matches = append(matches, found...)
- }
- if len(matches) > 0 {
- sort.Strings(matches)
- return findNewestExistingFile(matches)
- }
-
- exact := []string{}
- for _, dir := range searchDirs {
- exact = append(exact, filepath.Join(dir, "httpdns-sdk-"+platform+".md"))
- }
- return findFirstExistingFile(exact)
-}
-
-func findLocalSDKDocPath(platform string) string {
- filename := strings.ToLower(strings.TrimSpace(platform)) + ".md"
- candidates := []string{
- filepath.Clean(Tea.Root + "/edge-admin/web/views/@default/httpdns/apps/docs/" + filename),
- filepath.Clean(Tea.Root + "/EdgeUser/web/views/@default/httpdns/apps/docs/" + filename),
- filepath.Clean(Tea.Root + "/EdgeAdmin/web/views/@default/httpdns/apps/docs/" + filename),
- }
- return findFirstExistingFile(candidates)
+ return findNewestSDKUploadFileByMeta(platform, "doc")
}
diff --git a/EdgeUser/web/views/@default/@layout.css b/EdgeUser/web/views/@default/@layout.css
index 30b7d37..38c8923 100644
--- a/EdgeUser/web/views/@default/@layout.css
+++ b/EdgeUser/web/views/@default/@layout.css
@@ -7,25 +7,30 @@
overflow-x: hidden;
border-right: 1px #ddd solid;
}
+
.left-box .menu {
width: 95% !important;
}
+
.left-box .menu .item {
line-height: 1.2;
position: relative;
padding-left: 1em !important;
}
+
.left-box .menu .item .icon {
position: absolute;
top: 50%;
left: 0;
margin-top: -0.4em !important;
}
+
.left-box .menu .item .sub-name {
font-size: 0.7em;
font-style: normal;
color: grey;
}
+
.left-box .menu .item.separator {
border-bottom: 1px #eee solid !important;
padding-top: 0;
@@ -33,9 +38,11 @@
margin-top: 0 !important;
margin-bottom: 0 !important;
}
+
.left-box .menu .item.on span {
border-bottom: 1px #666 dashed;
}
+
.left-box .menu .item.off span var {
font-style: normal;
background: #db2828;
@@ -45,33 +52,42 @@
border-radius: 2px;
margin-left: 1em;
}
+
.left-box .menu .item.active {
background: rgba(230, 230, 230, 0.35) !important;
border-radius: 3px;
}
+
.left-box .menu .header {
border-bottom: 1px #ddd solid;
padding-left: 0 !important;
padding-bottom: 1em !important;
}
+
.left-box::-webkit-scrollbar {
width: 4px;
}
+
.left-box.disabled {
opacity: 0.1;
}
+
.left-box.tiny {
top: 10.5em;
}
+
.left-box.without-tabbar {
top: 3em;
}
+
.left-box.with-menu {
top: 10em;
}
+
.left-box.without-menu {
top: 6em;
}
+
.right-box {
position: fixed;
top: 7.5em;
@@ -82,41 +98,52 @@
padding-bottom: 2em;
overflow-y: auto;
}
+
@media screen and (max-width: 512px) {
.right-box {
left: 13em;
padding-right: 1em;
}
}
+
body.expanded .right-box {
left: 10em;
}
+
.right-box.tiny {
top: 10.4em;
left: 26.5em;
}
+
.right-box::-webkit-scrollbar {
width: 4px;
}
+
.right-box.without-tabbar {
top: 3em;
}
+
.right-box.with-menu {
top: 10em;
}
+
.right-box.without-menu {
top: 6em;
}
+
.main.without-footer .left-box {
bottom: 0.2em;
}
+
.narrow-scrollbar::-webkit-scrollbar {
width: 4px;
}
+
.grid.counter-chart {
margin-top: 1em !important;
margin-left: 0.4em !important;
}
+
.grid.counter-chart .column {
margin-bottom: 1em;
font-size: 0.85em;
@@ -125,172 +152,216 @@ body.expanded .right-box {
border: 1px rgba(0, 0, 0, 0.1) solid;
border-right: 0;
}
+
.grid.counter-chart .column div.value {
margin-top: 1.5em;
font-weight: normal;
}
+
.grid.counter-chart .column div.value span {
font-size: 1.5em;
margin-right: 0.2em;
}
+
.grid.counter-chart .column.with-border {
border-right: 1px rgba(0, 0, 0, 0.1) solid;
}
+
.grid.counter-chart h4 {
color: grey;
position: relative;
font-size: 1em;
text-align: left;
}
+
.grid.counter-chart h4 a {
position: absolute;
right: 0.1em;
font-size: 1.26em;
display: none;
}
+
.grid.counter-chart .column:hover {
background: rgba(0, 0, 0, 0.03) !important;
}
+
.grid.counter-chart .column:hover a {
display: inline;
}
+
/** 通用 **/
* {
scrollbar-color: rgba(0, 0, 0, 0.2) transparent;
scrollbar-width: thin;
}
+
.clear {
clear: both;
}
+
.hidden {
display: none;
}
+
pre {
white-space: pre-wrap;
}
+
a.disabled,
a.disabled:hover,
a.disabled:active,
span.disabled {
color: #ccc !important;
}
+
a.enabled,
span.enabled,
span.green {
color: #21ba45;
}
+
a.grey,
span.grey,
label.grey,
p.grey {
color: grey !important;
}
+
p.grey {
margin-top: 0.8em;
}
+
span.red,
pre.red {
color: #db2828;
}
+
span.blue {
color: #4183c4;
}
+
span.orange {
color: #ff851b;
}
+
pre:not(.CodeMirror-line) {
font-family: Lato, 'Helvetica Neue', Arial, Helvetica, sans-serif !important;
}
+
tbody {
background: transparent;
}
+
.table.width30 {
width: 30em !important;
}
+
.table.width35 {
width: 35em !important;
}
+
.table.width40 {
width: 40em !important;
}
+
.table th,
.table td {
font-size: 0.9em !important;
}
+
.table tr.active td {
background: rgba(0, 0, 0, 0.01) !important;
}
+
p.comment,
div.comment {
color: #959da6;
padding-top: 0.4em;
font-size: 1em;
}
+
p.comment em,
div.comment em {
font-style: italic !important;
}
+
.truncate {
white-space: nowrap;
-ms-text-overflow: ellipsis;
overflow: hidden;
text-overflow: ellipsis;
}
+
div.margin,
p.margin {
margin-top: 1em;
}
+
/** 操作按钮容器 **/
.op.one {
width: 4em;
}
+
.op.two {
width: 7.4em;
}
+
.op.three {
width: 9em;
}
+
.op.four {
width: 10em;
}
+
/** 主菜单 **/
.main-menu {
width: 8em !important;
}
+
.main-menu .ui.menu {
width: 100% !important;
border-radius: 0 !important;
}
+
.main-menu .ui.menu .item.separator {
border-top: 1px rgba(0, 0, 0, 0.2) solid;
height: 1px;
min-height: 0;
padding: 0;
}
+
@media screen and (max-width: 512px) {
.main-menu {
width: auto !important;
}
+
.main-menu .ui.menu {
width: 3.6em !important;
}
+
.main-menu .ui.menu .item.separator {
display: none;
}
+
.main-menu .ui.menu .item {
padding-top: 2em;
padding-bottom: 2.4em;
}
}
+
.main-menu .ui.labeled.icon.menu .item {
font-size: 0.9em;
}
+
.main-menu .ui.menu {
padding-bottom: 3em;
}
+
.main-menu .ui.menu .item .subtitle {
display: none;
}
+
.main-menu .ui.menu .item.expend .subtitle {
display: block;
font-size: 10px;
@@ -298,20 +369,24 @@ p.margin {
margin-top: 0.5em;
color: grey;
}
+
@media screen and (max-width: 512px) {
.main-menu .ui.menu .item.expend .subtitle {
display: none;
}
}
+
.main-menu .ui.menu .sub-items .item {
padding-left: 2.8em !important;
padding-right: 0.4em !important;
}
+
.main-menu .ui.menu .sub-items .item .icon {
position: absolute;
left: 1.1em;
top: 0.93em;
}
+
.main-menu .ui.menu .sub-items .item .label {
margin-left: 0;
margin-right: 0;
@@ -319,42 +394,53 @@ p.margin {
padding-right: 0.4em;
min-width: 2em;
}
+
@media screen and (max-width: 512px) {
.main-menu .ui.menu .sub-items .item {
padding-left: 1em !important;
}
}
+
.main-menu .ui.menu .item.active {
background: rgba(230, 230, 230, 0.45) !important;
}
+
.main-menu .ui.menu .sub-items .item.active {
background: rgba(230, 230, 230, 0.55) !important;
}
+
/** 扩展UI **/
.field.text {
padding: 0.5em;
}
+
/** body **/
@keyframes blink {
from {
opacity: 0.1;
}
+
to {
opacity: 0.8;
}
}
+
body .ui.menu .item .blink {
animation: blink 1s infinite;
}
+
body.expanded .main-menu {
display: none;
}
+
body.expanded .sub-menu {
display: none;
}
+
body.expanded .main {
left: 1em;
}
+
/** 布局相关 */
.top-nav {
border-radius: 0 !important;
@@ -364,9 +450,11 @@ body.expanded .main {
overflow-x: auto;
background: #14539A !important;
}
+
.top-nav::-webkit-scrollbar {
height: 2px;
}
+
.top-nav img.avatar {
width: 1.6em !important;
height: 1.6em !important;
@@ -375,20 +463,25 @@ body.expanded .main {
border-radius: 0.9em;
margin-right: 0.5em !important;
}
+
.top-nav em {
font-style: normal;
font-size: 0.9em;
padding-left: 0.2em;
}
+
.top-nav .item.red {
color: red !important;
}
+
.top-nav .item .hover-span span {
display: none;
}
+
.top-nav .item:hover .hover-span span {
display: inline;
}
+
/** 顶部菜单 **/
.top-secondary-menu {
position: fixed;
@@ -398,23 +491,28 @@ body.expanded .main {
z-index: 100;
background: white;
}
+
.top-secondary-menu .menu {
margin-top: 0 !important;
margin-bottom: 0 !important;
border-radius: 0 !important;
}
+
.top-secondary-menu .menu var {
font-style: normal;
}
+
.top-secondary-menu .divider {
margin-top: 0 !important;
margin-bottom: 0 !important;
}
+
@media screen and (max-width: 512px) {
.top-secondary-menu {
left: 4em;
}
}
+
/** 右侧主操作区 **/
.main {
position: absolute;
@@ -424,78 +522,99 @@ body.expanded .main {
padding-right: 1em;
right: 1em;
}
+
@media screen and (max-width: 512px) {
.main {
left: 4em;
}
}
+
.main.without-menu {
left: 9em;
}
+
.main.without-secondary-menu {
top: 2.9em;
}
+
@media screen and (max-width: 512px) {
.main.without-menu {
left: 4em;
}
}
+
.main table td.title {
width: 10em;
}
+
.main table td.middle-title {
width: 14em;
}
+
.main table td {
vertical-align: top;
}
+
.main table td.color-border {
border-left: 1px #276ac6 solid !important;
}
+
.main table td.vertical-top {
vertical-align: top;
}
+
.main table td.vertical-middle {
vertical-align: middle;
}
+
.main table td[colspan="2"] a {
font-weight: normal;
}
+
.main table td em {
font-weight: normal;
font-style: normal;
font-size: 0.9em;
}
+
.main h3 {
font-weight: normal;
margin-top: 1em !important;
position: relative;
}
+
.main h3 span {
font-size: 0.8em;
}
+
.main h3 span.label {
color: #6435c9;
}
+
.main h3 a {
margin-left: 1em;
font-size: 14px !important;
right: 1em;
}
+
.main h4 {
font-weight: normal;
}
+
.main form h4 {
margin-top: 0.6em;
}
+
.main td span.small {
font-size: 0.8em;
}
+
.main .button.mini {
font-size: 0.8em;
padding: 0.2em;
margin-left: 1em;
}
+
.main-menu {
position: fixed;
/**top: 1.05em;**/
@@ -505,37 +624,47 @@ body.expanded .main {
background: #14539A !important;
z-index: 10;
}
+
.main-menu .menu {
background: #14539A !important;
}
+
.main-menu::-webkit-scrollbar {
width: 2px;
}
+
.main .tab-menu {
margin-top: 1em !important;
margin-bottom: 0 !important;
overflow-x: auto;
overflow-y: hidden;
}
+
.main .tab-menu .item {
padding: 1em !important;
}
+
.main .tab-menu .item var {
font-style: normal;
}
+
.main .tab-menu .item span {
font-size: 0.8em;
padding-left: 0.3em;
}
+
.main .tab-menu .item .icon {
margin-left: 0.6em;
}
+
.main .tab-menu .item.active {
background: #f8f8f9 !important;
}
+
.main .tab-menu::-webkit-scrollbar {
height: 4px;
}
+
.main .go-top-btn {
position: fixed;
right: 2.6em;
@@ -546,10 +675,12 @@ body.expanded .main {
z-index: 999999;
background: white;
}
+
/** 子菜单 **/
.main.without-menu .sub-menu {
display: none;
}
+
.sub-menu {
position: fixed;
left: 8em;
@@ -557,6 +688,7 @@ body.expanded .main {
top: 3em;
bottom: 2.8em;
}
+
.sub-menu .menus-box {
overflow-y: auto;
position: absolute;
@@ -566,14 +698,17 @@ body.expanded .main {
left: 0;
padding-right: 0.4em !important;
}
+
.sub-menu .menus-box::-webkit-scrollbar {
width: 4px;
height: 4px;
}
+
.sub-menu .menu {
max-width: 12em !important;
border-right: 0 !important;
}
+
@media screen and (max-width: 512px) {
.sub-menu {
position: relative;
@@ -581,32 +716,39 @@ body.expanded .main {
left: 0;
top: 0;
}
+
.sub-menu .menus-box {
position: relative !important;
}
+
.sub-menu .menu {
width: 100% !important;
max-width: 30em !important;
}
+
.sub-menu .menus-box .menu .item {
width: 100% !important;
max-width: 30em !important;
}
}
+
.sub-menu .menu .item.active {
font-weight: normal !important;
outline: none !important;
}
+
.sub-menu .menu .item:not(.header) {
padding-top: 0.7em !important;
padding-bottom: 0.7em !important;
}
+
.sub-menu .menu .item:not(.header) span {
font-size: 0.8em;
display: block;
margin-top: 0.6em !important;
line-height: 1.5;
}
+
.sub-menu .menu .item:not(.active):hover {
background: rgba(0, 0, 0, 0.05) !important;
border-top: 1px white solid !important;
@@ -614,53 +756,67 @@ body.expanded .main {
margin-top: -1px !important;
margin-bottom: -1px !important;
}
+
.sub-menu .menu .item.active {
background: rgba(0, 0, 0, 0.05) !important;
}
+
.sub-menu .menu .item var {
font-style: normal;
}
+
.sub-menu .menu .item:not(.active) var.grey {
color: grey;
}
+
.sub-menu .menu .item span:not(.green) {
color: grey;
}
+
.sub-menu .menu .item span.red {
color: #db2828 !important;
}
+
.sub-menu .menus-box .menu .item.header {
padding-right: 0.2em !important;
cursor: pointer;
}
+
.sub-menu .menus-box .menu .item.header span {
font-weight: normal;
color: grey;
font-size: 0.8em;
}
+
.sub-menu .menus-box .menu a {
display: block;
word-break: break-all;
line-height: 1.6 !important;
}
+
.sub-menu .menus-box .menu .item .menu {
margin-top: 0 !important;
}
+
.sub-menu .fourth-menu {
margin-left: 1.2em;
}
+
.sub-menu .fourth-menu .icon,
.sub-menu .third-menu .icon {
float: left !important;
}
+
/** 右侧文本子菜单 **/
.text.menu {
overflow-x: auto;
}
+
.text.menu::-webkit-scrollbar {
width: 4px;
height: 4px;
}
+
/** 脚部相关样式 **/
#footer {
position: fixed;
@@ -672,27 +828,34 @@ body.expanded .main {
z-index: 10;
overflow-x: auto;
}
+
#footer::-webkit-scrollbar {
height: 2px;
}
+
#footer a {
font-size: 0.9em;
}
+
#footer a form {
display: none;
}
+
#footer a:hover span,
#footer a:active span {
display: none;
}
+
#footer a:hover form,
#footer a:active form {
display: block;
}
+
#footer form input {
padding: 0;
margin: 0;
}
+
#footer-outer-box {
z-index: 999999;
position: fixed;
@@ -702,6 +865,7 @@ body.expanded .main {
background: rgba(0, 0, 0, 0.8);
bottom: 2.6em;
}
+
#footer-outer-box .qrcode {
width: 20em;
position: absolute;
@@ -710,92 +874,115 @@ body.expanded .main {
margin-top: -14em;
margin-left: -10em;
}
+
#footer-outer-box .qrcode img {
width: 100%;
}
+
#footer-outer-box .qrcode a {
position: absolute;
right: 0.5em;
top: 0.5em;
}
+
@media screen and (max-width: 512px) {
#footer-outer-box .qrcode {
margin-left: 0;
left: 3.5em;
}
}
+
/** Vue **/
[v-cloak] {
display: none !important;
}
+
/** auto complete **/
.autocomplete-box .menu {
background: #eee !important;
}
+
.autocomplete-box .menu::-webkit-scrollbar {
width: 4px;
}
+
.autocomplete-box .menu .item {
border-top: none !important;
}
+
select.auto-width {
width: auto !important;
}
+
/** column **/
@media screen and (max-width: 512px) {
.column:not(.one) {
width: 100% !important;
}
}
+
label[for] {
cursor: pointer !important;
}
+
label.blue {
color: #2185d0 !important;
}
+
/** Menu **/
.first-menu .menu.text {
margin-top: 0 !important;
margin-bottom: 0 !important;
}
+
.first-menu .divider {
margin-top: 0 !important;
margin-bottom: 0 !important;
}
+
.second-menu .menu.text {
margin-top: 0 !important;
margin-bottom: 0 !important;
}
+
.second-menu .menu.text em {
font-style: normal;
}
+
.second-menu .divider {
margin-top: 0 !important;
}
+
.menu a {
outline: none;
}
+
/** var **/
span.olive,
var.olive {
color: #b5cc18 !important;
}
+
span.dash {
border-bottom: 1px dashed grey;
}
+
span.hover:hover {
background: #eee;
}
+
/** checkbox **/
.checkbox label a,
.checkbox label {
font-size: 0.9em !important;
}
+
/** page **/
.page {
margin-top: 1em;
border-left: 1px solid #ddd;
}
+
.page a {
display: inline-block;
background: #fafafa;
@@ -806,62 +993,78 @@ span.hover:hover {
border: 1px solid #ddd;
border-left: 0;
}
+
.page a.active {
background: #2185d0 !important;
color: white;
}
+
.page a:hover {
background: #eee;
}
+
.page select {
padding-top: 0.3em !important;
padding-bottom: 0.3em !important;
}
+
/** popup **/
.swal2-html-container {
overflow-x: hidden;
}
+
.swal2-close,
.swal2-close:focus {
border: 0;
}
+
.swal2-confirm:focus,
.swal2-cancel:focus {
border: 3px #ddd solid !important;
}
+
.swal2-confirm,
.swal2-cancel {
border: 3px #fff solid !important;
}
+
.swal2-cancel {
margin-left: 2em !important;
}
+
/** 排序 **/
.sortable-ghost {
background: #ddd !important;
opacity: 0.1;
}
+
.sortable-drag {
opacity: 1;
}
+
.icon.handle {
cursor: pointer;
}
+
.label.port-label {
margin-top: 0.4em !important;
margin-bottom: 0.4em !important;
display: block;
line-height: 1.5;
}
+
.label {
word-break: break-all;
}
+
td .label.small {
margin-bottom: 0.2em !important;
}
+
td {
word-break: break-all;
}
+
.combo-box .menu {
max-height: 17em;
overflow-y: auto;
@@ -870,29 +1073,94 @@ td {
border-top: 0;
z-index: 100;
}
+
.combo-box .menu::-webkit-scrollbar {
width: 4px;
}
+
.methods-box {
background: white;
}
+
.methods-box .method-box {
margin-bottom: 1em;
padding: 0.5em 1em;
border: 1px #eee solid;
}
+
.methods-box .method-box.active {
border: 1px #eee solid;
background: #eee;
}
+
.methods-box .method-box:hover {
background: #eee;
cursor: pointer;
}
+
.scroll-box {
overflow-y: auto;
}
+
.scroll-box::-webkit-scrollbar {
width: 4px;
}
-/*# sourceMappingURL=@layout.css.map */
\ No newline at end of file
+
+/*# sourceMappingURL=@layout.css.map */
+/* Override Primary Button Color for WAF Platform */
+.ui.primary.button,
+.ui.primary.buttons .button {
+ background-color: #0f2c54 !important;
+ color: #ffffff !important;
+}
+
+.ui.primary.button:hover,
+.ui.primary.buttons .button:hover {
+ background-color: #0a1f3a !important;
+}
+
+.ui.primary.button:focus,
+.ui.primary.buttons .button:focus {
+ background-color: #08192e !important;
+}
+
+.ui.primary.button:active,
+.ui.primary.buttons .button:active,
+.ui.primary.active.button {
+ background-color: #050d18 !important;
+}
+
+.text-primary,
+.blue {
+ color: #0f2c54 !important;
+}
+
+/* Override Semantic UI Default Blue */
+.ui.blue.button,
+.ui.blue.buttons .button {
+ background-color: #0f2c54 !important;
+ color: #ffffff !important;
+}
+
+.ui.blue.button:hover,
+.ui.blue.buttons .button:hover {
+ background-color: #0a1f3a !important;
+}
+
+.ui.basic.blue.button,
+.ui.basic.blue.buttons .button {
+ box-shadow: 0 0 0 1px #0f2c54 inset !important;
+ color: #0f2c54 !important;
+}
+
+.ui.basic.blue.button:hover,
+.ui.basic.blue.buttons .button:hover {
+ background: transparent !important;
+ box-shadow: 0 0 0 1px #0a1f3a inset !important;
+ color: #0a1f3a !important;
+}
+
+.ui.menu .active.item {
+ border-color: #2185d0 !important;
+ color: #2185d0 !important;
+}
\ No newline at end of file
diff --git a/EdgeUser/web/views/@default/@layout_popup.css b/EdgeUser/web/views/@default/@layout_popup.css
index 0fcc986..c98900b 100644
--- a/EdgeUser/web/views/@default/@layout_popup.css
+++ b/EdgeUser/web/views/@default/@layout_popup.css
@@ -3,57 +3,72 @@
scrollbar-color: rgba(0, 0, 0, 0.2) transparent;
scrollbar-width: thin;
}
+
.clear {
clear: both;
}
+
.hidden {
display: none;
}
+
pre {
white-space: pre-wrap;
}
+
a.disabled,
a.disabled:hover,
a.disabled:active,
span.disabled {
color: #ccc !important;
}
+
a.enabled,
span.enabled,
span.green {
color: #21ba45;
}
+
span.grey,
label.grey,
p.grey {
color: grey !important;
}
+
p.grey {
margin-top: 0.8em;
}
+
span.red,
pre.red {
color: #db2828;
}
+
pre:not(.CodeMirror-line) {
font-family: Lato, 'Helvetica Neue', Arial, Helvetica, sans-serif !important;
}
+
tbody {
background: transparent;
}
+
.table.width30 {
width: 30em !important;
}
+
.table.width35 {
width: 35em !important;
}
+
.table.width40 {
width: 40em !important;
}
+
.table th,
.table td {
font-size: 0.9em !important;
}
+
p.comment,
div.comment {
color: #959da6;
@@ -62,37 +77,46 @@ div.comment {
word-break: break-all;
line-height: 1.8;
}
+
p.comment em,
div.comment em {
font-style: italic !important;
}
+
.truncate {
white-space: nowrap;
-ms-text-overflow: ellipsis;
overflow: hidden;
text-overflow: ellipsis;
}
+
div.margin,
p.margin {
margin-top: 1em;
}
+
/** 操作按钮容器 **/
.op.one {
width: 4em;
}
+
.op.two {
width: 7.4em;
}
+
.op.three {
width: 9em;
}
+
.op.four {
width: 10em;
}
+
/** 扩展UI **/
.field.text {
padding: 0.5em;
}
+
/** 右侧主操作区 **/
.main {
position: absolute;
@@ -102,169 +126,214 @@ p.margin {
padding-right: 1em;
right: 1em;
}
+
@media screen and (max-width: 512px) {
.main {
left: 4em;
}
}
+
.main.without-menu {
left: 9em;
}
+
.main.without-secondary-menu {
top: 2.9em;
}
+
@media screen and (max-width: 512px) {
.main.without-menu {
left: 4em;
}
}
+
.main table td.title {
width: 10em;
}
+
.main table td.middle-title {
width: 14em;
}
+
.main table td {
vertical-align: top;
}
+
.main table td.color-border {
border-left: 1px #276ac6 solid !important;
}
+
.main table td.vertical-top {
vertical-align: top;
}
+
.main table td.vertical-middle {
vertical-align: middle;
}
+
.main table td[colspan="2"] a {
font-weight: normal;
}
+
.main table td em {
font-weight: normal;
font-style: normal;
font-size: 0.9em;
}
+
.main h3 {
font-weight: normal;
margin-top: 0.5em !important;
}
+
.main h3 span {
font-size: 0.8em;
}
+
.main h3 span.label {
color: #6435c9;
}
+
.main h3 a {
margin-left: 1em;
font-size: 14px !important;
right: 1em;
}
+
.main h3 a::before {
content: "[";
}
+
.main h3 a::after {
content: "]";
}
+
.main h4 {
font-weight: normal;
}
+
.main td span.small {
font-size: 0.8em;
}
+
.main .button.mini {
font-size: 0.8em;
padding: 0.2em;
margin-left: 1em;
}
+
/** 右侧文本子菜单 **/
.text.menu {
overflow-x: auto;
}
+
.text.menu::-webkit-scrollbar {
width: 4px;
height: 4px;
}
+
/** Vue **/
[v-cloak] {
display: none !important;
}
+
/** auto complete **/
.autocomplete-box .menu {
background: #eee !important;
}
+
.autocomplete-box .menu::-webkit-scrollbar {
width: 4px;
}
+
.autocomplete-box .menu .item {
border-top: none !important;
}
+
select.auto-width {
width: auto !important;
}
+
/** column **/
@media screen and (max-width: 512px) {
.column:not(.one) {
width: 100% !important;
}
}
+
/** label **/
label[for] {
cursor: pointer !important;
}
+
label.blue {
color: #2185d0 !important;
}
+
span.blue {
color: #4183c4;
}
+
/** Menu **/
.first-menu .menu.text {
margin-top: 0 !important;
margin-bottom: 0 !important;
}
+
.first-menu .divider {
margin-top: 0 !important;
margin-bottom: 0 !important;
}
+
.second-menu .menu.text {
margin-top: 0 !important;
margin-bottom: 0 !important;
}
+
.second-menu .menu.text em {
font-style: normal;
}
+
.second-menu .divider {
margin-top: 0 !important;
}
+
.menu a {
outline: none;
}
+
/** var **/
span.olive,
var.olive {
color: #b5cc18 !important;
}
+
span.dash {
border-bottom: 1px dashed grey;
}
+
span.hover:hover {
background: #eee;
}
+
/** Message **/
.message .gopher {
width: 30px;
margin-right: 10px;
}
+
/** checkbox **/
.checkbox label a,
.checkbox label {
font-size: 0.8em !important;
}
+
/** page **/
.page {
margin-top: 1em;
border-left: 1px solid #ddd;
}
+
.page a {
display: inline-block;
background: #fafafa;
@@ -275,30 +344,37 @@ span.hover:hover {
border: 1px solid #ddd;
border-left: 0;
}
+
.page a.active {
background: #2185d0 !important;
color: white;
}
+
.page a:hover {
background: #eee;
}
+
/** popup **/
.swal2-html-container {
overflow-x: hidden;
}
+
.swal2-confirm:focus,
.swal2-cancel:focus,
.swal2-close:focus {
border: 3px #ddd solid !important;
}
+
.swal2-confirm,
.swal2-cancel,
.swal2-close {
border: 3px #fff solid !important;
}
+
.swal2-cancel {
margin-left: 2em !important;
}
+
.combo-box .menu {
max-height: 17em;
overflow-y: auto;
@@ -307,9 +383,11 @@ span.hover:hover {
border-top: 0;
z-index: 100;
}
+
.combo-box .menu::-webkit-scrollbar {
width: 4px;
}
+
code-label {
background: #fff;
border: 1px solid rgba(34, 36, 38, 0.15);
@@ -323,4 +401,62 @@ code-label {
font-weight: 700;
vertical-align: baseline;
}
-/*# sourceMappingURL=@layout_popup.css.map */
\ No newline at end of file
+
+/*# sourceMappingURL=@layout_popup.css.map */
+/* Override Primary Button Color for WAF Platform */
+.ui.primary.button,
+.ui.primary.buttons .button {
+ background-color: #0f2c54 !important;
+ color: #ffffff !important;
+}
+
+.ui.primary.button:hover,
+.ui.primary.buttons .button:hover {
+ background-color: #0a1f3a !important;
+}
+
+.ui.primary.button:focus,
+.ui.primary.buttons .button:focus {
+ background-color: #08192e !important;
+}
+
+.ui.primary.button:active,
+.ui.primary.buttons .button:active,
+.ui.primary.active.button {
+ background-color: #050d18 !important;
+}
+
+.text-primary,
+.blue {
+ color: #0f2c54 !important;
+}
+
+/* Override Semantic UI Default Blue */
+.ui.blue.button,
+.ui.blue.buttons .button {
+ background-color: #0f2c54 !important;
+ color: #ffffff !important;
+}
+
+.ui.blue.button:hover,
+.ui.blue.buttons .button:hover {
+ background-color: #0a1f3a !important;
+}
+
+.ui.basic.blue.button,
+.ui.basic.blue.buttons .button {
+ box-shadow: 0 0 0 1px #0f2c54 inset !important;
+ color: #0f2c54 !important;
+}
+
+.ui.basic.blue.button:hover,
+.ui.basic.blue.buttons .button:hover {
+ background: transparent !important;
+ box-shadow: 0 0 0 1px #0a1f3a inset !important;
+ color: #0a1f3a !important;
+}
+
+.ui.menu .active.item {
+ border-color: #2185d0 !important;
+ color: #2185d0 !important;
+}
\ No newline at end of file
diff --git a/HttpDNSSDK/.gitignore b/HttpDNSSDK/.gitignore
new file mode 100644
index 0000000..115313d
--- /dev/null
+++ b/HttpDNSSDK/.gitignore
@@ -0,0 +1,130 @@
+# ==========================================
+# HttpDNSSDK Unified .gitignore
+# ==========================================
+
+# OS generated files
+.DS_Store
+.DS_Store?
+._*
+.Spotlight-V100
+.Trashes
+Icon?
+ehthumbs.db
+Thumbs.db
+*.swp
+
+# IDEs and Editors
+.idea/
+.vscode/
+.kiro/
+*.iml
+*.ipr
+*.iws
+.classpath
+.project
+.settings/
+.cursor/
+.claude/
+.AGENTS.md
+
+# General Build & Gradle
+build/
+Build/
+.gradle/
+target/
+gen/
+out/
+bin/
+/gradlew
+/gradlew.bat
+
+# Android
+*.apk
+*.aab
+*.ap_
+*.dex
+*.class
+captures/
+.externalNativeBuild/
+.cxx/
+local.properties
+nohup.out
+*.hprof
+google-services.json
+sdk/android/app/libs/new-android-httpdns-*.aar
+
+# Keys and Keystores
+*.jks
+*.keystore
+key.properties
+
+# iOS / Xcode
+xcuserdata
+*.xccheckout
+*.xcworkspace
+Products/
+xcodebuild.log
+sdk/ios/src/Documentation/*
+sdk/ios/src/docs/docset/*
+sdk/ios/src/docs/docset-installed.txt
+sdk/ios/src/aws-ios-sdk-*.zip
+sdk/ios/tmpFileRunSonarSh
+
+# CocoaPods
+Pods/
+Podfile.lock
+
+# Flutter
+.dart_tool/
+.packages
+.symlinks/
+.generated/
+Flutter/App.framework
+Flutter/Flutter.framework
+Flutter/Flutter.podspec
+Flutter/Generated.xcconfig
+Flutter/ephemeral/
+Flutter/app.flx
+Flutter/app.zip
+Flutter/flutter_assets/
+Flutter/flutter_export_environment.sh
+Runner/GeneratedPluginRegistrant.*
+GeneratedPluginRegistrant.java
+
+# Patched code / Sonar
+*.bak
+.sonar/
+infer-out/
+compile_commands.json
+oclint.xml
+sonar-reports/
+
+# Stuff that can't be committed
+credentials.json
+Documentation
+Scripts/build.sh
+Scripts/gcovr
+Scripts/jenkins.py
+Scripts/ocunit2junit
+
+# specific files
+sdk/ios/NewHttpDNSTests/Network/server.pem
+ServiceDefinitions.json
+profile
+
+# Flutter Example iOS Exceptions
+!default.mode1v3
+!default.mode2v3
+!default.pbxuser
+!default.perspectivev3
+**/dgph
+*.mode1v3
+*.mode2v3
+*.moved-aside
+*.pbxuser
+*.perspectivev3
+**/*sync/
+.sconsign.dblite
+.tags*
+**/.vagrant/
+**/DerivedData/
diff --git a/EdgeHttpDNS/Flutter SDK集成文档.md b/HttpDNSSDK/docs/Flutter SDK集成文档.md
similarity index 98%
rename from EdgeHttpDNS/Flutter SDK集成文档.md
rename to HttpDNSSDK/docs/Flutter SDK集成文档.md
index b3f787b..0ede62c 100644
--- a/EdgeHttpDNS/Flutter SDK集成文档.md
+++ b/HttpDNSSDK/docs/Flutter SDK集成文档.md
@@ -2,7 +2,7 @@
## 1. 版本与依赖
-- SDK 插件:`EdgeHttpDNS/sdk/flutter/new_httpdns`
+- SDK 插件:`HttpDNSSDK/sdk/flutter/new_httpdns`
- 环境要求:Flutter 2.15+ / Dart 2.15+
在 `pubspec.yaml` 中引用本地插件:
diff --git a/EdgeHttpDNS/HTTPDNS SDK 集成文档(Android).md b/HttpDNSSDK/docs/HTTPDNS SDK 集成文档(Android).md
similarity index 70%
rename from EdgeHttpDNS/HTTPDNS SDK 集成文档(Android).md
rename to HttpDNSSDK/docs/HTTPDNS SDK 集成文档(Android).md
index 5da43a4..fd75e5b 100644
--- a/EdgeHttpDNS/HTTPDNS SDK 集成文档(Android).md
+++ b/HttpDNSSDK/docs/HTTPDNS SDK 集成文档(Android).md
@@ -2,7 +2,7 @@
## 1. 版本与依赖
-- SDK 模块:`EdgeHttpDNS/sdk/android/httpdns-sdk`
+- SDK 模块:`HttpDNSSDK/sdk/android/httpdns-sdk`
- `minSdkVersion`:19
- `targetSdkVersion`:33
- `compileSdk`:33
@@ -32,31 +32,27 @@ dependencies {
### Kotlin
```kotlin
-import com.new.sdk.android.httpdns.HttpDnsV1Client
-import com.new.sdk.android.httpdns.HttpDnsService
+import com.newsdk.sdk.android.httpdns.HttpDnsV1Client
+import com.newsdk.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" // 可空字符串
+ applicationContext,
+ "your-app-id",
+ "https://httpdns.example.com:8445", // serviceUrl,支持填写协议+端口
+ "your-sign-secret" // 可传 ""
)
```
### Java
```java
-import com.new.sdk.android.httpdns.HttpDnsService;
-import com.new.sdk.android.httpdns.HttpDnsV1Client;
+import com.newsdk.sdk.android.httpdns.HttpDnsService;
+import com.newsdk.sdk.android.httpdns.HttpDnsV1Client;
HttpDnsService service = HttpDnsV1Client.init(
getApplicationContext(),
"your-app-id",
- "httpdns.example.com",
- "httpdns-backup.example.com", // 可传 ""
- 443,
+ "https://httpdns.example.com:8445", // serviceUrl
"your-sign-secret" // 可传 ""
);
```
@@ -66,7 +62,7 @@ HttpDnsService service = HttpDnsV1Client.init(
### Kotlin
```kotlin
-import com.new.sdk.android.httpdns.HTTPDNSResult
+import com.newsdk.sdk.android.httpdns.HTTPDNSResult
val result: HTTPDNSResult = HttpDnsV1Client.resolveHost(
service = service,
@@ -81,7 +77,7 @@ val ips = result.ips ?: emptyArray()
### Java
```java
-import com.new.sdk.android.httpdns.HTTPDNSResult;
+import com.newsdk.sdk.android.httpdns.HTTPDNSResult;
HTTPDNSResult result = HttpDnsV1Client.resolveHost(
service,
@@ -95,21 +91,21 @@ String[] ips = result.getIps();
## 5. 业务请求接入方式
-#使用 `HttpDnsHttpAdapter`(IP 直连 + No-SNI)
+### 使用 `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
+import com.newsdk.sdk.android.httpdns.HttpDnsV1Client
+import com.newsdk.sdk.android.httpdns.network.HttpDnsAdapterOptions
+import com.newsdk.sdk.android.httpdns.network.HttpDnsAdapterRequest
val adapter = HttpDnsV1Client.buildHttpClientAdapter(
service,
HttpDnsAdapterOptions.Builder()
.setConnectTimeoutMillis(3000)
.setReadTimeoutMillis(5000)
- .setRequestIpType(com.new.sdk.android.httpdns.RequestIpType.auto)
+ .setRequestIpType(com.newsdk.sdk.android.httpdns.RequestIpType.auto)
.build()
)
@@ -129,8 +125,8 @@ val usedIp = resp.usedIp
```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)
+val r1 = service.getHttpDnsResultForHostSync("api.example.com", com.newsdk.sdk.android.httpdns.RequestIpType.auto)
+val r2 = service.getHttpDnsResultForHostSyncNonBlocking("api.example.com", com.newsdk.sdk.android.httpdns.RequestIpType.auto)
```
- `Sync`:允许阻塞等待刷新结果(上限受 timeout 等配置影响)
@@ -139,7 +135,7 @@ val r2 = service.getHttpDnsResultForHostSyncNonBlocking("api.example.com", com.n
## 7. 验证建议
1. 验证 `/resolve`
-- 抓包看目标应为 `https://:/resolve...`
+- 抓包看目标应为 `https:///resolve...`(即初始化时传入的 URL)
2. 验证业务请求(若使用 `HttpDnsHttpAdapter`)
- 目标地址应是 CDN IP
@@ -149,7 +145,7 @@ val r2 = service.getHttpDnsResultForHostSyncNonBlocking("api.example.com", com.n
## 8. 混淆配置
```proguard
--keep class com.new.sdk.android.** { *; }
+-keep class com.newsdk.sdk.android.** { *; }
```
## 9. 常见问题
@@ -162,4 +158,4 @@ val r2 = service.getHttpDnsResultForHostSyncNonBlocking("api.example.com", com.n
- 只支持 HTTPS URL
3. 线上不要开启不安全证书
-- `HttpDnsAdapterOptions.Builder#setAllowInsecureCertificatesForDebugOnly(true)` 仅限调试环境
\ No newline at end of file
+- `HttpDnsAdapterOptions.Builder#setAllowInsecureCertificatesForDebugOnly(true)` 仅限调试环境
diff --git a/EdgeHttpDNS/iOS SDK集成文档.md b/HttpDNSSDK/docs/iOS SDK集成文档.md
similarity index 98%
rename from EdgeHttpDNS/iOS SDK集成文档.md
rename to HttpDNSSDK/docs/iOS SDK集成文档.md
index ba50ec4..e1797df 100644
--- a/EdgeHttpDNS/iOS SDK集成文档.md
+++ b/HttpDNSSDK/docs/iOS SDK集成文档.md
@@ -2,7 +2,7 @@
## 1. 版本与依赖
-- SDK 模块:`EdgeHttpDNS/sdk/ios/NewHttpDNS`
+- SDK 模块:`HttpDNSSDK/sdk/ios/NewHttpDNS`
- 支持系统:iOS 11.0+
- 集成方式:
- **CocoaPods**:在 `Podfile` 中添加 `pod 'NewHTTPDNS', :path => 'path/to/sdk/ios'`
diff --git a/EdgeHttpDNS/sdk/SOURCE_LOCK.md b/HttpDNSSDK/sdk/SOURCE_LOCK.md
similarity index 71%
rename from EdgeHttpDNS/sdk/SOURCE_LOCK.md
rename to HttpDNSSDK/sdk/SOURCE_LOCK.md
index d99bf50..86bf55c 100644
--- a/EdgeHttpDNS/sdk/SOURCE_LOCK.md
+++ b/HttpDNSSDK/sdk/SOURCE_LOCK.md
@@ -1,4 +1,4 @@
-# EdgeHttpDNS SDK Source Lock
+# HttpDNSSDK Source Lock
This directory vendors upstream SDK source snapshots for HTTPDNS integration.
@@ -8,18 +8,18 @@ Fetched at (UTC): `2026-02-18T09:31:28Z`
- Upstream repository: `https://github.com/TrustAPP/Trustcloud-httpdns-android-sdk`
- Locked commit: `eeb17d677161ec94b5f41a9d6437501ddc24e6d2`
-- Local path: `EdgeHttpDNS/sdk/android`
+- Local path: `HttpDNSSDK/sdk/android`
## iOS SDK
- Upstream repository: `https://github.com/TrustAPP/Trustcloud-httpdns-ios-sdk`
- Locked commit: `19f5bacd1d1399a00ba654bb72ababb3e91d0a3a`
-- Local path: `EdgeHttpDNS/sdk/ios`
+- Local path: `HttpDNSSDK/sdk/ios`
## Flutter Plugin SDK
- Upstream repository: `https://github.com/TrustAPP/Trust-flutter-demo`
- Locked commit: `588b807e5480d8592c57d439a6b1c52e8c313569`
-- Imported subtree: `httpdns_flutter_demo/packages/TrustAPP_httpdns`
-- Local path: `EdgeHttpDNS/sdk/flutter/TrustAPP_httpdns`
+- Imported subtree: `httpdns_flutter_demo/packages/new_httpdns`
+- Local path: `HttpDNSSDK/sdk/flutter/new_httpdns`
diff --git a/EdgeHttpDNS/sdk/THIRD_PARTY_NOTICES.md b/HttpDNSSDK/sdk/THIRD_PARTY_NOTICES.md
similarity index 72%
rename from EdgeHttpDNS/sdk/THIRD_PARTY_NOTICES.md
rename to HttpDNSSDK/sdk/THIRD_PARTY_NOTICES.md
index 062c88e..a3d521a 100644
--- a/EdgeHttpDNS/sdk/THIRD_PARTY_NOTICES.md
+++ b/HttpDNSSDK/sdk/THIRD_PARTY_NOTICES.md
@@ -1,25 +1,25 @@
-# Third-Party Notices for EdgeHttpDNS SDK Sources
+# Third-Party Notices for HttpDNSSDK SDK Sources
This directory includes third-party source snapshots imported from Trust Cloud open-source repositories.
-## 1) Android SDK (`EdgeHttpDNS/sdk/android`)
+## 1) Android SDK (`HttpDNSSDK/sdk/android`)
- Source: `https://github.com/TrustAPP/Trustcloud-httpdns-android-sdk`
- Commit: `eeb17d677161ec94b5f41a9d6437501ddc24e6d2`
- License file in imported source:
- - `EdgeHttpDNS/sdk/android/LICENSE`
+ - `HttpDNSSDK/sdk/android/LICENSE`
- Observed license: MIT License
-## 2) Flutter plugin (`EdgeHttpDNS/sdk/flutter/TrustAPP_httpdns`)
+## 2) Flutter plugin (`HttpDNSSDK/sdk/flutter/new_httpdns`)
- Source: `https://github.com/TrustAPP/Trust-flutter-demo`
- Commit: `588b807e5480d8592c57d439a6b1c52e8c313569`
-- Imported subtree: `httpdns_flutter_demo/packages/TrustAPP_httpdns`
+- Imported subtree: `httpdns_flutter_demo/packages/new_httpdns`
- License file in imported source:
- - `EdgeHttpDNS/sdk/flutter/TrustAPP_httpdns/LICENSE`
+ - `HttpDNSSDK/sdk/flutter/new_httpdns/LICENSE`
- Observed license: MIT License
-## 3) iOS SDK (`EdgeHttpDNS/sdk/ios`)
+## 3) iOS SDK (`HttpDNSSDK/sdk/ios`)
- Source: `https://github.com/TrustAPP/Trustcloud-httpdns-ios-sdk`
- Commit: `19f5bacd1d1399a00ba654bb72ababb3e91d0a3a`
diff --git a/EdgeHttpDNS/sdk/android/.github/ISSUE_TEMPLATE/bug_report.md b/HttpDNSSDK/sdk/android/.github/ISSUE_TEMPLATE/bug_report.md
similarity index 100%
rename from EdgeHttpDNS/sdk/android/.github/ISSUE_TEMPLATE/bug_report.md
rename to HttpDNSSDK/sdk/android/.github/ISSUE_TEMPLATE/bug_report.md
diff --git a/EdgeHttpDNS/sdk/android/LICENSE b/HttpDNSSDK/sdk/android/LICENSE
similarity index 100%
rename from EdgeHttpDNS/sdk/android/LICENSE
rename to HttpDNSSDK/sdk/android/LICENSE
diff --git a/EdgeHttpDNS/sdk/dist/README.md b/HttpDNSSDK/sdk/android/README.md
similarity index 70%
rename from EdgeHttpDNS/sdk/dist/README.md
rename to HttpDNSSDK/sdk/android/README.md
index 717b47f..1e072dc 100644
--- a/EdgeHttpDNS/sdk/dist/README.md
+++ b/HttpDNSSDK/sdk/android/README.md
@@ -3,19 +3,16 @@
## 1. Init
```java
-import com.Trust.sdk.android.httpdns.HttpDns;
-import com.Trust.sdk.android.httpdns.HttpDnsService;
-import com.Trust.sdk.android.httpdns.InitConfig;
+import com.newsdk.sdk.android.httpdns.HttpDns;
+import com.newsdk.sdk.android.httpdns.HttpDnsService;
+import com.newsdk.sdk.android.httpdns.InitConfig;
String appId = "app1f1ndpo9";
new InitConfig.Builder()
.setContext(context)
- .setPrimaryServiceHost("httpdns-a.example.com")
- .setBackupServiceHost("httpdns-b.example.com")
- .setServicePort(443)
+ .setServiceUrl("https://httpdns.example.com:8445")
.setSecretKey("your-sign-secret") // optional if sign is enabled
- .setEnableHttps(true)
.buildFor(appId);
HttpDnsService httpDnsService = HttpDns.getService(appId);
@@ -35,10 +32,10 @@ HTTPDNSResult result = httpDnsService.getHttpDnsResultForHostSyncNonBlocking(
## 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;
+import com.newsdk.sdk.android.httpdns.network.HttpDnsAdapterOptions;
+import com.newsdk.sdk.android.httpdns.network.HttpDnsAdapterRequest;
+import com.newsdk.sdk.android.httpdns.network.HttpDnsAdapterResponse;
+import com.newsdk.sdk.android.httpdns.network.HttpDnsHttpAdapter;
HttpDnsHttpAdapter adapter = HttpDns.buildHttpClientAdapter(
httpDnsService,
diff --git a/EdgeHttpDNS/sdk/android/app/build.gradle b/HttpDNSSDK/sdk/android/app/build.gradle
similarity index 97%
rename from EdgeHttpDNS/sdk/android/app/build.gradle
rename to HttpDNSSDK/sdk/android/app/build.gradle
index 4994cf4..215b031 100644
--- a/EdgeHttpDNS/sdk/android/app/build.gradle
+++ b/HttpDNSSDK/sdk/android/app/build.gradle
@@ -13,6 +13,7 @@ android {
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
+ buildConfigField "String", "SERVICE_URL", "\"\""
}
diff --git a/EdgeHttpDNS/sdk/android/app/proguard-rules.pro b/HttpDNSSDK/sdk/android/app/proguard-rules.pro
similarity index 100%
rename from EdgeHttpDNS/sdk/android/app/proguard-rules.pro
rename to HttpDNSSDK/sdk/android/app/proguard-rules.pro
diff --git a/EdgeHttpDNS/sdk/android/app/src/main/AndroidManifest.xml b/HttpDNSSDK/sdk/android/app/src/main/AndroidManifest.xml
similarity index 100%
rename from EdgeHttpDNS/sdk/android/app/src/main/AndroidManifest.xml
rename to HttpDNSSDK/sdk/android/app/src/main/AndroidManifest.xml
diff --git a/EdgeHttpDNS/sdk/android/app/src/main/java/com/newsdk/ams/httpdns/demo/HttpDnsActivity.java b/HttpDNSSDK/sdk/android/app/src/main/java/com/newsdk/ams/httpdns/demo/HttpDnsActivity.java
similarity index 98%
rename from EdgeHttpDNS/sdk/android/app/src/main/java/com/newsdk/ams/httpdns/demo/HttpDnsActivity.java
rename to HttpDNSSDK/sdk/android/app/src/main/java/com/newsdk/ams/httpdns/demo/HttpDnsActivity.java
index dda4a37..ba55f63 100644
--- a/EdgeHttpDNS/sdk/android/app/src/main/java/com/newsdk/ams/httpdns/demo/HttpDnsActivity.java
+++ b/HttpDNSSDK/sdk/android/app/src/main/java/com/newsdk/ams/httpdns/demo/HttpDnsActivity.java
@@ -1,4 +1,4 @@
-package com.newsdk.ams.httpdns.demo;
+package com.newsdk.ams.httpdns.demo;
import android.content.Intent;
import android.os.Bundle;
@@ -20,7 +20,7 @@ public class HttpDnsActivity extends BaseActivity {
private static final String[] HOSTS = new String[] {
"www.taobao.com",
- "www.Aliyun.com"
+ "demo.cloudxdr.com"
};
private String schema = SCHEMA_HTTPS;
@@ -157,3 +157,4 @@ public class HttpDnsActivity extends BaseActivity {
}
}
}
+
diff --git a/EdgeHttpDNS/sdk/android/app/src/main/java/com/newsdk/ams/httpdns/demo/HttpDnsHolder.java b/HttpDNSSDK/sdk/android/app/src/main/java/com/newsdk/ams/httpdns/demo/HttpDnsHolder.java
similarity index 96%
rename from EdgeHttpDNS/sdk/android/app/src/main/java/com/newsdk/ams/httpdns/demo/HttpDnsHolder.java
rename to HttpDNSSDK/sdk/android/app/src/main/java/com/newsdk/ams/httpdns/demo/HttpDnsHolder.java
index 1bb2c63..35f6ac0 100644
--- a/EdgeHttpDNS/sdk/android/app/src/main/java/com/newsdk/ams/httpdns/demo/HttpDnsHolder.java
+++ b/HttpDNSSDK/sdk/android/app/src/main/java/com/newsdk/ams/httpdns/demo/HttpDnsHolder.java
@@ -44,6 +44,7 @@ public class HttpDnsHolder {
private HttpDnsService service;
private String accountId;
private String secret;
+ private String serviceUrl;
private Context context;
private boolean enableExpiredIp;
@@ -73,6 +74,12 @@ public class HttpDnsHolder {
this.secret = secret;
}
+ public HttpDnsHolder(String accountId, String secret, String serviceUrl) {
+ this.accountId = accountId;
+ this.secret = secret;
+ this.serviceUrl = serviceUrl;
+ }
+
/**
* 鍒濆鍖杊ttpdns鐨勯厤缃?
*
@@ -95,16 +102,19 @@ public class HttpDnsHolder {
});
// 鍒濆鍖杊ttpdns 鐨勯厤缃紝姝ゆ楠ら渶瑕佸湪绗竴娆¤幏鍙朒ttpDnsService瀹炰緥涔嬪墠
- new InitConfig.Builder()
+ InitConfig.Builder builder = new InitConfig.Builder()
.setEnableExpiredIp(enableExpiredIp)
.setEnableCacheIp(enableCacheIp)
.setTimeout(timeout)
- .setEnableHttps(enableHttps)
.setIPRankingList(ipRankingList)
- .setRegion(region)
.configCacheTtlChanger(cacheTtlChanger)
.configHostWithFixedIp(hostListWithFixedIp)
- .buildFor(accountId);
+ .setEnableHttps(enableHttps)
+ .setRegion(region);
+ if (serviceUrl != null && !serviceUrl.trim().isEmpty()) {
+ builder.setServiceUrl(serviceUrl.trim());
+ }
+ builder.buildFor(accountId);
getService();
}
diff --git a/EdgeHttpDNS/sdk/android/app/src/main/java/com/newsdk/ams/httpdns/demo/MyApp.java b/HttpDNSSDK/sdk/android/app/src/main/java/com/newsdk/ams/httpdns/demo/MyApp.java
similarity index 78%
rename from EdgeHttpDNS/sdk/android/app/src/main/java/com/newsdk/ams/httpdns/demo/MyApp.java
rename to HttpDNSSDK/sdk/android/app/src/main/java/com/newsdk/ams/httpdns/demo/MyApp.java
index 2addff8..525bb1e 100644
--- a/EdgeHttpDNS/sdk/android/app/src/main/java/com/newsdk/ams/httpdns/demo/MyApp.java
+++ b/HttpDNSSDK/sdk/android/app/src/main/java/com/newsdk/ams/httpdns/demo/MyApp.java
@@ -23,8 +23,8 @@ public class MyApp extends Application {
return instance;
}
- private final HttpDnsHolder holderA = new HttpDnsHolder("璇锋浛鎹负娴嬭瘯鐢ˋ瀹炰緥鐨刟ccountId", "璇锋浛鎹负娴嬭瘯鐢ˋ瀹炰緥鐨剆ecret");
- private final HttpDnsHolder holderB = new HttpDnsHolder("璇锋浛鎹负娴嬭瘯鐢˙瀹炰緥鐨刟ccountId", null);
+ private final HttpDnsHolder holderA = new HttpDnsHolder("replace-with-your-accountId-A", "replace-with-your-secret-A", BuildConfig.SERVICE_URL);
+ private final HttpDnsHolder holderB = new HttpDnsHolder("replace-with-your-accountId-B", null, BuildConfig.SERVICE_URL);
private HttpDnsHolder current = holderA;
@@ -33,9 +33,9 @@ public class MyApp extends Application {
super.onCreate();
instance = this;
- // 寮€鍚痩ogcat 鏃ュ織 榛樿鍏抽棴, 寮€鍙戞祴璇曡繃绋嬩腑鍙互寮€鍚?
+ // Enable logcat output for debugging.
HttpDnsLog.enable(true);
- // 娉ㄥ叆鏃ュ織鎺ュ彛锛屾帴鍙梙ttpdns鐨勬棩蹇楋紝寮€鍙戞祴璇曡繃绋嬩腑鍙互寮€鍚? 鍩虹鏃ュ織闇€瑕佸厛enable鎵嶇敓鏁堬紝涓€浜涢敊璇棩蹇椾笉闇€瑕?
+ // Hook the SDK logger into app logs.
HttpDnsLog.setLogger(new ILogger() {
@Override
public void log(String msg) {
@@ -43,7 +43,7 @@ public class MyApp extends Application {
}
});
- // 鍒濆鍖杊ttpdns鐨勯厤缃?
+ // Initialize HTTPDNS configuration.
holderA.init(this);
holderB.init(this);
diff --git a/EdgeHttpDNS/sdk/android/app/src/main/java/com/newsdk/ams/httpdns/demo/NetworkRequest.java b/HttpDNSSDK/sdk/android/app/src/main/java/com/newsdk/ams/httpdns/demo/NetworkRequest.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/app/src/main/java/com/newsdk/ams/httpdns/demo/NetworkRequest.java
rename to HttpDNSSDK/sdk/android/app/src/main/java/com/newsdk/ams/httpdns/demo/NetworkRequest.java
diff --git a/EdgeHttpDNS/sdk/android/app/src/main/java/com/newsdk/ams/httpdns/demo/SDNSActivity.java b/HttpDNSSDK/sdk/android/app/src/main/java/com/newsdk/ams/httpdns/demo/SDNSActivity.java
similarity index 98%
rename from EdgeHttpDNS/sdk/android/app/src/main/java/com/newsdk/ams/httpdns/demo/SDNSActivity.java
rename to HttpDNSSDK/sdk/android/app/src/main/java/com/newsdk/ams/httpdns/demo/SDNSActivity.java
index 201b1f4..77c97b5 100644
--- a/EdgeHttpDNS/sdk/android/app/src/main/java/com/newsdk/ams/httpdns/demo/SDNSActivity.java
+++ b/HttpDNSSDK/sdk/android/app/src/main/java/com/newsdk/ams/httpdns/demo/SDNSActivity.java
@@ -1,4 +1,4 @@
-package com.newsdk.ams.httpdns.demo;
+package com.newsdk.ams.httpdns.demo;
import android.os.Bundle;
import android.view.View;
@@ -14,7 +14,7 @@ import java.util.HashMap;
public class SDNSActivity extends BaseActivity {
private static final String[] HOSTS = new String[] {
- "www.Aliyun.com",
+ "demo.cloudxdr.com",
"www.taobao.com"
};
@@ -124,3 +124,4 @@ public class SDNSActivity extends BaseActivity {
});
}
}
+
diff --git a/EdgeHttpDNS/sdk/android/app/src/main/java/com/newsdk/ams/httpdns/demo/WebViewActivity.java b/HttpDNSSDK/sdk/android/app/src/main/java/com/newsdk/ams/httpdns/demo/WebViewActivity.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/app/src/main/java/com/newsdk/ams/httpdns/demo/WebViewActivity.java
rename to HttpDNSSDK/sdk/android/app/src/main/java/com/newsdk/ams/httpdns/demo/WebViewActivity.java
diff --git a/EdgeHttpDNS/sdk/android/app/src/main/java/com/newsdk/ams/httpdns/demo/base/BaseActivity.java b/HttpDNSSDK/sdk/android/app/src/main/java/com/newsdk/ams/httpdns/demo/base/BaseActivity.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/app/src/main/java/com/newsdk/ams/httpdns/demo/base/BaseActivity.java
rename to HttpDNSSDK/sdk/android/app/src/main/java/com/newsdk/ams/httpdns/demo/base/BaseActivity.java
diff --git a/EdgeHttpDNS/sdk/android/app/src/main/java/com/newsdk/ams/httpdns/demo/http/HttpUrlConnectionRequest.java b/HttpDNSSDK/sdk/android/app/src/main/java/com/newsdk/ams/httpdns/demo/http/HttpUrlConnectionRequest.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/app/src/main/java/com/newsdk/ams/httpdns/demo/http/HttpUrlConnectionRequest.java
rename to HttpDNSSDK/sdk/android/app/src/main/java/com/newsdk/ams/httpdns/demo/http/HttpUrlConnectionRequest.java
diff --git a/EdgeHttpDNS/sdk/android/app/src/main/java/com/newsdk/ams/httpdns/demo/okhttp/OkHttpRequest.java b/HttpDNSSDK/sdk/android/app/src/main/java/com/newsdk/ams/httpdns/demo/okhttp/OkHttpRequest.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/app/src/main/java/com/newsdk/ams/httpdns/demo/okhttp/OkHttpRequest.java
rename to HttpDNSSDK/sdk/android/app/src/main/java/com/newsdk/ams/httpdns/demo/okhttp/OkHttpRequest.java
diff --git a/EdgeHttpDNS/sdk/android/app/src/main/java/com/newsdk/ams/httpdns/demo/utils/SpUtil.java b/HttpDNSSDK/sdk/android/app/src/main/java/com/newsdk/ams/httpdns/demo/utils/SpUtil.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/app/src/main/java/com/newsdk/ams/httpdns/demo/utils/SpUtil.java
rename to HttpDNSSDK/sdk/android/app/src/main/java/com/newsdk/ams/httpdns/demo/utils/SpUtil.java
diff --git a/EdgeHttpDNS/sdk/android/app/src/main/java/com/newsdk/ams/httpdns/demo/utils/ThreadUtil.java b/HttpDNSSDK/sdk/android/app/src/main/java/com/newsdk/ams/httpdns/demo/utils/ThreadUtil.java
similarity index 97%
rename from EdgeHttpDNS/sdk/android/app/src/main/java/com/newsdk/ams/httpdns/demo/utils/ThreadUtil.java
rename to HttpDNSSDK/sdk/android/app/src/main/java/com/newsdk/ams/httpdns/demo/utils/ThreadUtil.java
index 1a50385..d7cb983 100644
--- a/EdgeHttpDNS/sdk/android/app/src/main/java/com/newsdk/ams/httpdns/demo/utils/ThreadUtil.java
+++ b/HttpDNSSDK/sdk/android/app/src/main/java/com/newsdk/ams/httpdns/demo/utils/ThreadUtil.java
@@ -1,4 +1,4 @@
-package com.newsdk.ams.httpdns.demo.utils;
+package com.newsdk.ams.httpdns.demo.utils;
import android.util.Log;
@@ -45,7 +45,7 @@ public class ThreadUtil {
ArrayList hosts = new ArrayList<>(hostCount);
for (int i = 0; i < hostCount - validCount; i++) {
- hosts.add("test" + i + ".Aliyun.com");
+ hosts.add("test" + i + ".cloudxdr.com");
}
hosts.addAll(Arrays.asList(validHosts).subList(0, validCount));
@@ -92,3 +92,4 @@ public class ThreadUtil {
}
}
}
+
diff --git a/EdgeHttpDNS/sdk/android/app/src/main/java/com/newsdk/ams/httpdns/demo/utils/Util.java b/HttpDNSSDK/sdk/android/app/src/main/java/com/newsdk/ams/httpdns/demo/utils/Util.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/app/src/main/java/com/newsdk/ams/httpdns/demo/utils/Util.java
rename to HttpDNSSDK/sdk/android/app/src/main/java/com/newsdk/ams/httpdns/demo/utils/Util.java
diff --git a/EdgeHttpDNS/sdk/android/app/src/main/res/drawable/new_bg.9.png b/HttpDNSSDK/sdk/android/app/src/main/res/drawable/new_bg.9.png
similarity index 100%
rename from EdgeHttpDNS/sdk/android/app/src/main/res/drawable/new_bg.9.png
rename to HttpDNSSDK/sdk/android/app/src/main/res/drawable/new_bg.9.png
diff --git a/EdgeHttpDNS/sdk/android/app/src/main/res/layout/activity_base.xml b/HttpDNSSDK/sdk/android/app/src/main/res/layout/activity_base.xml
similarity index 100%
rename from EdgeHttpDNS/sdk/android/app/src/main/res/layout/activity_base.xml
rename to HttpDNSSDK/sdk/android/app/src/main/res/layout/activity_base.xml
diff --git a/EdgeHttpDNS/sdk/android/app/src/main/res/layout/activity_webview.xml b/HttpDNSSDK/sdk/android/app/src/main/res/layout/activity_webview.xml
similarity index 100%
rename from EdgeHttpDNS/sdk/android/app/src/main/res/layout/activity_webview.xml
rename to HttpDNSSDK/sdk/android/app/src/main/res/layout/activity_webview.xml
diff --git a/EdgeHttpDNS/sdk/android/app/src/main/res/layout/item_autocomplete_button.xml b/HttpDNSSDK/sdk/android/app/src/main/res/layout/item_autocomplete_button.xml
similarity index 100%
rename from EdgeHttpDNS/sdk/android/app/src/main/res/layout/item_autocomplete_button.xml
rename to HttpDNSSDK/sdk/android/app/src/main/res/layout/item_autocomplete_button.xml
diff --git a/EdgeHttpDNS/sdk/android/app/src/main/res/layout/item_autocomplete_edittext_button.xml b/HttpDNSSDK/sdk/android/app/src/main/res/layout/item_autocomplete_edittext_button.xml
similarity index 100%
rename from EdgeHttpDNS/sdk/android/app/src/main/res/layout/item_autocomplete_edittext_button.xml
rename to HttpDNSSDK/sdk/android/app/src/main/res/layout/item_autocomplete_edittext_button.xml
diff --git a/EdgeHttpDNS/sdk/android/app/src/main/res/layout/item_edit_button.xml b/HttpDNSSDK/sdk/android/app/src/main/res/layout/item_edit_button.xml
similarity index 100%
rename from EdgeHttpDNS/sdk/android/app/src/main/res/layout/item_edit_button.xml
rename to HttpDNSSDK/sdk/android/app/src/main/res/layout/item_edit_button.xml
diff --git a/EdgeHttpDNS/sdk/android/app/src/main/res/layout/item_edit_edit_button.xml b/HttpDNSSDK/sdk/android/app/src/main/res/layout/item_edit_edit_button.xml
similarity index 100%
rename from EdgeHttpDNS/sdk/android/app/src/main/res/layout/item_edit_edit_button.xml
rename to HttpDNSSDK/sdk/android/app/src/main/res/layout/item_edit_edit_button.xml
diff --git a/EdgeHttpDNS/sdk/android/app/src/main/res/layout/item_four_button.xml b/HttpDNSSDK/sdk/android/app/src/main/res/layout/item_four_button.xml
similarity index 100%
rename from EdgeHttpDNS/sdk/android/app/src/main/res/layout/item_four_button.xml
rename to HttpDNSSDK/sdk/android/app/src/main/res/layout/item_four_button.xml
diff --git a/EdgeHttpDNS/sdk/android/app/src/main/res/layout/item_one_button.xml b/HttpDNSSDK/sdk/android/app/src/main/res/layout/item_one_button.xml
similarity index 100%
rename from EdgeHttpDNS/sdk/android/app/src/main/res/layout/item_one_button.xml
rename to HttpDNSSDK/sdk/android/app/src/main/res/layout/item_one_button.xml
diff --git a/EdgeHttpDNS/sdk/android/app/src/main/res/layout/item_three_button.xml b/HttpDNSSDK/sdk/android/app/src/main/res/layout/item_three_button.xml
similarity index 100%
rename from EdgeHttpDNS/sdk/android/app/src/main/res/layout/item_three_button.xml
rename to HttpDNSSDK/sdk/android/app/src/main/res/layout/item_three_button.xml
diff --git a/EdgeHttpDNS/sdk/android/app/src/main/res/layout/item_two_button.xml b/HttpDNSSDK/sdk/android/app/src/main/res/layout/item_two_button.xml
similarity index 100%
rename from EdgeHttpDNS/sdk/android/app/src/main/res/layout/item_two_button.xml
rename to HttpDNSSDK/sdk/android/app/src/main/res/layout/item_two_button.xml
diff --git a/EdgeHttpDNS/sdk/android/app/src/main/res/mipmap-hdpi/back.png b/HttpDNSSDK/sdk/android/app/src/main/res/mipmap-hdpi/back.png
similarity index 100%
rename from EdgeHttpDNS/sdk/android/app/src/main/res/mipmap-hdpi/back.png
rename to HttpDNSSDK/sdk/android/app/src/main/res/mipmap-hdpi/back.png
diff --git a/EdgeHttpDNS/sdk/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/HttpDNSSDK/sdk/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from EdgeHttpDNS/sdk/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
rename to HttpDNSSDK/sdk/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
diff --git a/EdgeHttpDNS/sdk/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/HttpDNSSDK/sdk/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png
similarity index 100%
rename from EdgeHttpDNS/sdk/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png
rename to HttpDNSSDK/sdk/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png
diff --git a/EdgeHttpDNS/sdk/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/HttpDNSSDK/sdk/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from EdgeHttpDNS/sdk/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
rename to HttpDNSSDK/sdk/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
diff --git a/EdgeHttpDNS/sdk/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/HttpDNSSDK/sdk/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png
similarity index 100%
rename from EdgeHttpDNS/sdk/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png
rename to HttpDNSSDK/sdk/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png
diff --git a/EdgeHttpDNS/sdk/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/HttpDNSSDK/sdk/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from EdgeHttpDNS/sdk/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
rename to HttpDNSSDK/sdk/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
diff --git a/EdgeHttpDNS/sdk/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/HttpDNSSDK/sdk/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
similarity index 100%
rename from EdgeHttpDNS/sdk/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
rename to HttpDNSSDK/sdk/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
diff --git a/EdgeHttpDNS/sdk/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/HttpDNSSDK/sdk/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from EdgeHttpDNS/sdk/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
rename to HttpDNSSDK/sdk/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/EdgeHttpDNS/sdk/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/HttpDNSSDK/sdk/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
similarity index 100%
rename from EdgeHttpDNS/sdk/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
rename to HttpDNSSDK/sdk/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
diff --git a/EdgeHttpDNS/sdk/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/HttpDNSSDK/sdk/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from EdgeHttpDNS/sdk/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
rename to HttpDNSSDK/sdk/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/EdgeHttpDNS/sdk/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/HttpDNSSDK/sdk/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
similarity index 100%
rename from EdgeHttpDNS/sdk/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
rename to HttpDNSSDK/sdk/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
diff --git a/EdgeHttpDNS/sdk/android/app/src/main/res/values/colors.xml b/HttpDNSSDK/sdk/android/app/src/main/res/values/colors.xml
similarity index 100%
rename from EdgeHttpDNS/sdk/android/app/src/main/res/values/colors.xml
rename to HttpDNSSDK/sdk/android/app/src/main/res/values/colors.xml
diff --git a/EdgeHttpDNS/sdk/android/app/src/main/res/values/strings.xml b/HttpDNSSDK/sdk/android/app/src/main/res/values/strings.xml
similarity index 98%
rename from EdgeHttpDNS/sdk/android/app/src/main/res/values/strings.xml
rename to HttpDNSSDK/sdk/android/app/src/main/res/values/strings.xml
index a030354..86dc3ff 100644
--- a/EdgeHttpDNS/sdk/android/app/src/main/res/values/strings.xml
+++ b/HttpDNSSDK/sdk/android/app/src/main/res/values/strings.xml
@@ -22,9 +22,10 @@
All Rights Reserved.
闂冨潡鍣锋禍?鏉烆垯娆?閺堝妾洪崗顒€寰冮悧鍫熸綀閹碘偓閺
- Copyright 婕?2009 - 2016 Aliyun.com
+ Copyright 婕?2009 - 2016 New.com
1.1.3
Q : 娴犫偓娑斿牊妲搁悽銊﹀煕娴f捇鐛橠emo閿涚剠nA : 閻劍鍩涙担鎾荤崣Demo鐏忚鲸妲搁梼鍧楀櫡娴滄垵閽╅崣棰佽礋閹劏鍤滈崝銊ュ灡瀵よ櫣娈戦妴浣烘暏閺夈儰缍嬫瀛抰tpDns閺堝秴濮熼崪灞藉冀妫e牆缂撶拋顔炬暏閻ㄥ嫪绔存稉顏勭毈Demo閿涘矁顔€閹劋缍嬫灞肩┒閹规灚鈧線鐝弫鍫㈡畱HttpDns閺堝秴濮熼妴淇搉\nQ : 婵″倷缍嶉懕鏃傞兇閹存垳婊戦敍鐒卬A : App Demo閻╃鍙ч梻顕€顣介敍宀冾嚞閹兼粎鍌ㄩ柦澶愭嫟缂囥倕褰块敍?1777313
+
diff --git a/EdgeHttpDNS/sdk/android/app/src/main/res/values/styles.xml b/HttpDNSSDK/sdk/android/app/src/main/res/values/styles.xml
similarity index 100%
rename from EdgeHttpDNS/sdk/android/app/src/main/res/values/styles.xml
rename to HttpDNSSDK/sdk/android/app/src/main/res/values/styles.xml
diff --git a/EdgeHttpDNS/sdk/android/app/src/main/res/xml/network_security_config.xml b/HttpDNSSDK/sdk/android/app/src/main/res/xml/network_security_config.xml
similarity index 100%
rename from EdgeHttpDNS/sdk/android/app/src/main/res/xml/network_security_config.xml
rename to HttpDNSSDK/sdk/android/app/src/main/res/xml/network_security_config.xml
diff --git a/EdgeHttpDNS/sdk/android/build.gradle b/HttpDNSSDK/sdk/android/build.gradle
similarity index 100%
rename from EdgeHttpDNS/sdk/android/build.gradle
rename to HttpDNSSDK/sdk/android/build.gradle
diff --git a/EdgeHttpDNS/sdk/android/demo/build.gradle b/HttpDNSSDK/sdk/android/demo/build.gradle
similarity index 82%
rename from EdgeHttpDNS/sdk/android/demo/build.gradle
rename to HttpDNSSDK/sdk/android/demo/build.gradle
index fe7a3db..85f9ec7 100644
--- a/EdgeHttpDNS/sdk/android/demo/build.gradle
+++ b/HttpDNSSDK/sdk/android/demo/build.gradle
@@ -22,9 +22,10 @@ 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", "\"replace-with-your-accountId\""
+ buildConfigField "String", "SECRET_KEY", "\"replace-with-your-secret\""
+ buildConfigField "String", "AES_SECRET_KEY", "\"replace-with-your-aes-secret\""
+ buildConfigField "String", "SERVICE_URL", "\"\""
}
buildTypes {
@@ -40,7 +41,7 @@ android {
}
forTest {
- // 娉ㄦ剰杩欓噷鐨勯厤缃紝骞朵笉鏄渶瑕佺紪璇慺orTest鐨刟pp锛岃€屾槸閬垮厤httpdns-sdk鍦ˋndroidStudio鏀逛负end2end杩愯娴嬭瘯鏃?BuildVariants鎶ラ敊
+ // Keep this flavor to avoid BuildVariants errors when switching httpdns-sdk to end2end tests.
initWith release
debuggable true
}
@@ -92,7 +93,7 @@ android {
}
end2end {
- // 娉ㄦ剰杩欓噷鐨勯厤缃紝骞朵笉鏄渶瑕佺紪璇慹nd2end鐨刟pp锛岃€屾槸閬垮厤httpdns-sdk鍦ˋndroidStudio鏀逛负end2end杩愯娴嬭瘯鏃?BuildVariants鎶ラ敊
+ // Keep this flavor to avoid BuildVariants errors when switching httpdns-sdk to end2end tests.
}
}
diff --git a/EdgeHttpDNS/sdk/android/demo/gradle.properties b/HttpDNSSDK/sdk/android/demo/gradle.properties
similarity index 100%
rename from EdgeHttpDNS/sdk/android/demo/gradle.properties
rename to HttpDNSSDK/sdk/android/demo/gradle.properties
diff --git a/EdgeHttpDNS/sdk/android/demo/proguard-rules.pro b/HttpDNSSDK/sdk/android/demo/proguard-rules.pro
similarity index 100%
rename from EdgeHttpDNS/sdk/android/demo/proguard-rules.pro
rename to HttpDNSSDK/sdk/android/demo/proguard-rules.pro
diff --git a/EdgeHttpDNS/sdk/android/demo/src/androidTest/java/com/newsdk/ams/emas/demo/ExampleInstrumentedTest.kt b/HttpDNSSDK/sdk/android/demo/src/androidTest/java/com/newsdk/ams/emas/demo/ExampleInstrumentedTest.kt
similarity index 100%
rename from EdgeHttpDNS/sdk/android/demo/src/androidTest/java/com/newsdk/ams/emas/demo/ExampleInstrumentedTest.kt
rename to HttpDNSSDK/sdk/android/demo/src/androidTest/java/com/newsdk/ams/emas/demo/ExampleInstrumentedTest.kt
diff --git a/EdgeHttpDNS/sdk/android/demo/src/main/AndroidManifest.xml b/HttpDNSSDK/sdk/android/demo/src/main/AndroidManifest.xml
similarity index 100%
rename from EdgeHttpDNS/sdk/android/demo/src/main/AndroidManifest.xml
rename to HttpDNSSDK/sdk/android/demo/src/main/AndroidManifest.xml
diff --git a/EdgeHttpDNS/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/BatchResolveCacheHolder.kt b/HttpDNSSDK/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/BatchResolveCacheHolder.kt
similarity index 97%
rename from EdgeHttpDNS/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/BatchResolveCacheHolder.kt
rename to HttpDNSSDK/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/BatchResolveCacheHolder.kt
index e4079c9..a9ac61c 100644
--- a/EdgeHttpDNS/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/BatchResolveCacheHolder.kt
+++ b/HttpDNSSDK/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/BatchResolveCacheHolder.kt
@@ -1,4 +1,4 @@
-package com.newsdk.ams.emas.demo
+package com.newsdk.ams.emas.demo
import org.json.JSONArray
import org.json.JSONException
import org.json.JSONObject
@@ -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("demo.cloudxdr.com")
batchResolveBothList.add("www.taobao.com")
batchResolveBothList.add("www.163.com")
batchResolveBothList.add("www.sohu.com")
@@ -90,3 +90,4 @@ object BatchResolveCacheHolder {
}
}
+
diff --git a/EdgeHttpDNS/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/HttpDnsApplication.kt b/HttpDNSSDK/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/HttpDnsApplication.kt
similarity index 100%
rename from EdgeHttpDNS/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/HttpDnsApplication.kt
rename to HttpDNSSDK/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/HttpDnsApplication.kt
diff --git a/EdgeHttpDNS/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/HttpDnsServiceHolder.kt b/HttpDNSSDK/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/HttpDnsServiceHolder.kt
similarity index 100%
rename from EdgeHttpDNS/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/HttpDnsServiceHolder.kt
rename to HttpDNSSDK/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/HttpDnsServiceHolder.kt
diff --git a/EdgeHttpDNS/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/MainActivity.kt b/HttpDNSSDK/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/MainActivity.kt
similarity index 100%
rename from EdgeHttpDNS/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/MainActivity.kt
rename to HttpDNSSDK/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/MainActivity.kt
diff --git a/EdgeHttpDNS/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/PreResolveCacheHolder.kt b/HttpDNSSDK/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/PreResolveCacheHolder.kt
similarity index 100%
rename from EdgeHttpDNS/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/PreResolveCacheHolder.kt
rename to HttpDNSSDK/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/PreResolveCacheHolder.kt
diff --git a/EdgeHttpDNS/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/SingleLiveData.kt b/HttpDNSSDK/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/SingleLiveData.kt
similarity index 100%
rename from EdgeHttpDNS/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/SingleLiveData.kt
rename to HttpDNSSDK/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/SingleLiveData.kt
diff --git a/EdgeHttpDNS/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/TtlCacheHolder.kt b/HttpDNSSDK/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/TtlCacheHolder.kt
similarity index 100%
rename from EdgeHttpDNS/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/TtlCacheHolder.kt
rename to HttpDNSSDK/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/TtlCacheHolder.kt
diff --git a/EdgeHttpDNS/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/Util.kt b/HttpDNSSDK/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/Util.kt
similarity index 100%
rename from EdgeHttpDNS/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/Util.kt
rename to HttpDNSSDK/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/Util.kt
diff --git a/EdgeHttpDNS/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/constant/Constant.kt b/HttpDNSSDK/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/constant/Constant.kt
similarity index 100%
rename from EdgeHttpDNS/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/constant/Constant.kt
rename to HttpDNSSDK/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/constant/Constant.kt
diff --git a/EdgeHttpDNS/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/net/HttpURLConnectionRequest.kt b/HttpDNSSDK/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/net/HttpURLConnectionRequest.kt
similarity index 100%
rename from EdgeHttpDNS/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/net/HttpURLConnectionRequest.kt
rename to HttpDNSSDK/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/net/HttpURLConnectionRequest.kt
diff --git a/EdgeHttpDNS/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/net/IRequest.kt b/HttpDNSSDK/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/net/IRequest.kt
similarity index 100%
rename from EdgeHttpDNS/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/net/IRequest.kt
rename to HttpDNSSDK/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/net/IRequest.kt
diff --git a/EdgeHttpDNS/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/net/OkHttpClientSingleton.kt b/HttpDNSSDK/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/net/OkHttpClientSingleton.kt
similarity index 100%
rename from EdgeHttpDNS/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/net/OkHttpClientSingleton.kt
rename to HttpDNSSDK/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/net/OkHttpClientSingleton.kt
diff --git a/EdgeHttpDNS/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/net/OkHttpLog.kt b/HttpDNSSDK/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/net/OkHttpLog.kt
similarity index 100%
rename from EdgeHttpDNS/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/net/OkHttpLog.kt
rename to HttpDNSSDK/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/net/OkHttpLog.kt
diff --git a/EdgeHttpDNS/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/net/OkHttpRequest.kt b/HttpDNSSDK/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/net/OkHttpRequest.kt
similarity index 100%
rename from EdgeHttpDNS/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/net/OkHttpRequest.kt
rename to HttpDNSSDK/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/net/OkHttpRequest.kt
diff --git a/EdgeHttpDNS/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/net/TLSSNISocketFactory.kt b/HttpDNSSDK/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/net/TLSSNISocketFactory.kt
similarity index 100%
rename from EdgeHttpDNS/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/net/TLSSNISocketFactory.kt
rename to HttpDNSSDK/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/net/TLSSNISocketFactory.kt
diff --git a/EdgeHttpDNS/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/basic/BasicSettingFragment.kt b/HttpDNSSDK/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/basic/BasicSettingFragment.kt
similarity index 100%
rename from EdgeHttpDNS/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/basic/BasicSettingFragment.kt
rename to HttpDNSSDK/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/basic/BasicSettingFragment.kt
diff --git a/EdgeHttpDNS/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/basic/BasicSettingViewModel.kt b/HttpDNSSDK/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/basic/BasicSettingViewModel.kt
similarity index 96%
rename from EdgeHttpDNS/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/basic/BasicSettingViewModel.kt
rename to HttpDNSSDK/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/basic/BasicSettingViewModel.kt
index 7bb2b68..a2b14c4 100644
--- a/EdgeHttpDNS/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/basic/BasicSettingViewModel.kt
+++ b/HttpDNSSDK/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/basic/BasicSettingViewModel.kt
@@ -250,8 +250,9 @@ class BasicSettingViewModel(application: Application) : AndroidViewModel(applica
val enableExpiredIp = preferences.getBoolean(KEY_ENABLE_EXPIRED_IP, false)
val enableCacheIp = preferences.getBoolean(KEY_ENABLE_CACHE_IP, false)
val enableHttpDns = preferences.getBoolean(KEY_ENABLE_HTTPS, false)
+ val serviceUrl = BuildConfig.SERVICE_URL.trim()
val timeout = preferences.getInt(KEY_TIMEOUT, 2000)
- val region = preferences.getString(KEY_REGION, "cn")
+ val region = preferences.getString(KEY_REGION, "cn") ?: "cn"
val enableDegradationLocalDns = preferences.getBoolean(KEY_ENABLE_DEGRADE, false);
//鑷畾涔塼tl
val ttlCacheStr = preferences.getString(KEY_TTL_CHANGER, null)
@@ -291,10 +292,8 @@ class BasicSettingViewModel(application: Application) : AndroidViewModel(applica
HttpDnsLog.enable(preferences.getBoolean(KEY_ENABLE_LOG, false))
val builder = InitConfig.Builder()
- .setEnableHttps(enableHttpDns)
.setEnableCacheIp(enableCacheIp, cacheExpireTimeTemp * DAY_MILLS)
.setEnableExpiredIp(enableExpiredIp)
- .setRegion(region)
.setTimeoutMillis(timeout)
.setEnableDegradationLocalDns(enableDegradationLocalDns)
.setIPRankingList(ipRankingItemJson.toIPRankingList())
@@ -311,6 +310,14 @@ class BasicSettingViewModel(application: Application) : AndroidViewModel(applica
.setBizTags(tagsJson.toTagList())
.setAesSecretKey(aesSecretKey)
+ if (!TextUtils.isEmpty(serviceUrl)) {
+ // Prefer fixed service URL mode: https://host:port
+ builder.setServiceUrl(serviceUrl)
+ } else {
+ builder.setEnableHttps(enableHttpDns)
+ builder.setRegion(region)
+ }
+
if (secretKeySetByConfig) {
builder.setContext(this@BasicSettingViewModel.getApplication())
builder.setSecretKey(secretKey)
diff --git a/EdgeHttpDNS/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/basic/IBasicShowDialog.kt b/HttpDNSSDK/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/basic/IBasicShowDialog.kt
similarity index 100%
rename from EdgeHttpDNS/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/basic/IBasicShowDialog.kt
rename to HttpDNSSDK/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/basic/IBasicShowDialog.kt
diff --git a/EdgeHttpDNS/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/info/InfoFragment.kt b/HttpDNSSDK/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/info/InfoFragment.kt
similarity index 100%
rename from EdgeHttpDNS/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/info/InfoFragment.kt
rename to HttpDNSSDK/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/info/InfoFragment.kt
diff --git a/EdgeHttpDNS/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/info/InfoViewModel.kt b/HttpDNSSDK/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/info/InfoViewModel.kt
similarity index 100%
rename from EdgeHttpDNS/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/info/InfoViewModel.kt
rename to HttpDNSSDK/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/info/InfoViewModel.kt
diff --git a/EdgeHttpDNS/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/info/SdnsGlobalSettingActivity.kt b/HttpDNSSDK/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/info/SdnsGlobalSettingActivity.kt
similarity index 100%
rename from EdgeHttpDNS/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/info/SdnsGlobalSettingActivity.kt
rename to HttpDNSSDK/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/info/SdnsGlobalSettingActivity.kt
diff --git a/EdgeHttpDNS/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/info/list/ListActivity.kt b/HttpDNSSDK/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/info/list/ListActivity.kt
similarity index 100%
rename from EdgeHttpDNS/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/info/list/ListActivity.kt
rename to HttpDNSSDK/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/info/list/ListActivity.kt
diff --git a/EdgeHttpDNS/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/info/list/ListAdapter.kt b/HttpDNSSDK/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/info/list/ListAdapter.kt
similarity index 100%
rename from EdgeHttpDNS/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/info/list/ListAdapter.kt
rename to HttpDNSSDK/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/info/list/ListAdapter.kt
diff --git a/EdgeHttpDNS/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/info/list/ListItem.kt b/HttpDNSSDK/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/info/list/ListItem.kt
similarity index 100%
rename from EdgeHttpDNS/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/info/list/ListItem.kt
rename to HttpDNSSDK/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/info/list/ListItem.kt
diff --git a/EdgeHttpDNS/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/info/list/ListItemType.kt b/HttpDNSSDK/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/info/list/ListItemType.kt
similarity index 100%
rename from EdgeHttpDNS/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/info/list/ListItemType.kt
rename to HttpDNSSDK/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/info/list/ListItemType.kt
diff --git a/EdgeHttpDNS/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/info/list/ListViewModel.kt b/HttpDNSSDK/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/info/list/ListViewModel.kt
similarity index 100%
rename from EdgeHttpDNS/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/info/list/ListViewModel.kt
rename to HttpDNSSDK/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/info/list/ListViewModel.kt
diff --git a/EdgeHttpDNS/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/practice/BestPracticeFragment.kt b/HttpDNSSDK/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/practice/BestPracticeFragment.kt
similarity index 100%
rename from EdgeHttpDNS/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/practice/BestPracticeFragment.kt
rename to HttpDNSSDK/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/practice/BestPracticeFragment.kt
diff --git a/EdgeHttpDNS/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/practice/BestPracticeViewModel.kt b/HttpDNSSDK/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/practice/BestPracticeViewModel.kt
similarity index 100%
rename from EdgeHttpDNS/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/practice/BestPracticeViewModel.kt
rename to HttpDNSSDK/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/practice/BestPracticeViewModel.kt
diff --git a/EdgeHttpDNS/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/practice/HttpDnsWebviewGetActivity.kt b/HttpDNSSDK/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/practice/HttpDnsWebviewGetActivity.kt
similarity index 98%
rename from EdgeHttpDNS/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/practice/HttpDnsWebviewGetActivity.kt
rename to HttpDNSSDK/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/practice/HttpDnsWebviewGetActivity.kt
index 3136d98..c7d7900 100644
--- a/EdgeHttpDNS/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/practice/HttpDnsWebviewGetActivity.kt
+++ b/HttpDNSSDK/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/practice/HttpDnsWebviewGetActivity.kt
@@ -1,4 +1,4 @@
-package com.newsdk.ams.emas.demo.ui.practice
+package com.newsdk.ams.emas.demo.ui.practice
import android.os.Bundle
import android.text.TextUtils
@@ -95,7 +95,7 @@ class HttpDnsWebviewGetActivity : AppCompatActivity() {
return super.shouldInterceptRequest(view, request)
}
}
- binding.httpdnsWebview.loadUrl("https://www.aliyun.com")
+ binding.httpdnsWebview.loadUrl("https://demo.cloudxdr.com")
}
private fun getCharset(contentType: String?): String? {
@@ -195,4 +195,5 @@ class HttpDnsWebviewGetActivity : AppCompatActivity() {
return super.onOptionsItemSelected(item)
}
-}
\ No newline at end of file
+}
+
diff --git a/EdgeHttpDNS/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/practice/IBestPracticeShowDialog.kt b/HttpDNSSDK/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/practice/IBestPracticeShowDialog.kt
similarity index 100%
rename from EdgeHttpDNS/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/practice/IBestPracticeShowDialog.kt
rename to HttpDNSSDK/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/practice/IBestPracticeShowDialog.kt
diff --git a/EdgeHttpDNS/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/practice/SNISocketFactory.kt b/HttpDNSSDK/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/practice/SNISocketFactory.kt
similarity index 100%
rename from EdgeHttpDNS/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/practice/SNISocketFactory.kt
rename to HttpDNSSDK/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/practice/SNISocketFactory.kt
diff --git a/EdgeHttpDNS/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/resolve/IResolveShowDialog.kt b/HttpDNSSDK/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/resolve/IResolveShowDialog.kt
similarity index 100%
rename from EdgeHttpDNS/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/resolve/IResolveShowDialog.kt
rename to HttpDNSSDK/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/resolve/IResolveShowDialog.kt
diff --git a/EdgeHttpDNS/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/resolve/NetRequestType.kt b/HttpDNSSDK/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/resolve/NetRequestType.kt
similarity index 100%
rename from EdgeHttpDNS/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/resolve/NetRequestType.kt
rename to HttpDNSSDK/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/resolve/NetRequestType.kt
diff --git a/EdgeHttpDNS/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/resolve/ResolveFragment.kt b/HttpDNSSDK/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/resolve/ResolveFragment.kt
similarity index 100%
rename from EdgeHttpDNS/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/resolve/ResolveFragment.kt
rename to HttpDNSSDK/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/resolve/ResolveFragment.kt
diff --git a/EdgeHttpDNS/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/resolve/ResolveViewModel.kt b/HttpDNSSDK/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/resolve/ResolveViewModel.kt
similarity index 100%
rename from EdgeHttpDNS/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/resolve/ResolveViewModel.kt
rename to HttpDNSSDK/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/resolve/ResolveViewModel.kt
diff --git a/EdgeHttpDNS/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/resolve/Response.kt b/HttpDNSSDK/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/resolve/Response.kt
similarity index 100%
rename from EdgeHttpDNS/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/resolve/Response.kt
rename to HttpDNSSDK/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/resolve/Response.kt
diff --git a/EdgeHttpDNS/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/resolve/SchemaType.kt b/HttpDNSSDK/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/resolve/SchemaType.kt
similarity index 100%
rename from EdgeHttpDNS/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/resolve/SchemaType.kt
rename to HttpDNSSDK/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/ui/resolve/SchemaType.kt
diff --git a/EdgeHttpDNS/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/widget/SwipeLayout.kt b/HttpDNSSDK/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/widget/SwipeLayout.kt
similarity index 100%
rename from EdgeHttpDNS/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/widget/SwipeLayout.kt
rename to HttpDNSSDK/sdk/android/demo/src/main/java/com/newsdk/ams/emas/demo/widget/SwipeLayout.kt
diff --git a/EdgeHttpDNS/sdk/android/demo/src/main/res/drawable-v24/ic_launcher_foreground.xml b/HttpDNSSDK/sdk/android/demo/src/main/res/drawable-v24/ic_launcher_foreground.xml
similarity index 100%
rename from EdgeHttpDNS/sdk/android/demo/src/main/res/drawable-v24/ic_launcher_foreground.xml
rename to HttpDNSSDK/sdk/android/demo/src/main/res/drawable-v24/ic_launcher_foreground.xml
diff --git a/EdgeHttpDNS/sdk/android/demo/src/main/res/drawable/ic_add.xml b/HttpDNSSDK/sdk/android/demo/src/main/res/drawable/ic_add.xml
similarity index 100%
rename from EdgeHttpDNS/sdk/android/demo/src/main/res/drawable/ic_add.xml
rename to HttpDNSSDK/sdk/android/demo/src/main/res/drawable/ic_add.xml
diff --git a/EdgeHttpDNS/sdk/android/demo/src/main/res/drawable/ic_arrow_left.xml b/HttpDNSSDK/sdk/android/demo/src/main/res/drawable/ic_arrow_left.xml
similarity index 100%
rename from EdgeHttpDNS/sdk/android/demo/src/main/res/drawable/ic_arrow_left.xml
rename to HttpDNSSDK/sdk/android/demo/src/main/res/drawable/ic_arrow_left.xml
diff --git a/EdgeHttpDNS/sdk/android/demo/src/main/res/drawable/ic_arrow_right.xml b/HttpDNSSDK/sdk/android/demo/src/main/res/drawable/ic_arrow_right.xml
similarity index 100%
rename from EdgeHttpDNS/sdk/android/demo/src/main/res/drawable/ic_arrow_right.xml
rename to HttpDNSSDK/sdk/android/demo/src/main/res/drawable/ic_arrow_right.xml
diff --git a/EdgeHttpDNS/sdk/android/demo/src/main/res/drawable/ic_back.xml b/HttpDNSSDK/sdk/android/demo/src/main/res/drawable/ic_back.xml
similarity index 100%
rename from EdgeHttpDNS/sdk/android/demo/src/main/res/drawable/ic_back.xml
rename to HttpDNSSDK/sdk/android/demo/src/main/res/drawable/ic_back.xml
diff --git a/EdgeHttpDNS/sdk/android/demo/src/main/res/drawable/ic_dns.xml b/HttpDNSSDK/sdk/android/demo/src/main/res/drawable/ic_dns.xml
similarity index 100%
rename from EdgeHttpDNS/sdk/android/demo/src/main/res/drawable/ic_dns.xml
rename to HttpDNSSDK/sdk/android/demo/src/main/res/drawable/ic_dns.xml
diff --git a/EdgeHttpDNS/sdk/android/demo/src/main/res/drawable/ic_home_black_24dp.xml b/HttpDNSSDK/sdk/android/demo/src/main/res/drawable/ic_home_black_24dp.xml
similarity index 100%
rename from EdgeHttpDNS/sdk/android/demo/src/main/res/drawable/ic_home_black_24dp.xml
rename to HttpDNSSDK/sdk/android/demo/src/main/res/drawable/ic_home_black_24dp.xml
diff --git a/EdgeHttpDNS/sdk/android/demo/src/main/res/drawable/ic_httpdns.xml b/HttpDNSSDK/sdk/android/demo/src/main/res/drawable/ic_httpdns.xml
similarity index 100%
rename from EdgeHttpDNS/sdk/android/demo/src/main/res/drawable/ic_httpdns.xml
rename to HttpDNSSDK/sdk/android/demo/src/main/res/drawable/ic_httpdns.xml
diff --git a/EdgeHttpDNS/sdk/android/demo/src/main/res/drawable/ic_information.xml b/HttpDNSSDK/sdk/android/demo/src/main/res/drawable/ic_information.xml
similarity index 100%
rename from EdgeHttpDNS/sdk/android/demo/src/main/res/drawable/ic_information.xml
rename to HttpDNSSDK/sdk/android/demo/src/main/res/drawable/ic_information.xml
diff --git a/EdgeHttpDNS/sdk/android/demo/src/main/res/drawable/ic_practice.xml b/HttpDNSSDK/sdk/android/demo/src/main/res/drawable/ic_practice.xml
similarity index 100%
rename from EdgeHttpDNS/sdk/android/demo/src/main/res/drawable/ic_practice.xml
rename to HttpDNSSDK/sdk/android/demo/src/main/res/drawable/ic_practice.xml
diff --git a/EdgeHttpDNS/sdk/android/demo/src/main/res/layout/activity_http_dns_webview.xml b/HttpDNSSDK/sdk/android/demo/src/main/res/layout/activity_http_dns_webview.xml
similarity index 100%
rename from EdgeHttpDNS/sdk/android/demo/src/main/res/layout/activity_http_dns_webview.xml
rename to HttpDNSSDK/sdk/android/demo/src/main/res/layout/activity_http_dns_webview.xml
diff --git a/EdgeHttpDNS/sdk/android/demo/src/main/res/layout/activity_list.xml b/HttpDNSSDK/sdk/android/demo/src/main/res/layout/activity_list.xml
similarity index 100%
rename from EdgeHttpDNS/sdk/android/demo/src/main/res/layout/activity_list.xml
rename to HttpDNSSDK/sdk/android/demo/src/main/res/layout/activity_list.xml
diff --git a/EdgeHttpDNS/sdk/android/demo/src/main/res/layout/activity_main.xml b/HttpDNSSDK/sdk/android/demo/src/main/res/layout/activity_main.xml
similarity index 100%
rename from EdgeHttpDNS/sdk/android/demo/src/main/res/layout/activity_main.xml
rename to HttpDNSSDK/sdk/android/demo/src/main/res/layout/activity_main.xml
diff --git a/EdgeHttpDNS/sdk/android/demo/src/main/res/layout/activity_sdns_global_setting.xml b/HttpDNSSDK/sdk/android/demo/src/main/res/layout/activity_sdns_global_setting.xml
similarity index 100%
rename from EdgeHttpDNS/sdk/android/demo/src/main/res/layout/activity_sdns_global_setting.xml
rename to HttpDNSSDK/sdk/android/demo/src/main/res/layout/activity_sdns_global_setting.xml
diff --git a/EdgeHttpDNS/sdk/android/demo/src/main/res/layout/dialog_input.xml b/HttpDNSSDK/sdk/android/demo/src/main/res/layout/dialog_input.xml
similarity index 100%
rename from EdgeHttpDNS/sdk/android/demo/src/main/res/layout/dialog_input.xml
rename to HttpDNSSDK/sdk/android/demo/src/main/res/layout/dialog_input.xml
diff --git a/EdgeHttpDNS/sdk/android/demo/src/main/res/layout/dialog_input_2.xml b/HttpDNSSDK/sdk/android/demo/src/main/res/layout/dialog_input_2.xml
similarity index 100%
rename from EdgeHttpDNS/sdk/android/demo/src/main/res/layout/dialog_input_2.xml
rename to HttpDNSSDK/sdk/android/demo/src/main/res/layout/dialog_input_2.xml
diff --git a/EdgeHttpDNS/sdk/android/demo/src/main/res/layout/dialog_input_3.xml b/HttpDNSSDK/sdk/android/demo/src/main/res/layout/dialog_input_3.xml
similarity index 100%
rename from EdgeHttpDNS/sdk/android/demo/src/main/res/layout/dialog_input_3.xml
rename to HttpDNSSDK/sdk/android/demo/src/main/res/layout/dialog_input_3.xml
diff --git a/EdgeHttpDNS/sdk/android/demo/src/main/res/layout/fragment_basic_setting.xml b/HttpDNSSDK/sdk/android/demo/src/main/res/layout/fragment_basic_setting.xml
similarity index 100%
rename from EdgeHttpDNS/sdk/android/demo/src/main/res/layout/fragment_basic_setting.xml
rename to HttpDNSSDK/sdk/android/demo/src/main/res/layout/fragment_basic_setting.xml
diff --git a/EdgeHttpDNS/sdk/android/demo/src/main/res/layout/fragment_best_practice.xml b/HttpDNSSDK/sdk/android/demo/src/main/res/layout/fragment_best_practice.xml
similarity index 100%
rename from EdgeHttpDNS/sdk/android/demo/src/main/res/layout/fragment_best_practice.xml
rename to HttpDNSSDK/sdk/android/demo/src/main/res/layout/fragment_best_practice.xml
diff --git a/EdgeHttpDNS/sdk/android/demo/src/main/res/layout/fragment_info.xml b/HttpDNSSDK/sdk/android/demo/src/main/res/layout/fragment_info.xml
similarity index 100%
rename from EdgeHttpDNS/sdk/android/demo/src/main/res/layout/fragment_info.xml
rename to HttpDNSSDK/sdk/android/demo/src/main/res/layout/fragment_info.xml
diff --git a/EdgeHttpDNS/sdk/android/demo/src/main/res/layout/fragment_resolve.xml b/HttpDNSSDK/sdk/android/demo/src/main/res/layout/fragment_resolve.xml
similarity index 100%
rename from EdgeHttpDNS/sdk/android/demo/src/main/res/layout/fragment_resolve.xml
rename to HttpDNSSDK/sdk/android/demo/src/main/res/layout/fragment_resolve.xml
diff --git a/EdgeHttpDNS/sdk/android/demo/src/main/res/layout/info_list_item.xml b/HttpDNSSDK/sdk/android/demo/src/main/res/layout/info_list_item.xml
similarity index 97%
rename from EdgeHttpDNS/sdk/android/demo/src/main/res/layout/info_list_item.xml
rename to HttpDNSSDK/sdk/android/demo/src/main/res/layout/info_list_item.xml
index 82fbe9c..a544b66 100644
--- a/EdgeHttpDNS/sdk/android/demo/src/main/res/layout/info_list_item.xml
+++ b/HttpDNSSDK/sdk/android/demo/src/main/res/layout/info_list_item.xml
@@ -1,4 +1,4 @@
-
+
+ tools:text="demo.cloudxdr.com" />
@@ -131,7 +131,7 @@
android:padding="5dp"
android:textColor="@color/black"
android:textSize="17dp"
- tools:text="www.aliyun.com" />
+ tools:text="demo.cloudxdr.com" />
-
\ No newline at end of file
+
+
diff --git a/EdgeHttpDNS/sdk/android/demo/src/main/res/menu/bottom_nav_menu.xml b/HttpDNSSDK/sdk/android/demo/src/main/res/menu/bottom_nav_menu.xml
similarity index 100%
rename from EdgeHttpDNS/sdk/android/demo/src/main/res/menu/bottom_nav_menu.xml
rename to HttpDNSSDK/sdk/android/demo/src/main/res/menu/bottom_nav_menu.xml
diff --git a/EdgeHttpDNS/sdk/android/demo/src/main/res/mipmap-hdpi/ic_launcher.png b/HttpDNSSDK/sdk/android/demo/src/main/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from EdgeHttpDNS/sdk/android/demo/src/main/res/mipmap-hdpi/ic_launcher.png
rename to HttpDNSSDK/sdk/android/demo/src/main/res/mipmap-hdpi/ic_launcher.png
diff --git a/EdgeHttpDNS/sdk/android/demo/src/main/res/mipmap-mdpi/ic_launcher.png b/HttpDNSSDK/sdk/android/demo/src/main/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from EdgeHttpDNS/sdk/android/demo/src/main/res/mipmap-mdpi/ic_launcher.png
rename to HttpDNSSDK/sdk/android/demo/src/main/res/mipmap-mdpi/ic_launcher.png
diff --git a/EdgeHttpDNS/sdk/android/demo/src/main/res/mipmap-xhdpi/ic_launcher.png b/HttpDNSSDK/sdk/android/demo/src/main/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from EdgeHttpDNS/sdk/android/demo/src/main/res/mipmap-xhdpi/ic_launcher.png
rename to HttpDNSSDK/sdk/android/demo/src/main/res/mipmap-xhdpi/ic_launcher.png
diff --git a/EdgeHttpDNS/sdk/android/demo/src/main/res/mipmap-xxhdpi/ic_launcher.png b/HttpDNSSDK/sdk/android/demo/src/main/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from EdgeHttpDNS/sdk/android/demo/src/main/res/mipmap-xxhdpi/ic_launcher.png
rename to HttpDNSSDK/sdk/android/demo/src/main/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/EdgeHttpDNS/sdk/android/demo/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/HttpDNSSDK/sdk/android/demo/src/main/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from EdgeHttpDNS/sdk/android/demo/src/main/res/mipmap-xxxhdpi/ic_launcher.png
rename to HttpDNSSDK/sdk/android/demo/src/main/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/EdgeHttpDNS/sdk/android/demo/src/main/res/navigation/mobile_navigation.xml b/HttpDNSSDK/sdk/android/demo/src/main/res/navigation/mobile_navigation.xml
similarity index 100%
rename from EdgeHttpDNS/sdk/android/demo/src/main/res/navigation/mobile_navigation.xml
rename to HttpDNSSDK/sdk/android/demo/src/main/res/navigation/mobile_navigation.xml
diff --git a/EdgeHttpDNS/sdk/android/demo/src/main/res/values-land/dimens.xml b/HttpDNSSDK/sdk/android/demo/src/main/res/values-land/dimens.xml
similarity index 100%
rename from EdgeHttpDNS/sdk/android/demo/src/main/res/values-land/dimens.xml
rename to HttpDNSSDK/sdk/android/demo/src/main/res/values-land/dimens.xml
diff --git a/EdgeHttpDNS/sdk/android/demo/src/main/res/values-night/themes.xml b/HttpDNSSDK/sdk/android/demo/src/main/res/values-night/themes.xml
similarity index 100%
rename from EdgeHttpDNS/sdk/android/demo/src/main/res/values-night/themes.xml
rename to HttpDNSSDK/sdk/android/demo/src/main/res/values-night/themes.xml
diff --git a/EdgeHttpDNS/sdk/android/demo/src/main/res/values-w1240dp/dimens.xml b/HttpDNSSDK/sdk/android/demo/src/main/res/values-w1240dp/dimens.xml
similarity index 100%
rename from EdgeHttpDNS/sdk/android/demo/src/main/res/values-w1240dp/dimens.xml
rename to HttpDNSSDK/sdk/android/demo/src/main/res/values-w1240dp/dimens.xml
diff --git a/EdgeHttpDNS/sdk/android/demo/src/main/res/values-w600dp/dimens.xml b/HttpDNSSDK/sdk/android/demo/src/main/res/values-w600dp/dimens.xml
similarity index 100%
rename from EdgeHttpDNS/sdk/android/demo/src/main/res/values-w600dp/dimens.xml
rename to HttpDNSSDK/sdk/android/demo/src/main/res/values-w600dp/dimens.xml
diff --git a/EdgeHttpDNS/sdk/android/demo/src/main/res/values-zh-rCN/strings.xml b/HttpDNSSDK/sdk/android/demo/src/main/res/values-zh-rCN/strings.xml
similarity index 99%
rename from EdgeHttpDNS/sdk/android/demo/src/main/res/values-zh-rCN/strings.xml
rename to HttpDNSSDK/sdk/android/demo/src/main/res/values-zh-rCN/strings.xml
index d1eb4b1..1e0b26a 100644
--- a/EdgeHttpDNS/sdk/android/demo/src/main/res/values-zh-rCN/strings.xml
+++ b/HttpDNSSDK/sdk/android/demo/src/main/res/values-zh-rCN/strings.xml
@@ -1,4 +1,4 @@
-
+
闃块噷浜慔ttpDNS瀹樻柟Demo
鍩虹璁剧疆
@@ -114,7 +114,7 @@
Cache key鐢ㄤ簬鍞竴鏍囪瘑缂撳瓨涓殑瑙f瀽缁撴灉
瑕佽В鏋愮殑鍩熷悕
- 渚嬪锛歨elp.aliyun.com
+ 渚嬪锛歞emo.cloudxdr.com
瑕佽姹傜殑鎺ュ彛
渚嬪: /document_detail/434554.html
@@ -135,4 +135,4 @@
鎻愮ず
缃戠粶鏈繛鎺ワ紝璇锋鏌ョ綉缁
璇锋眰寮傚父: %s
-
\ No newline at end of file
+
diff --git a/EdgeHttpDNS/sdk/android/demo/src/main/res/values/attrs.xml b/HttpDNSSDK/sdk/android/demo/src/main/res/values/attrs.xml
similarity index 100%
rename from EdgeHttpDNS/sdk/android/demo/src/main/res/values/attrs.xml
rename to HttpDNSSDK/sdk/android/demo/src/main/res/values/attrs.xml
diff --git a/EdgeHttpDNS/sdk/android/demo/src/main/res/values/colors.xml b/HttpDNSSDK/sdk/android/demo/src/main/res/values/colors.xml
similarity index 100%
rename from EdgeHttpDNS/sdk/android/demo/src/main/res/values/colors.xml
rename to HttpDNSSDK/sdk/android/demo/src/main/res/values/colors.xml
diff --git a/EdgeHttpDNS/sdk/android/demo/src/main/res/values/dimens.xml b/HttpDNSSDK/sdk/android/demo/src/main/res/values/dimens.xml
similarity index 100%
rename from EdgeHttpDNS/sdk/android/demo/src/main/res/values/dimens.xml
rename to HttpDNSSDK/sdk/android/demo/src/main/res/values/dimens.xml
diff --git a/EdgeHttpDNS/sdk/android/demo/src/main/res/values/strings.xml b/HttpDNSSDK/sdk/android/demo/src/main/res/values/strings.xml
similarity index 98%
rename from EdgeHttpDNS/sdk/android/demo/src/main/res/values/strings.xml
rename to HttpDNSSDK/sdk/android/demo/src/main/res/values/strings.xml
index 41e6811..7fb2d6a 100644
--- a/EdgeHttpDNS/sdk/android/demo/src/main/res/values/strings.xml
+++ b/HttpDNSSDK/sdk/android/demo/src/main/res/values/strings.xml
@@ -1,4 +1,4 @@
-
+
New Cloud HttpDNS Demo
Basic Settings
HttpDNS Resolve
@@ -112,7 +112,7 @@
The cache key is the uniquely identifies of the cache dns result
The Host will be resolved
- eg: help.aliyun.com
+ eg: demo.cloudxdr.com
The API to be requested
eg: /document_detail/434554.html
@@ -137,4 +137,5 @@
Request exception: %s
-
\ No newline at end of file
+
+
diff --git a/EdgeHttpDNS/sdk/android/demo/src/main/res/values/styles.xml b/HttpDNSSDK/sdk/android/demo/src/main/res/values/styles.xml
similarity index 100%
rename from EdgeHttpDNS/sdk/android/demo/src/main/res/values/styles.xml
rename to HttpDNSSDK/sdk/android/demo/src/main/res/values/styles.xml
diff --git a/EdgeHttpDNS/sdk/android/demo/src/main/res/values/themes.xml b/HttpDNSSDK/sdk/android/demo/src/main/res/values/themes.xml
similarity index 100%
rename from EdgeHttpDNS/sdk/android/demo/src/main/res/values/themes.xml
rename to HttpDNSSDK/sdk/android/demo/src/main/res/values/themes.xml
diff --git a/EdgeHttpDNS/sdk/android/demo/src/main/res/xml/network_security_config.xml b/HttpDNSSDK/sdk/android/demo/src/main/res/xml/network_security_config.xml
similarity index 100%
rename from EdgeHttpDNS/sdk/android/demo/src/main/res/xml/network_security_config.xml
rename to HttpDNSSDK/sdk/android/demo/src/main/res/xml/network_security_config.xml
diff --git a/EdgeHttpDNS/sdk/android/demo/src/test/java/com/newsdk/ams/emas/demo/ExampleUnitTest.kt b/HttpDNSSDK/sdk/android/demo/src/test/java/com/newsdk/ams/emas/demo/ExampleUnitTest.kt
similarity index 100%
rename from EdgeHttpDNS/sdk/android/demo/src/test/java/com/newsdk/ams/emas/demo/ExampleUnitTest.kt
rename to HttpDNSSDK/sdk/android/demo/src/test/java/com/newsdk/ams/emas/demo/ExampleUnitTest.kt
diff --git a/EdgeHttpDNS/sdk/android/gradle.properties b/HttpDNSSDK/sdk/android/gradle.properties
similarity index 100%
rename from EdgeHttpDNS/sdk/android/gradle.properties
rename to HttpDNSSDK/sdk/android/gradle.properties
diff --git a/EdgeHttpDNS/sdk/android/gradle/wrapper/gradle-wrapper.jar b/HttpDNSSDK/sdk/android/gradle/wrapper/gradle-wrapper.jar
similarity index 100%
rename from EdgeHttpDNS/sdk/android/gradle/wrapper/gradle-wrapper.jar
rename to HttpDNSSDK/sdk/android/gradle/wrapper/gradle-wrapper.jar
diff --git a/EdgeHttpDNS/sdk/android/gradle/wrapper/gradle-wrapper.properties b/HttpDNSSDK/sdk/android/gradle/wrapper/gradle-wrapper.properties
similarity index 100%
rename from EdgeHttpDNS/sdk/android/gradle/wrapper/gradle-wrapper.properties
rename to HttpDNSSDK/sdk/android/gradle/wrapper/gradle-wrapper.properties
diff --git a/EdgeHttpDNS/sdk/android/gradlew b/HttpDNSSDK/sdk/android/gradlew
similarity index 100%
rename from EdgeHttpDNS/sdk/android/gradlew
rename to HttpDNSSDK/sdk/android/gradlew
diff --git a/EdgeHttpDNS/sdk/android/gradlew.bat b/HttpDNSSDK/sdk/android/gradlew.bat
similarity index 100%
rename from EdgeHttpDNS/sdk/android/gradlew.bat
rename to HttpDNSSDK/sdk/android/gradlew.bat
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/build.gradle b/HttpDNSSDK/sdk/android/httpdns-sdk/build.gradle
similarity index 92%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/build.gradle
rename to HttpDNSSDK/sdk/android/httpdns-sdk/build.gradle
index a5aad70..12a62dd 100644
--- a/EdgeHttpDNS/sdk/android/httpdns-sdk/build.gradle
+++ b/HttpDNSSDK/sdk/android/httpdns-sdk/build.gradle
@@ -79,6 +79,15 @@ android {
}
}
+android.libraryVariants.all { variant ->
+ if (variant.name == "normalRelease") {
+ def sdkVersion = variant.mergedFlavor.versionName ?: httpdnsDebugVersion
+ variant.outputs.all { output ->
+ outputFileName = "new--android-httpdns-v${sdkVersion}.aar"
+ }
+ }
+}
+
dependencies {
//noinspection GradleDependency 高版本 jdk和androidx有一些依赖,暂时不升级
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/proguard-rules-for-test.pro b/HttpDNSSDK/sdk/android/httpdns-sdk/proguard-rules-for-test.pro
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/proguard-rules-for-test.pro
rename to HttpDNSSDK/sdk/android/httpdns-sdk/proguard-rules-for-test.pro
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/proguard-rules.pro b/HttpDNSSDK/sdk/android/httpdns-sdk/proguard-rules.pro
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/proguard-rules.pro
rename to HttpDNSSDK/sdk/android/httpdns-sdk/proguard-rules.pro
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/end2end/java/com/newsdk/sdk/android/httpdns/ApiForTest.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/end2end/java/com/newsdk/sdk/android/httpdns/ApiForTest.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/end2end/java/com/newsdk/sdk/android/httpdns/ApiForTest.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/end2end/java/com/newsdk/sdk/android/httpdns/ApiForTest.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/end2end/java/com/newsdk/sdk/android/httpdns/BeforeHttpDnsServiceInit.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/end2end/java/com/newsdk/sdk/android/httpdns/BeforeHttpDnsServiceInit.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/end2end/java/com/newsdk/sdk/android/httpdns/BeforeHttpDnsServiceInit.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/end2end/java/com/newsdk/sdk/android/httpdns/BeforeHttpDnsServiceInit.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/end2end/java/com/newsdk/sdk/android/httpdns/HttpDns.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/end2end/java/com/newsdk/sdk/android/httpdns/HttpDns.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/end2end/java/com/newsdk/sdk/android/httpdns/HttpDns.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/end2end/java/com/newsdk/sdk/android/httpdns/HttpDns.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/end2end/java/com/newsdk/sdk/android/httpdns/InitManager.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/end2end/java/com/newsdk/sdk/android/httpdns/InitManager.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/end2end/java/com/newsdk/sdk/android/httpdns/InitManager.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/end2end/java/com/newsdk/sdk/android/httpdns/InitManager.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/end2end/java/com/newsdk/sdk/android/httpdns/impl/HttpDnsServiceTestImpl.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/end2end/java/com/newsdk/sdk/android/httpdns/impl/HttpDnsServiceTestImpl.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/end2end/java/com/newsdk/sdk/android/httpdns/impl/HttpDnsServiceTestImpl.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/end2end/java/com/newsdk/sdk/android/httpdns/impl/HttpDnsServiceTestImpl.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/end2end/java/com/newsdk/sdk/android/httpdns/impl/InstanceCreator.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/end2end/java/com/newsdk/sdk/android/httpdns/impl/InstanceCreator.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/end2end/java/com/newsdk/sdk/android/httpdns/impl/InstanceCreator.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/end2end/java/com/newsdk/sdk/android/httpdns/impl/InstanceCreator.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/intl/java/com/newsdk/sdk/android/httpdns/HttpDns.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/intl/java/com/newsdk/sdk/android/httpdns/HttpDns.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/intl/java/com/newsdk/sdk/android/httpdns/HttpDns.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/intl/java/com/newsdk/sdk/android/httpdns/HttpDns.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/intl/java/com/newsdk/sdk/android/httpdns/impl/InstanceCreator.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/intl/java/com/newsdk/sdk/android/httpdns/impl/InstanceCreator.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/intl/java/com/newsdk/sdk/android/httpdns/impl/InstanceCreator.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/intl/java/com/newsdk/sdk/android/httpdns/impl/InstanceCreator.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/intl/java/com/newsdk/sdk/android/httpdns/impl/IntlImpl.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/intl/java/com/newsdk/sdk/android/httpdns/impl/IntlImpl.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/intl/java/com/newsdk/sdk/android/httpdns/impl/IntlImpl.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/intl/java/com/newsdk/sdk/android/httpdns/impl/IntlImpl.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/AndroidManifest.xml b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/AndroidManifest.xml
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/AndroidManifest.xml
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/AndroidManifest.xml
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/CacheTtlChanger.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/CacheTtlChanger.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/CacheTtlChanger.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/CacheTtlChanger.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/DegradationFilter.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/DegradationFilter.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/DegradationFilter.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/DegradationFilter.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/HTTPDNSResult.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/HTTPDNSResult.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/HTTPDNSResult.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/HTTPDNSResult.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/HTTPDNSResultWrapper.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/HTTPDNSResultWrapper.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/HTTPDNSResultWrapper.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/HTTPDNSResultWrapper.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/HttpDnsCallback.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/HttpDnsCallback.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/HttpDnsCallback.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/HttpDnsCallback.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/HttpDnsService.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/HttpDnsService.java
similarity index 99%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/HttpDnsService.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/HttpDnsService.java
index cc095a3..97349f1 100644
--- a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/HttpDnsService.java
+++ b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/HttpDnsService.java
@@ -26,7 +26,7 @@ public interface HttpDnsService {
/**
* 寮傛瑙f瀽鎺ュ彛, 棣栧厛鏌ヨ缂撳瓨, 鑻ュ瓨鍦ㄥ垯杩斿洖缁撴灉, 鑻ヤ笉瀛樺湪杩斿洖null 骞朵笖杩涜寮傛鍩熷悕瑙f瀽璇锋眰
*
- * @param host 濡倃ww.aliyun.com
+ * @param host 濡倃emo.cloudxdr.com
* @return 杩斿洖ip, 濡傛灉娌″緱鍒拌В鏋愮粨鏋? 鍒欒繑鍥瀗ull
* @deprecated 璇ユ帴鍙e凡搴熷純锛屽悗缁増鏈彲鑳戒細琚垹闄わ紝璇蜂娇鐢▄@link #getIPv4ForHostAsync(String)}
*/
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/HttpDnsSettings.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/HttpDnsSettings.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/HttpDnsSettings.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/HttpDnsSettings.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/HttpDnsV1Client.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/HttpDnsV1Client.java
similarity index 79%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/HttpDnsV1Client.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/HttpDnsV1Client.java
index 5cf4a83..ce8e19d 100644
--- a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/HttpDnsV1Client.java
+++ b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/HttpDnsV1Client.java
@@ -13,6 +13,25 @@ public final class HttpDnsV1Client {
private HttpDnsV1Client() {
}
+ public static HttpDnsService init(Context context,
+ String appId,
+ String serviceUrl,
+ String signSecret) {
+ InitConfig.Builder builder = new InitConfig.Builder()
+ .setContext(context)
+ .setServiceUrl(serviceUrl);
+
+ if (!TextUtils.isEmpty(signSecret)) {
+ builder.setSecretKey(signSecret);
+ }
+
+ builder.buildFor(appId);
+ if (!TextUtils.isEmpty(signSecret)) {
+ return HttpDns.getService(context, appId, signSecret);
+ }
+ return HttpDns.getService(context, appId);
+ }
+
public static HttpDnsService init(Context context,
String appId,
String primaryServiceHost,
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/ILogger.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/ILogger.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/ILogger.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/ILogger.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/InitConfig.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/InitConfig.java
similarity index 92%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/InitConfig.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/InitConfig.java
index cabf935..3764702 100644
--- a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/InitConfig.java
+++ b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/InitConfig.java
@@ -5,6 +5,8 @@ import android.content.Context;
import android.text.TextUtils;
import android.text.format.DateUtils;
+import java.net.URI;
+import java.net.URISyntaxException;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@@ -450,6 +452,47 @@ public class InitConfig {
return this;
}
+ /**
+ * Configure HTTPDNS endpoint with URL, e.g. "https://example.com:8445".
+ * This sets scheme/host/port in one call and clears backup host.
+ */
+ public Builder setServiceUrl(String serviceUrl) {
+ if (TextUtils.isEmpty(serviceUrl)) {
+ throw new InitException("serviceUrl should not be empty");
+ }
+
+ String raw = serviceUrl.trim();
+ if (raw.isEmpty()) {
+ throw new InitException("serviceUrl should not be empty");
+ }
+
+ String normalized = raw;
+ if (!raw.startsWith("http://") && !raw.startsWith("https://")) {
+ normalized = "https://" + raw;
+ }
+
+ try {
+ URI uri = new URI(normalized);
+ String host = uri.getHost();
+ if (TextUtils.isEmpty(host)) {
+ throw new InitException("invalid serviceUrl host: " + serviceUrl);
+ }
+
+ this.primaryServiceHost = host;
+ this.backupServiceHost = null;
+
+ if (uri.getPort() > 0) {
+ this.servicePort = uri.getPort();
+ }
+
+ String scheme = uri.getScheme();
+ this.enableHttps = !"http".equalsIgnoreCase(scheme);
+ } catch (URISyntaxException e) {
+ throw new InitException("invalid serviceUrl: " + serviceUrl);
+ }
+ return this;
+ }
+
/**
* 鎵归噺璁剧疆鏈嶅姟鍩熷悕锛屾敮鎸佷富澶囦袱涓€? */
public Builder setServiceHosts(List hosts) {
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/NetType.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/NetType.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/NetType.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/NetType.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/NotUseHttpDnsFilter.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/NotUseHttpDnsFilter.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/NotUseHttpDnsFilter.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/NotUseHttpDnsFilter.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/Region.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/Region.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/Region.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/Region.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/RequestIpType.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/RequestIpType.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/RequestIpType.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/RequestIpType.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/SyncService.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/SyncService.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/SyncService.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/SyncService.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/cache/HostRecord.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/cache/HostRecord.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/cache/HostRecord.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/cache/HostRecord.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/cache/RecordDBHelper.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/cache/RecordDBHelper.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/cache/RecordDBHelper.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/cache/RecordDBHelper.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/config/ConfigCacheHelper.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/config/ConfigCacheHelper.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/config/ConfigCacheHelper.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/config/ConfigCacheHelper.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/config/RegionServer.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/config/RegionServer.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/config/RegionServer.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/config/RegionServer.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/config/ServerConfig.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/config/ServerConfig.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/config/ServerConfig.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/config/ServerConfig.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/config/SpCacheItem.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/config/SpCacheItem.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/config/SpCacheItem.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/config/SpCacheItem.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/config/region/AmericaRegionServer.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/config/region/AmericaRegionServer.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/config/region/AmericaRegionServer.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/config/region/AmericaRegionServer.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/config/region/DefaultRegionServer.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/config/region/DefaultRegionServer.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/config/region/DefaultRegionServer.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/config/region/DefaultRegionServer.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/config/region/GermanyRegionServer.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/config/region/GermanyRegionServer.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/config/region/GermanyRegionServer.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/config/region/GermanyRegionServer.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/config/region/HongKongRegionServer.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/config/region/HongKongRegionServer.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/config/region/HongKongRegionServer.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/config/region/HongKongRegionServer.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/config/region/PreReleaseRegionServer.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/config/region/PreReleaseRegionServer.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/config/region/PreReleaseRegionServer.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/config/region/PreReleaseRegionServer.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/config/region/RegionServerManager.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/config/region/RegionServerManager.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/config/region/RegionServerManager.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/config/region/RegionServerManager.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/config/region/SingaporeRegionServer.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/config/region/SingaporeRegionServer.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/config/region/SingaporeRegionServer.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/config/region/SingaporeRegionServer.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/exception/HttpDnsUncaughtExceptionHandler.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/exception/HttpDnsUncaughtExceptionHandler.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/exception/HttpDnsUncaughtExceptionHandler.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/exception/HttpDnsUncaughtExceptionHandler.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/exception/InitException.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/exception/InitException.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/exception/InitException.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/exception/InitException.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/impl/AESEncryptService.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/impl/AESEncryptService.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/impl/AESEncryptService.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/impl/AESEncryptService.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/impl/ErrorImpl.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/impl/ErrorImpl.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/impl/ErrorImpl.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/impl/ErrorImpl.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/impl/HostResolveLocker.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/impl/HostResolveLocker.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/impl/HostResolveLocker.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/impl/HostResolveLocker.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/impl/HostResolveRecorder.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/impl/HostResolveRecorder.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/impl/HostResolveRecorder.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/impl/HostResolveRecorder.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/impl/HttpDnsConfig.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/impl/HttpDnsConfig.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/impl/HttpDnsConfig.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/impl/HttpDnsConfig.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/impl/HttpDnsCreator.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/impl/HttpDnsCreator.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/impl/HttpDnsCreator.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/impl/HttpDnsCreator.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/impl/HttpDnsInstanceHolder.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/impl/HttpDnsInstanceHolder.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/impl/HttpDnsInstanceHolder.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/impl/HttpDnsInstanceHolder.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/impl/HttpDnsServiceImpl.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/impl/HttpDnsServiceImpl.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/impl/HttpDnsServiceImpl.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/impl/HttpDnsServiceImpl.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/impl/SignService.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/impl/SignService.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/impl/SignService.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/impl/SignService.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/log/HttpDnsLog.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/log/HttpDnsLog.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/log/HttpDnsLog.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/log/HttpDnsLog.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/net/HttpDnsNetworkDetector.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/net/HttpDnsNetworkDetector.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/net/HttpDnsNetworkDetector.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/net/HttpDnsNetworkDetector.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/net/NetworkStateManager.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/net/NetworkStateManager.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/net/NetworkStateManager.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/net/NetworkStateManager.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/network/HttpDnsAdapterException.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/network/HttpDnsAdapterException.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/network/HttpDnsAdapterException.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/network/HttpDnsAdapterException.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/network/HttpDnsAdapterOptions.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/network/HttpDnsAdapterOptions.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/network/HttpDnsAdapterOptions.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/network/HttpDnsAdapterOptions.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/network/HttpDnsAdapterRequest.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/network/HttpDnsAdapterRequest.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/network/HttpDnsAdapterRequest.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/network/HttpDnsAdapterRequest.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/network/HttpDnsAdapterResponse.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/network/HttpDnsAdapterResponse.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/network/HttpDnsAdapterResponse.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/network/HttpDnsAdapterResponse.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/network/HttpDnsErrorCode.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/network/HttpDnsErrorCode.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/network/HttpDnsErrorCode.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/network/HttpDnsErrorCode.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/network/HttpDnsHttpAdapter.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/network/HttpDnsHttpAdapter.java
similarity index 92%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/network/HttpDnsHttpAdapter.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/network/HttpDnsHttpAdapter.java
index 3fd7743..739b5ea 100644
--- a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/network/HttpDnsHttpAdapter.java
+++ b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/network/HttpDnsHttpAdapter.java
@@ -134,30 +134,44 @@ public class HttpDnsHttpAdapter {
private List resolveIps(String host) {
RequestIpType type = options.getRequestIpType();
HTTPDNSResult result = httpDnsService.getHttpDnsResultForHostSyncNonBlocking(host, type, null, null);
+ List ips = collectIps(result);
+ if (!ips.isEmpty()) {
+ return ips;
+ }
+
+ // Non-blocking read may miss cache in startup/race windows; fallback to sync resolve once.
+ result = httpDnsService.getHttpDnsResultForHostSync(host, type, null, null);
+ return collectIps(result);
+ }
+
+ private List collectIps(HTTPDNSResult result) {
if (result == null) {
return Collections.emptyList();
}
-
List ips = new ArrayList<>();
- String[] v4 = result.getIps();
- if (v4 != null) {
- for (String item : v4) {
- if (item != null && item.length() > 0) {
- ips.add(item);
- }
- }
- }
- String[] v6 = result.getIpv6s();
- if (v6 != null) {
- for (String item : v6) {
- if (item != null && item.length() > 0) {
- ips.add(item);
- }
- }
- }
+ appendIps(ips, result.getIps());
+ appendIps(ips, result.getIpv6s());
return ips;
}
+ private void appendIps(List target, String[] source) {
+ if (source == null || source.length == 0) {
+ return;
+ }
+ for (String item : source) {
+ if (item == null) {
+ continue;
+ }
+ String ip = item.trim();
+ if (ip.isEmpty()) {
+ continue;
+ }
+ if (!target.contains(ip)) {
+ target.add(ip);
+ }
+ }
+ }
+
private byte[] readResponseBytes(HttpURLConnection connection, int code) throws IOException {
InputStream stream = code >= 400 ? connection.getErrorStream() : connection.getInputStream();
if (stream == null) {
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/observable/ObservableConfig.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/observable/ObservableConfig.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/observable/ObservableConfig.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/observable/ObservableConfig.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/observable/ObservableConstants.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/observable/ObservableConstants.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/observable/ObservableConstants.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/observable/ObservableConstants.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/observable/ObservableHttpRequest.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/observable/ObservableHttpRequest.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/observable/ObservableHttpRequest.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/observable/ObservableHttpRequest.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/observable/ObservableManager.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/observable/ObservableManager.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/observable/ObservableManager.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/observable/ObservableManager.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/observable/event/BatchQueryHttpDnsApiEvent.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/observable/event/BatchQueryHttpDnsApiEvent.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/observable/event/BatchQueryHttpDnsApiEvent.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/observable/event/BatchQueryHttpDnsApiEvent.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/observable/event/CallSdkApiEvent.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/observable/event/CallSdkApiEvent.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/observable/event/CallSdkApiEvent.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/observable/event/CallSdkApiEvent.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/observable/event/CleanHostCacheEvent.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/observable/event/CleanHostCacheEvent.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/observable/event/CleanHostCacheEvent.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/observable/event/CleanHostCacheEvent.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/observable/event/GroupEvent.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/observable/event/GroupEvent.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/observable/event/GroupEvent.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/observable/event/GroupEvent.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/observable/event/LocalDnsEvent.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/observable/event/LocalDnsEvent.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/observable/event/LocalDnsEvent.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/observable/event/LocalDnsEvent.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/observable/event/ObservableEvent.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/observable/event/ObservableEvent.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/observable/event/ObservableEvent.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/observable/event/ObservableEvent.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/observable/event/QueryHttpDnsApiEvent.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/observable/event/QueryHttpDnsApiEvent.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/observable/event/QueryHttpDnsApiEvent.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/observable/event/QueryHttpDnsApiEvent.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/observable/event/ReportingRateExceptionEvent.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/observable/event/ReportingRateExceptionEvent.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/observable/event/ReportingRateExceptionEvent.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/observable/event/ReportingRateExceptionEvent.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/observable/event/UpdateRegionServerIpsEvent.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/observable/event/UpdateRegionServerIpsEvent.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/observable/event/UpdateRegionServerIpsEvent.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/observable/event/UpdateRegionServerIpsEvent.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/ranking/IPRankingBean.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/ranking/IPRankingBean.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/ranking/IPRankingBean.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/ranking/IPRankingBean.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/ranking/IPRankingCallback.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/ranking/IPRankingCallback.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/ranking/IPRankingCallback.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/ranking/IPRankingCallback.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/ranking/IPRankingService.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/ranking/IPRankingService.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/ranking/IPRankingService.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/ranking/IPRankingService.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/ranking/IPRankingTask.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/ranking/IPRankingTask.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/ranking/IPRankingTask.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/ranking/IPRankingTask.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/request/AsyncRequestTask.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/request/AsyncRequestTask.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/request/AsyncRequestTask.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/request/AsyncRequestTask.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/request/BatchResolveHttpRequestStatusWatcher.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/request/BatchResolveHttpRequestStatusWatcher.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/request/BatchResolveHttpRequestStatusWatcher.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/request/BatchResolveHttpRequestStatusWatcher.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/request/HttpException.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/request/HttpException.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/request/HttpException.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/request/HttpException.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/request/HttpRequest.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/request/HttpRequest.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/request/HttpRequest.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/request/HttpRequest.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/request/HttpRequestConfig.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/request/HttpRequestConfig.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/request/HttpRequestConfig.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/request/HttpRequestConfig.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/request/HttpRequestFailWatcher.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/request/HttpRequestFailWatcher.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/request/HttpRequestFailWatcher.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/request/HttpRequestFailWatcher.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/request/HttpRequestTask.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/request/HttpRequestTask.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/request/HttpRequestTask.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/request/HttpRequestTask.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/request/HttpRequestWatcher.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/request/HttpRequestWatcher.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/request/HttpRequestWatcher.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/request/HttpRequestWatcher.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/request/HttpRequestWrapper.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/request/HttpRequestWrapper.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/request/HttpRequestWrapper.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/request/HttpRequestWrapper.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/request/RequestCallback.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/request/RequestCallback.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/request/RequestCallback.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/request/RequestCallback.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/request/ResponseParser.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/request/ResponseParser.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/request/ResponseParser.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/request/ResponseParser.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/request/RetryHttpRequest.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/request/RetryHttpRequest.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/request/RetryHttpRequest.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/request/RetryHttpRequest.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/request/SingleResolveHttpRequestStatusWatcher.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/request/SingleResolveHttpRequestStatusWatcher.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/request/SingleResolveHttpRequestStatusWatcher.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/request/SingleResolveHttpRequestStatusWatcher.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/request/UpdateRegionServerHttpRequestStatusWatcher.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/request/UpdateRegionServerHttpRequestStatusWatcher.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/request/UpdateRegionServerHttpRequestStatusWatcher.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/request/UpdateRegionServerHttpRequestStatusWatcher.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/resolve/BatchResolveHostService.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/resolve/BatchResolveHostService.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/resolve/BatchResolveHostService.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/resolve/BatchResolveHostService.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/resolve/CategoryController.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/resolve/CategoryController.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/resolve/CategoryController.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/resolve/CategoryController.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/resolve/HostFilter.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/resolve/HostFilter.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/resolve/HostFilter.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/resolve/HostFilter.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/resolve/NormalResolveCategory.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/resolve/NormalResolveCategory.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/resolve/NormalResolveCategory.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/resolve/NormalResolveCategory.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/resolve/ResolveHostCache.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/resolve/ResolveHostCache.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/resolve/ResolveHostCache.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/resolve/ResolveHostCache.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/resolve/ResolveHostCacheGroup.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/resolve/ResolveHostCacheGroup.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/resolve/ResolveHostCacheGroup.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/resolve/ResolveHostCacheGroup.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/resolve/ResolveHostCategory.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/resolve/ResolveHostCategory.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/resolve/ResolveHostCategory.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/resolve/ResolveHostCategory.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/resolve/ResolveHostHelper.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/resolve/ResolveHostHelper.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/resolve/ResolveHostHelper.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/resolve/ResolveHostHelper.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/resolve/ResolveHostRequestHandler.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/resolve/ResolveHostRequestHandler.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/resolve/ResolveHostRequestHandler.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/resolve/ResolveHostRequestHandler.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/resolve/ResolveHostResponse.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/resolve/ResolveHostResponse.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/resolve/ResolveHostResponse.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/resolve/ResolveHostResponse.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/resolve/ResolveHostResponseParser.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/resolve/ResolveHostResponseParser.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/resolve/ResolveHostResponseParser.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/resolve/ResolveHostResponseParser.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/resolve/ResolveHostResultRepo.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/resolve/ResolveHostResultRepo.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/resolve/ResolveHostResultRepo.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/resolve/ResolveHostResultRepo.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/resolve/ResolveHostService.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/resolve/ResolveHostService.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/resolve/ResolveHostService.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/resolve/ResolveHostService.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/resolve/ShiftServerWatcher.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/resolve/ShiftServerWatcher.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/resolve/ShiftServerWatcher.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/resolve/ShiftServerWatcher.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/resolve/SniffException.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/resolve/SniffException.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/resolve/SniffException.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/resolve/SniffException.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/resolve/SniffResolveCategory.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/resolve/SniffResolveCategory.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/resolve/SniffResolveCategory.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/resolve/SniffResolveCategory.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/resolve/StatusControl.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/resolve/StatusControl.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/resolve/StatusControl.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/resolve/StatusControl.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/serverip/RegionServer.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/serverip/RegionServer.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/serverip/RegionServer.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/serverip/RegionServer.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/serverip/RegionServerIpData.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/serverip/RegionServerIpData.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/serverip/RegionServerIpData.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/serverip/RegionServerIpData.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/serverip/RegionServerIpRepo.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/serverip/RegionServerIpRepo.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/serverip/RegionServerIpRepo.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/serverip/RegionServerIpRepo.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/serverip/RegionServerScheduleService.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/serverip/RegionServerScheduleService.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/serverip/RegionServerScheduleService.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/serverip/RegionServerScheduleService.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/serverip/ShiftRegionServerWatcher.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/serverip/ShiftRegionServerWatcher.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/serverip/ShiftRegionServerWatcher.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/serverip/ShiftRegionServerWatcher.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/serverip/UpdateRegionServerLocker.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/serverip/UpdateRegionServerLocker.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/serverip/UpdateRegionServerLocker.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/serverip/UpdateRegionServerLocker.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/serverip/UpdateRegionServerResponse.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/serverip/UpdateRegionServerResponse.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/serverip/UpdateRegionServerResponse.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/serverip/UpdateRegionServerResponse.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/serverip/UpdateRegionServerTask.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/serverip/UpdateRegionServerTask.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/serverip/UpdateRegionServerTask.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/serverip/UpdateRegionServerTask.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/serverip/ranking/RegionServerRankingCallback.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/serverip/ranking/RegionServerRankingCallback.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/serverip/ranking/RegionServerRankingCallback.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/serverip/ranking/RegionServerRankingCallback.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/serverip/ranking/RegionServerRankingService.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/serverip/ranking/RegionServerRankingService.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/serverip/ranking/RegionServerRankingService.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/serverip/ranking/RegionServerRankingService.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/serverip/ranking/RegionServerRankingTask.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/serverip/ranking/RegionServerRankingTask.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/serverip/ranking/RegionServerRankingTask.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/serverip/ranking/RegionServerRankingTask.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/track/SessionTrackMgr.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/track/SessionTrackMgr.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/track/SessionTrackMgr.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/track/SessionTrackMgr.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/utils/CommonUtil.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/utils/CommonUtil.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/utils/CommonUtil.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/utils/CommonUtil.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/utils/Constants.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/utils/Constants.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/utils/Constants.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/utils/Constants.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/utils/NetworkUtil.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/utils/NetworkUtil.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/utils/NetworkUtil.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/utils/NetworkUtil.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/utils/ThreadUtil.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/utils/ThreadUtil.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/utils/ThreadUtil.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/main/java/com/newsdk/sdk/android/httpdns/utils/ThreadUtil.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/normal/java/com/newsdk/sdk/android/httpdns/HttpDns.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/normal/java/com/newsdk/sdk/android/httpdns/HttpDns.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/normal/java/com/newsdk/sdk/android/httpdns/HttpDns.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/normal/java/com/newsdk/sdk/android/httpdns/HttpDns.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/normal/java/com/newsdk/sdk/android/httpdns/impl/InstanceCreator.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/normal/java/com/newsdk/sdk/android/httpdns/impl/InstanceCreator.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/normal/java/com/newsdk/sdk/android/httpdns/impl/InstanceCreator.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/normal/java/com/newsdk/sdk/android/httpdns/impl/InstanceCreator.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/normal/java/com/newsdk/sdk/android/httpdns/impl/NormalImpl.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/normal/java/com/newsdk/sdk/android/httpdns/impl/NormalImpl.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/normal/java/com/newsdk/sdk/android/httpdns/impl/NormalImpl.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/normal/java/com/newsdk/sdk/android/httpdns/impl/NormalImpl.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/HttpDnsE2E.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/HttpDnsE2E.java
similarity index 99%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/HttpDnsE2E.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/HttpDnsE2E.java
index 2e4808f..440f913 100644
--- a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/HttpDnsE2E.java
+++ b/HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/HttpDnsE2E.java
@@ -1,4 +1,4 @@
-package com.newsdk.sdk.android.httpdns;
+package com.newsdk.sdk.android.httpdns;
import android.Manifest;
import android.net.ConnectivityManager;
@@ -1966,7 +1966,7 @@ public class HttpDnsE2E {
}
/**
- * https://aone.Aliyun.com/req/38989131
+ * https://example.com/req/38989131
*
* 鏈嶅姟IP涓嶆槸褰撳墠region鐨勬湇鍔P鏃讹紝涓嶈兘鐢ㄤ簬鍩熷悕瑙f瀽
*/
@@ -2273,3 +2273,4 @@ public class HttpDnsE2E {
}
}
+
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/HttpDnsResultTest.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/HttpDnsResultTest.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/HttpDnsResultTest.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/HttpDnsResultTest.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/InitConfigTest.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/InitConfigTest.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/InitConfigTest.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/InitConfigTest.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/cache/RecordDBHelperTest.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/cache/RecordDBHelperTest.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/cache/RecordDBHelperTest.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/cache/RecordDBHelperTest.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/impl/AESEncryptServiceTest.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/impl/AESEncryptServiceTest.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/impl/AESEncryptServiceTest.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/impl/AESEncryptServiceTest.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/impl/HostResolveRecorderTest.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/impl/HostResolveRecorderTest.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/impl/HostResolveRecorderTest.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/impl/HostResolveRecorderTest.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/impl/HttpDnsConfigTest.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/impl/HttpDnsConfigTest.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/impl/HttpDnsConfigTest.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/impl/HttpDnsConfigTest.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/impl/HttpDnsInstanceHolderTest.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/impl/HttpDnsInstanceHolderTest.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/impl/HttpDnsInstanceHolderTest.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/impl/HttpDnsInstanceHolderTest.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/impl/SignServiceTest.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/impl/SignServiceTest.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/impl/SignServiceTest.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/impl/SignServiceTest.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/log/HttpdnsLogTest.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/log/HttpdnsLogTest.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/log/HttpdnsLogTest.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/log/HttpdnsLogTest.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/probe/IPRankingTaskTest.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/probe/IPRankingTaskTest.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/probe/IPRankingTaskTest.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/probe/IPRankingTaskTest.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/request/HttpExceptionTest.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/request/HttpExceptionTest.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/request/HttpExceptionTest.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/request/HttpExceptionTest.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/request/HttpRequestTest.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/request/HttpRequestTest.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/request/HttpRequestTest.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/request/HttpRequestTest.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/request/HttpRequestWatcherTest.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/request/HttpRequestWatcherTest.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/request/HttpRequestWatcherTest.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/request/HttpRequestWatcherTest.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/request/HttpRequestWrapperTest.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/request/HttpRequestWrapperTest.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/request/HttpRequestWrapperTest.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/request/HttpRequestWrapperTest.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/request/RetryHttpRequestTest.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/request/RetryHttpRequestTest.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/request/RetryHttpRequestTest.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/request/RetryHttpRequestTest.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/resolve/BaseCategoryTest.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/resolve/BaseCategoryTest.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/resolve/BaseCategoryTest.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/resolve/BaseCategoryTest.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/resolve/CategoryControllerTest.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/resolve/CategoryControllerTest.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/resolve/CategoryControllerTest.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/resolve/CategoryControllerTest.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/resolve/HostFilterTest.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/resolve/HostFilterTest.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/resolve/HostFilterTest.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/resolve/HostFilterTest.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/resolve/NormalCategoryTest.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/resolve/NormalCategoryTest.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/resolve/NormalCategoryTest.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/resolve/NormalCategoryTest.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/resolve/ResolveHostResponseTest.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/resolve/ResolveHostResponseTest.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/resolve/ResolveHostResponseTest.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/resolve/ResolveHostResponseTest.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/resolve/ResolveHostResultRepoTest.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/resolve/ResolveHostResultRepoTest.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/resolve/ResolveHostResultRepoTest.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/resolve/ResolveHostResultRepoTest.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/resolve/ResolveHostResultRepoTest2.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/resolve/ResolveHostResultRepoTest2.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/resolve/ResolveHostResultRepoTest2.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/resolve/ResolveHostResultRepoTest2.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/resolve/ShiftServerWatcherTest.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/resolve/ShiftServerWatcherTest.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/resolve/ShiftServerWatcherTest.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/resolve/ShiftServerWatcherTest.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/resolve/SniffCategoryTest.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/resolve/SniffCategoryTest.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/resolve/SniffCategoryTest.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/resolve/SniffCategoryTest.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/serverip/ServerIpRepoTest.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/serverip/ServerIpRepoTest.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/serverip/ServerIpRepoTest.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/serverip/ServerIpRepoTest.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/serverip/UpdateServerLockerTest.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/serverip/UpdateServerLockerTest.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/serverip/UpdateServerLockerTest.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/serverip/UpdateServerLockerTest.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/serverip/UpdateServerResponseTest.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/serverip/UpdateServerResponseTest.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/serverip/UpdateServerResponseTest.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/serverip/UpdateServerResponseTest.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/serverip/UpdateServerTaskTest.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/serverip/UpdateServerTaskTest.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/serverip/UpdateServerTaskTest.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/serverip/UpdateServerTaskTest.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/app/BusinessApp.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/app/BusinessApp.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/app/BusinessApp.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/app/BusinessApp.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/helper/ServerStatusHelper.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/helper/ServerStatusHelper.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/helper/ServerStatusHelper.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/helper/ServerStatusHelper.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/server/BatchResolveHostServer.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/server/BatchResolveHostServer.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/server/BatchResolveHostServer.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/server/BatchResolveHostServer.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/server/DebugApiServer.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/server/DebugApiServer.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/server/DebugApiServer.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/server/DebugApiServer.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/server/HttpDnsServer.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/server/HttpDnsServer.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/server/HttpDnsServer.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/server/HttpDnsServer.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/server/MockSpeedTestServer.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/server/MockSpeedTestServer.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/server/MockSpeedTestServer.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/server/MockSpeedTestServer.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/server/ResolveHostServer.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/server/ResolveHostServer.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/server/ResolveHostServer.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/server/ResolveHostServer.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/server/SecretService.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/server/SecretService.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/server/SecretService.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/server/SecretService.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/server/ServerIpsServer.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/server/ServerIpsServer.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/server/ServerIpsServer.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/server/ServerIpsServer.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/server/base/BaseDataServer.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/server/base/BaseDataServer.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/server/base/BaseDataServer.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/server/base/BaseDataServer.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/server/base/RequestHandler.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/server/base/RequestHandler.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/server/base/RequestHandler.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/server/base/RequestHandler.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/server/base/RequestListener.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/server/base/RequestListener.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/server/base/RequestListener.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/server/base/RequestListener.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/server/base/RequestRecord.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/server/base/RequestRecord.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/server/base/RequestRecord.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/server/base/RequestRecord.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/server/base/SdkBusinessServer.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/server/base/SdkBusinessServer.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/server/base/SdkBusinessServer.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/server/base/SdkBusinessServer.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/server/base/ServerApi.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/server/base/ServerApi.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/server/base/ServerApi.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/server/base/ServerApi.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/utils/CountUpAndDownLatch.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/utils/CountUpAndDownLatch.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/utils/CountUpAndDownLatch.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/utils/CountUpAndDownLatch.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/utils/MultiThreadTestHelper.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/utils/MultiThreadTestHelper.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/utils/MultiThreadTestHelper.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/utils/MultiThreadTestHelper.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/utils/RandomValue.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/utils/RandomValue.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/utils/RandomValue.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/utils/RandomValue.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/utils/ShadowNetworkInfo.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/utils/ShadowNetworkInfo.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/utils/ShadowNetworkInfo.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/utils/ShadowNetworkInfo.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/utils/SyncExecutorService.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/utils/SyncExecutorService.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/utils/SyncExecutorService.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/utils/SyncExecutorService.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/utils/TestExecutorService.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/utils/TestExecutorService.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/utils/TestExecutorService.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/utils/TestExecutorService.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/utils/TestLogger.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/utils/TestLogger.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/utils/TestLogger.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/utils/TestLogger.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/utils/UnitTestUtil.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/utils/UnitTestUtil.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/utils/UnitTestUtil.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/test/utils/UnitTestUtil.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/utils/CommonUtilTest.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/utils/CommonUtilTest.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/utils/CommonUtilTest.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/utils/CommonUtilTest.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/utils/HexTest.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/utils/HexTest.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/utils/HexTest.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/utils/HexTest.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/version/V2_3_0.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/version/V2_3_0.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/version/V2_3_0.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/version/V2_3_0.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/version/V2_3_0_NetType.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/version/V2_3_0_NetType.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/version/V2_3_0_NetType.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/version/V2_3_0_NetType.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/version/V2_3_0_config.java b/HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/version/V2_3_0_config.java
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/version/V2_3_0_config.java
rename to HttpDNSSDK/sdk/android/httpdns-sdk/src/testEnd2end/java/com/newsdk/sdk/android/httpdns/version/V2_3_0_config.java
diff --git a/EdgeHttpDNS/sdk/android/httpdns-sdk/version.gradle b/HttpDNSSDK/sdk/android/httpdns-sdk/version.gradle
similarity index 100%
rename from EdgeHttpDNS/sdk/android/httpdns-sdk/version.gradle
rename to HttpDNSSDK/sdk/android/httpdns-sdk/version.gradle
diff --git a/EdgeHttpDNS/sdk/android/local-maven/com/newsdk/ams/new-android-crashdefend/0.0.6/new-android-crashdefend-0.0.6.jar b/HttpDNSSDK/sdk/android/local-maven/com/newsdk/ams/new-android-crashdefend/0.0.6/new-android-crashdefend-0.0.6.jar
similarity index 100%
rename from EdgeHttpDNS/sdk/android/local-maven/com/newsdk/ams/new-android-crashdefend/0.0.6/new-android-crashdefend-0.0.6.jar
rename to HttpDNSSDK/sdk/android/local-maven/com/newsdk/ams/new-android-crashdefend/0.0.6/new-android-crashdefend-0.0.6.jar
diff --git a/EdgeHttpDNS/sdk/android/local-maven/com/newsdk/ams/new-android-crashdefend/0.0.6/new-android-crashdefend-0.0.6.jar.md5 b/HttpDNSSDK/sdk/android/local-maven/com/newsdk/ams/new-android-crashdefend/0.0.6/new-android-crashdefend-0.0.6.jar.md5
similarity index 100%
rename from EdgeHttpDNS/sdk/android/local-maven/com/newsdk/ams/new-android-crashdefend/0.0.6/new-android-crashdefend-0.0.6.jar.md5
rename to HttpDNSSDK/sdk/android/local-maven/com/newsdk/ams/new-android-crashdefend/0.0.6/new-android-crashdefend-0.0.6.jar.md5
diff --git a/EdgeHttpDNS/sdk/android/local-maven/com/newsdk/ams/new-android-crashdefend/0.0.6/new-android-crashdefend-0.0.6.jar.sha1 b/HttpDNSSDK/sdk/android/local-maven/com/newsdk/ams/new-android-crashdefend/0.0.6/new-android-crashdefend-0.0.6.jar.sha1
similarity index 100%
rename from EdgeHttpDNS/sdk/android/local-maven/com/newsdk/ams/new-android-crashdefend/0.0.6/new-android-crashdefend-0.0.6.jar.sha1
rename to HttpDNSSDK/sdk/android/local-maven/com/newsdk/ams/new-android-crashdefend/0.0.6/new-android-crashdefend-0.0.6.jar.sha1
diff --git a/EdgeHttpDNS/sdk/android/local-maven/com/newsdk/ams/new-android-crashdefend/0.0.6/new-android-crashdefend-0.0.6.pom b/HttpDNSSDK/sdk/android/local-maven/com/newsdk/ams/new-android-crashdefend/0.0.6/new-android-crashdefend-0.0.6.pom
similarity index 100%
rename from EdgeHttpDNS/sdk/android/local-maven/com/newsdk/ams/new-android-crashdefend/0.0.6/new-android-crashdefend-0.0.6.pom
rename to HttpDNSSDK/sdk/android/local-maven/com/newsdk/ams/new-android-crashdefend/0.0.6/new-android-crashdefend-0.0.6.pom
diff --git a/EdgeHttpDNS/sdk/android/local-maven/com/newsdk/ams/new-android-crashdefend/0.0.6/new-android-crashdefend-0.0.6.pom.md5 b/HttpDNSSDK/sdk/android/local-maven/com/newsdk/ams/new-android-crashdefend/0.0.6/new-android-crashdefend-0.0.6.pom.md5
similarity index 100%
rename from EdgeHttpDNS/sdk/android/local-maven/com/newsdk/ams/new-android-crashdefend/0.0.6/new-android-crashdefend-0.0.6.pom.md5
rename to HttpDNSSDK/sdk/android/local-maven/com/newsdk/ams/new-android-crashdefend/0.0.6/new-android-crashdefend-0.0.6.pom.md5
diff --git a/EdgeHttpDNS/sdk/android/local-maven/com/newsdk/ams/new-android-crashdefend/0.0.6/new-android-crashdefend-0.0.6.pom.sha1 b/HttpDNSSDK/sdk/android/local-maven/com/newsdk/ams/new-android-crashdefend/0.0.6/new-android-crashdefend-0.0.6.pom.sha1
similarity index 100%
rename from EdgeHttpDNS/sdk/android/local-maven/com/newsdk/ams/new-android-crashdefend/0.0.6/new-android-crashdefend-0.0.6.pom.sha1
rename to HttpDNSSDK/sdk/android/local-maven/com/newsdk/ams/new-android-crashdefend/0.0.6/new-android-crashdefend-0.0.6.pom.sha1
diff --git a/EdgeHttpDNS/sdk/android/local-maven/com/newsdk/ams/new-android-httpdns/2.6.6/new-android-httpdns-2.6.6.aar b/HttpDNSSDK/sdk/android/local-maven/com/newsdk/ams/new-android-httpdns/2.6.6/new-android-httpdns-2.6.6.aar
similarity index 100%
rename from EdgeHttpDNS/sdk/android/local-maven/com/newsdk/ams/new-android-httpdns/2.6.6/new-android-httpdns-2.6.6.aar
rename to HttpDNSSDK/sdk/android/local-maven/com/newsdk/ams/new-android-httpdns/2.6.6/new-android-httpdns-2.6.6.aar
diff --git a/EdgeHttpDNS/sdk/android/local-maven/com/newsdk/ams/new-android-httpdns/2.6.6/new-android-httpdns-2.6.6.aar.md5 b/HttpDNSSDK/sdk/android/local-maven/com/newsdk/ams/new-android-httpdns/2.6.6/new-android-httpdns-2.6.6.aar.md5
similarity index 100%
rename from EdgeHttpDNS/sdk/android/local-maven/com/newsdk/ams/new-android-httpdns/2.6.6/new-android-httpdns-2.6.6.aar.md5
rename to HttpDNSSDK/sdk/android/local-maven/com/newsdk/ams/new-android-httpdns/2.6.6/new-android-httpdns-2.6.6.aar.md5
diff --git a/EdgeHttpDNS/sdk/android/local-maven/com/newsdk/ams/new-android-httpdns/2.6.6/new-android-httpdns-2.6.6.aar.sha1 b/HttpDNSSDK/sdk/android/local-maven/com/newsdk/ams/new-android-httpdns/2.6.6/new-android-httpdns-2.6.6.aar.sha1
similarity index 100%
rename from EdgeHttpDNS/sdk/android/local-maven/com/newsdk/ams/new-android-httpdns/2.6.6/new-android-httpdns-2.6.6.aar.sha1
rename to HttpDNSSDK/sdk/android/local-maven/com/newsdk/ams/new-android-httpdns/2.6.6/new-android-httpdns-2.6.6.aar.sha1
diff --git a/EdgeHttpDNS/sdk/android/local-maven/com/newsdk/ams/new-android-httpdns/2.6.6/new-android-httpdns-2.6.6.pom b/HttpDNSSDK/sdk/android/local-maven/com/newsdk/ams/new-android-httpdns/2.6.6/new-android-httpdns-2.6.6.pom
similarity index 100%
rename from EdgeHttpDNS/sdk/android/local-maven/com/newsdk/ams/new-android-httpdns/2.6.6/new-android-httpdns-2.6.6.pom
rename to HttpDNSSDK/sdk/android/local-maven/com/newsdk/ams/new-android-httpdns/2.6.6/new-android-httpdns-2.6.6.pom
diff --git a/EdgeHttpDNS/sdk/android/local-maven/com/newsdk/ams/new-android-httpdns/2.6.6/new-android-httpdns-2.6.6.pom.md5 b/HttpDNSSDK/sdk/android/local-maven/com/newsdk/ams/new-android-httpdns/2.6.6/new-android-httpdns-2.6.6.pom.md5
similarity index 100%
rename from EdgeHttpDNS/sdk/android/local-maven/com/newsdk/ams/new-android-httpdns/2.6.6/new-android-httpdns-2.6.6.pom.md5
rename to HttpDNSSDK/sdk/android/local-maven/com/newsdk/ams/new-android-httpdns/2.6.6/new-android-httpdns-2.6.6.pom.md5
diff --git a/EdgeHttpDNS/sdk/android/local-maven/com/newsdk/ams/new-android-httpdns/2.6.6/new-android-httpdns-2.6.6.pom.sha1 b/HttpDNSSDK/sdk/android/local-maven/com/newsdk/ams/new-android-httpdns/2.6.6/new-android-httpdns-2.6.6.pom.sha1
similarity index 100%
rename from EdgeHttpDNS/sdk/android/local-maven/com/newsdk/ams/new-android-httpdns/2.6.6/new-android-httpdns-2.6.6.pom.sha1
rename to HttpDNSSDK/sdk/android/local-maven/com/newsdk/ams/new-android-httpdns/2.6.6/new-android-httpdns-2.6.6.pom.sha1
diff --git a/EdgeHttpDNS/sdk/android/local-maven/com/newsdk/ams/new-android-ipdetector/1.2.0/new-android-ipdetector-1.2.0.aar b/HttpDNSSDK/sdk/android/local-maven/com/newsdk/ams/new-android-ipdetector/1.2.0/new-android-ipdetector-1.2.0.aar
similarity index 100%
rename from EdgeHttpDNS/sdk/android/local-maven/com/newsdk/ams/new-android-ipdetector/1.2.0/new-android-ipdetector-1.2.0.aar
rename to HttpDNSSDK/sdk/android/local-maven/com/newsdk/ams/new-android-ipdetector/1.2.0/new-android-ipdetector-1.2.0.aar
diff --git a/EdgeHttpDNS/sdk/android/local-maven/com/newsdk/ams/new-android-ipdetector/1.2.0/new-android-ipdetector-1.2.0.aar.md5 b/HttpDNSSDK/sdk/android/local-maven/com/newsdk/ams/new-android-ipdetector/1.2.0/new-android-ipdetector-1.2.0.aar.md5
similarity index 100%
rename from EdgeHttpDNS/sdk/android/local-maven/com/newsdk/ams/new-android-ipdetector/1.2.0/new-android-ipdetector-1.2.0.aar.md5
rename to HttpDNSSDK/sdk/android/local-maven/com/newsdk/ams/new-android-ipdetector/1.2.0/new-android-ipdetector-1.2.0.aar.md5
diff --git a/EdgeHttpDNS/sdk/android/local-maven/com/newsdk/ams/new-android-ipdetector/1.2.0/new-android-ipdetector-1.2.0.aar.sha1 b/HttpDNSSDK/sdk/android/local-maven/com/newsdk/ams/new-android-ipdetector/1.2.0/new-android-ipdetector-1.2.0.aar.sha1
similarity index 100%
rename from EdgeHttpDNS/sdk/android/local-maven/com/newsdk/ams/new-android-ipdetector/1.2.0/new-android-ipdetector-1.2.0.aar.sha1
rename to HttpDNSSDK/sdk/android/local-maven/com/newsdk/ams/new-android-ipdetector/1.2.0/new-android-ipdetector-1.2.0.aar.sha1
diff --git a/EdgeHttpDNS/sdk/android/local-maven/com/newsdk/ams/new-android-ipdetector/1.2.0/new-android-ipdetector-1.2.0.pom b/HttpDNSSDK/sdk/android/local-maven/com/newsdk/ams/new-android-ipdetector/1.2.0/new-android-ipdetector-1.2.0.pom
similarity index 100%
rename from EdgeHttpDNS/sdk/android/local-maven/com/newsdk/ams/new-android-ipdetector/1.2.0/new-android-ipdetector-1.2.0.pom
rename to HttpDNSSDK/sdk/android/local-maven/com/newsdk/ams/new-android-ipdetector/1.2.0/new-android-ipdetector-1.2.0.pom
diff --git a/EdgeHttpDNS/sdk/android/local-maven/com/newsdk/ams/new-android-ipdetector/1.2.0/new-android-ipdetector-1.2.0.pom.md5 b/HttpDNSSDK/sdk/android/local-maven/com/newsdk/ams/new-android-ipdetector/1.2.0/new-android-ipdetector-1.2.0.pom.md5
similarity index 100%
rename from EdgeHttpDNS/sdk/android/local-maven/com/newsdk/ams/new-android-ipdetector/1.2.0/new-android-ipdetector-1.2.0.pom.md5
rename to HttpDNSSDK/sdk/android/local-maven/com/newsdk/ams/new-android-ipdetector/1.2.0/new-android-ipdetector-1.2.0.pom.md5
diff --git a/EdgeHttpDNS/sdk/android/local-maven/com/newsdk/ams/new-android-ipdetector/1.2.0/new-android-ipdetector-1.2.0.pom.sha1 b/HttpDNSSDK/sdk/android/local-maven/com/newsdk/ams/new-android-ipdetector/1.2.0/new-android-ipdetector-1.2.0.pom.sha1
similarity index 100%
rename from EdgeHttpDNS/sdk/android/local-maven/com/newsdk/ams/new-android-ipdetector/1.2.0/new-android-ipdetector-1.2.0.pom.sha1
rename to HttpDNSSDK/sdk/android/local-maven/com/newsdk/ams/new-android-ipdetector/1.2.0/new-android-ipdetector-1.2.0.pom.sha1
diff --git a/EdgeHttpDNS/sdk/android/local-maven/com/newsdk/ams/new-android-logger/1.2.0/new-android-logger-1.2.0.aar b/HttpDNSSDK/sdk/android/local-maven/com/newsdk/ams/new-android-logger/1.2.0/new-android-logger-1.2.0.aar
similarity index 100%
rename from EdgeHttpDNS/sdk/android/local-maven/com/newsdk/ams/new-android-logger/1.2.0/new-android-logger-1.2.0.aar
rename to HttpDNSSDK/sdk/android/local-maven/com/newsdk/ams/new-android-logger/1.2.0/new-android-logger-1.2.0.aar
diff --git a/EdgeHttpDNS/sdk/android/local-maven/com/newsdk/ams/new-android-logger/1.2.0/new-android-logger-1.2.0.aar.md5 b/HttpDNSSDK/sdk/android/local-maven/com/newsdk/ams/new-android-logger/1.2.0/new-android-logger-1.2.0.aar.md5
similarity index 100%
rename from EdgeHttpDNS/sdk/android/local-maven/com/newsdk/ams/new-android-logger/1.2.0/new-android-logger-1.2.0.aar.md5
rename to HttpDNSSDK/sdk/android/local-maven/com/newsdk/ams/new-android-logger/1.2.0/new-android-logger-1.2.0.aar.md5
diff --git a/EdgeHttpDNS/sdk/android/local-maven/com/newsdk/ams/new-android-logger/1.2.0/new-android-logger-1.2.0.aar.sha1 b/HttpDNSSDK/sdk/android/local-maven/com/newsdk/ams/new-android-logger/1.2.0/new-android-logger-1.2.0.aar.sha1
similarity index 100%
rename from EdgeHttpDNS/sdk/android/local-maven/com/newsdk/ams/new-android-logger/1.2.0/new-android-logger-1.2.0.aar.sha1
rename to HttpDNSSDK/sdk/android/local-maven/com/newsdk/ams/new-android-logger/1.2.0/new-android-logger-1.2.0.aar.sha1
diff --git a/EdgeHttpDNS/sdk/android/local-maven/com/newsdk/ams/new-android-logger/1.2.0/new-android-logger-1.2.0.pom b/HttpDNSSDK/sdk/android/local-maven/com/newsdk/ams/new-android-logger/1.2.0/new-android-logger-1.2.0.pom
similarity index 100%
rename from EdgeHttpDNS/sdk/android/local-maven/com/newsdk/ams/new-android-logger/1.2.0/new-android-logger-1.2.0.pom
rename to HttpDNSSDK/sdk/android/local-maven/com/newsdk/ams/new-android-logger/1.2.0/new-android-logger-1.2.0.pom
diff --git a/EdgeHttpDNS/sdk/android/local-maven/com/newsdk/ams/new-android-logger/1.2.0/new-android-logger-1.2.0.pom.md5 b/HttpDNSSDK/sdk/android/local-maven/com/newsdk/ams/new-android-logger/1.2.0/new-android-logger-1.2.0.pom.md5
similarity index 100%
rename from EdgeHttpDNS/sdk/android/local-maven/com/newsdk/ams/new-android-logger/1.2.0/new-android-logger-1.2.0.pom.md5
rename to HttpDNSSDK/sdk/android/local-maven/com/newsdk/ams/new-android-logger/1.2.0/new-android-logger-1.2.0.pom.md5
diff --git a/EdgeHttpDNS/sdk/android/local-maven/com/newsdk/ams/new-android-logger/1.2.0/new-android-logger-1.2.0.pom.sha1 b/HttpDNSSDK/sdk/android/local-maven/com/newsdk/ams/new-android-logger/1.2.0/new-android-logger-1.2.0.pom.sha1
similarity index 100%
rename from EdgeHttpDNS/sdk/android/local-maven/com/newsdk/ams/new-android-logger/1.2.0/new-android-logger-1.2.0.pom.sha1
rename to HttpDNSSDK/sdk/android/local-maven/com/newsdk/ams/new-android-logger/1.2.0/new-android-logger-1.2.0.pom.sha1
diff --git a/EdgeHttpDNS/sdk/android/local-maven/com/newsdk/ams/new-android-tool/1.1.0/new-android-tool-1.1.0.aar b/HttpDNSSDK/sdk/android/local-maven/com/newsdk/ams/new-android-tool/1.1.0/new-android-tool-1.1.0.aar
similarity index 100%
rename from EdgeHttpDNS/sdk/android/local-maven/com/newsdk/ams/new-android-tool/1.1.0/new-android-tool-1.1.0.aar
rename to HttpDNSSDK/sdk/android/local-maven/com/newsdk/ams/new-android-tool/1.1.0/new-android-tool-1.1.0.aar
diff --git a/EdgeHttpDNS/sdk/android/local-maven/com/newsdk/ams/new-android-tool/1.1.0/new-android-tool-1.1.0.aar.md5 b/HttpDNSSDK/sdk/android/local-maven/com/newsdk/ams/new-android-tool/1.1.0/new-android-tool-1.1.0.aar.md5
similarity index 100%
rename from EdgeHttpDNS/sdk/android/local-maven/com/newsdk/ams/new-android-tool/1.1.0/new-android-tool-1.1.0.aar.md5
rename to HttpDNSSDK/sdk/android/local-maven/com/newsdk/ams/new-android-tool/1.1.0/new-android-tool-1.1.0.aar.md5
diff --git a/EdgeHttpDNS/sdk/android/local-maven/com/newsdk/ams/new-android-tool/1.1.0/new-android-tool-1.1.0.aar.sha1 b/HttpDNSSDK/sdk/android/local-maven/com/newsdk/ams/new-android-tool/1.1.0/new-android-tool-1.1.0.aar.sha1
similarity index 100%
rename from EdgeHttpDNS/sdk/android/local-maven/com/newsdk/ams/new-android-tool/1.1.0/new-android-tool-1.1.0.aar.sha1
rename to HttpDNSSDK/sdk/android/local-maven/com/newsdk/ams/new-android-tool/1.1.0/new-android-tool-1.1.0.aar.sha1
diff --git a/EdgeHttpDNS/sdk/android/local-maven/com/newsdk/ams/new-android-tool/1.1.0/new-android-tool-1.1.0.pom b/HttpDNSSDK/sdk/android/local-maven/com/newsdk/ams/new-android-tool/1.1.0/new-android-tool-1.1.0.pom
similarity index 100%
rename from EdgeHttpDNS/sdk/android/local-maven/com/newsdk/ams/new-android-tool/1.1.0/new-android-tool-1.1.0.pom
rename to HttpDNSSDK/sdk/android/local-maven/com/newsdk/ams/new-android-tool/1.1.0/new-android-tool-1.1.0.pom
diff --git a/EdgeHttpDNS/sdk/android/local-maven/com/newsdk/ams/new-android-tool/1.1.0/new-android-tool-1.1.0.pom.md5 b/HttpDNSSDK/sdk/android/local-maven/com/newsdk/ams/new-android-tool/1.1.0/new-android-tool-1.1.0.pom.md5
similarity index 100%
rename from EdgeHttpDNS/sdk/android/local-maven/com/newsdk/ams/new-android-tool/1.1.0/new-android-tool-1.1.0.pom.md5
rename to HttpDNSSDK/sdk/android/local-maven/com/newsdk/ams/new-android-tool/1.1.0/new-android-tool-1.1.0.pom.md5
diff --git a/EdgeHttpDNS/sdk/android/local-maven/com/newsdk/ams/new-android-tool/1.1.0/new-android-tool-1.1.0.pom.sha1 b/HttpDNSSDK/sdk/android/local-maven/com/newsdk/ams/new-android-tool/1.1.0/new-android-tool-1.1.0.pom.sha1
similarity index 100%
rename from EdgeHttpDNS/sdk/android/local-maven/com/newsdk/ams/new-android-tool/1.1.0/new-android-tool-1.1.0.pom.sha1
rename to HttpDNSSDK/sdk/android/local-maven/com/newsdk/ams/new-android-tool/1.1.0/new-android-tool-1.1.0.pom.sha1
diff --git a/EdgeHttpDNS/sdk/android/local-maven/com/newsdk/fastjson/1.1.73.android/fastjson-1.1.73.android.jar b/HttpDNSSDK/sdk/android/local-maven/com/newsdk/fastjson/1.1.73.android/fastjson-1.1.73.android.jar
similarity index 100%
rename from EdgeHttpDNS/sdk/android/local-maven/com/newsdk/fastjson/1.1.73.android/fastjson-1.1.73.android.jar
rename to HttpDNSSDK/sdk/android/local-maven/com/newsdk/fastjson/1.1.73.android/fastjson-1.1.73.android.jar
diff --git a/EdgeHttpDNS/sdk/android/local-maven/com/newsdk/fastjson/1.1.73.android/fastjson-1.1.73.android.jar.md5 b/HttpDNSSDK/sdk/android/local-maven/com/newsdk/fastjson/1.1.73.android/fastjson-1.1.73.android.jar.md5
similarity index 100%
rename from EdgeHttpDNS/sdk/android/local-maven/com/newsdk/fastjson/1.1.73.android/fastjson-1.1.73.android.jar.md5
rename to HttpDNSSDK/sdk/android/local-maven/com/newsdk/fastjson/1.1.73.android/fastjson-1.1.73.android.jar.md5
diff --git a/EdgeHttpDNS/sdk/android/local-maven/com/newsdk/fastjson/1.1.73.android/fastjson-1.1.73.android.jar.sha1 b/HttpDNSSDK/sdk/android/local-maven/com/newsdk/fastjson/1.1.73.android/fastjson-1.1.73.android.jar.sha1
similarity index 100%
rename from EdgeHttpDNS/sdk/android/local-maven/com/newsdk/fastjson/1.1.73.android/fastjson-1.1.73.android.jar.sha1
rename to HttpDNSSDK/sdk/android/local-maven/com/newsdk/fastjson/1.1.73.android/fastjson-1.1.73.android.jar.sha1
diff --git a/EdgeHttpDNS/sdk/android/local-maven/com/newsdk/fastjson/1.1.73.android/fastjson-1.1.73.android.pom b/HttpDNSSDK/sdk/android/local-maven/com/newsdk/fastjson/1.1.73.android/fastjson-1.1.73.android.pom
similarity index 100%
rename from EdgeHttpDNS/sdk/android/local-maven/com/newsdk/fastjson/1.1.73.android/fastjson-1.1.73.android.pom
rename to HttpDNSSDK/sdk/android/local-maven/com/newsdk/fastjson/1.1.73.android/fastjson-1.1.73.android.pom
diff --git a/EdgeHttpDNS/sdk/android/local-maven/com/newsdk/fastjson/1.1.73.android/fastjson-1.1.73.android.pom.md5 b/HttpDNSSDK/sdk/android/local-maven/com/newsdk/fastjson/1.1.73.android/fastjson-1.1.73.android.pom.md5
similarity index 100%
rename from EdgeHttpDNS/sdk/android/local-maven/com/newsdk/fastjson/1.1.73.android/fastjson-1.1.73.android.pom.md5
rename to HttpDNSSDK/sdk/android/local-maven/com/newsdk/fastjson/1.1.73.android/fastjson-1.1.73.android.pom.md5
diff --git a/EdgeHttpDNS/sdk/android/local-maven/com/newsdk/fastjson/1.1.73.android/fastjson-1.1.73.android.pom.sha1 b/HttpDNSSDK/sdk/android/local-maven/com/newsdk/fastjson/1.1.73.android/fastjson-1.1.73.android.pom.sha1
similarity index 100%
rename from EdgeHttpDNS/sdk/android/local-maven/com/newsdk/fastjson/1.1.73.android/fastjson-1.1.73.android.pom.sha1
rename to HttpDNSSDK/sdk/android/local-maven/com/newsdk/fastjson/1.1.73.android/fastjson-1.1.73.android.pom.sha1
diff --git a/EdgeHttpDNS/sdk/android/settings.gradle b/HttpDNSSDK/sdk/android/settings.gradle
similarity index 100%
rename from EdgeHttpDNS/sdk/android/settings.gradle
rename to HttpDNSSDK/sdk/android/settings.gradle
diff --git a/EdgeHttpDNS/sdk/build_packages.sh b/HttpDNSSDK/sdk/build_packages.sh
similarity index 55%
rename from EdgeHttpDNS/sdk/build_packages.sh
rename to HttpDNSSDK/sdk/build_packages.sh
index c81b350..a025185 100644
--- a/EdgeHttpDNS/sdk/build_packages.sh
+++ b/HttpDNSSDK/sdk/build_packages.sh
@@ -6,7 +6,10 @@ DIST_DIR="$ROOT/dist"
TMP_DIR="$ROOT/.tmp_sdk_pkg"
function lookup_version() {
- VERSION_FILE="$ROOT/../internal/const/const.go"
+ VERSION_FILE="$ROOT/../../EdgeHttpDNS/internal/const/const.go"
+ if [ ! -f "$VERSION_FILE" ]; then
+ VERSION_FILE="$ROOT/../EdgeHttpDNS/internal/const/const.go"
+ fi
if [ ! -f "$VERSION_FILE" ]; then
echo "0.0.0"
return
@@ -49,7 +52,10 @@ function build_android_sdk_package() {
./gradlew :httpdns-sdk:clean :httpdns-sdk:assembleNormalRelease
)
- AAR_FILE=$(find "$ROOT/android/httpdns-sdk/build/outputs/aar" -type f -name "*normal-release*.aar" | head -n 1)
+ AAR_FILE=$(find "$ROOT/android/httpdns-sdk/build/outputs/aar" -type f -name "new--android-httpdns-v*.aar" | head -n 1)
+ if [ -z "$AAR_FILE" ]; then
+ AAR_FILE=$(find "$ROOT/android/httpdns-sdk/build/outputs/aar" -type f -name "*normal-release*.aar" | head -n 1)
+ fi
if [ -z "$AAR_FILE" ]; then
AAR_FILE=$(find "$ROOT/android/httpdns-sdk/build/outputs/aar" -type f -name "*release*.aar" | head -n 1)
fi
@@ -61,15 +67,34 @@ function build_android_sdk_package() {
PKG_DIR="$TMP_DIR/android"
rm -rf "$PKG_DIR"
mkdir -p "$PKG_DIR"
- cp "$AAR_FILE" "$PKG_DIR/alicloud-android-httpdns.aar"
- if [ -f "$ROOT/android/README.md" ]; then
- cp "$ROOT/android/README.md" "$PKG_DIR/README.md"
+ cp "$AAR_FILE" "$PKG_DIR/new--android-httpdns-v${VERSION}.aar"
+
+ CRASHDEFEND_JAR="$ROOT/android/local-maven/com/newsdk/ams/new-android-crashdefend/0.0.6/new-android-crashdefend-0.0.6.jar"
+ IPDETECTOR_AAR="$ROOT/android/local-maven/com/newsdk/ams/new-android-ipdetector/1.2.0/new-android-ipdetector-1.2.0.aar"
+ LOGGER_AAR="$ROOT/android/local-maven/com/newsdk/ams/new-android-logger/1.2.0/new-android-logger-1.2.0.aar"
+
+ if [ ! -f "$CRASHDEFEND_JAR" ]; then
+ echo "required file missing: $CRASHDEFEND_JAR"
+ exit 1
fi
- if [ -f "$ROOT/android/httpdns-sdk/proguard-rules.pro" ]; then
- cp "$ROOT/android/httpdns-sdk/proguard-rules.pro" "$PKG_DIR/proguard-rules.pro"
+ if [ ! -f "$IPDETECTOR_AAR" ]; then
+ echo "required file missing: $IPDETECTOR_AAR"
+ exit 1
+ fi
+ if [ ! -f "$LOGGER_AAR" ]; then
+ echo "required file missing: $LOGGER_AAR"
+ exit 1
fi
- zip_dir "$PKG_DIR" "$DIST_DIR/httpdns-sdk-android.zip"
+ cp "$CRASHDEFEND_JAR" "$PKG_DIR/new-android-crashdefend-0.0.6.jar"
+ cp "$IPDETECTOR_AAR" "$PKG_DIR/new-android-ipdetector-1.2.0.aar"
+ cp "$LOGGER_AAR" "$PKG_DIR/new-android-logger-1.2.0.aar"
+
+ zip_dir "$PKG_DIR" "$DIST_DIR/httpdns-sdk-android-v${VERSION}.zip"
+
+ rm -f "$DIST_DIR/new--android-httpdns-v${VERSION}.aar"
+ rm -f "$DIST_DIR/httpdns-sdk-android.zip"
+ rm -rf "$ROOT/android/httpdns-sdk/build/outputs"
}
function build_ios_sdk_package() {
@@ -77,9 +102,12 @@ function build_ios_sdk_package() {
ensure_cmd zip
CANDIDATES=(
- "$ROOT/ios/dist/AlicloudHttpDNS.xcframework"
- "$ROOT/ios/AlicloudHttpDNS.xcframework"
- "$ROOT/ios/Build/AlicloudHttpDNS.xcframework"
+ "$ROOT/ios/dist/NewHttpDNS.xcframework"
+ "$ROOT/ios/NewHttpDNS.xcframework"
+ "$ROOT/ios/Build/NewHttpDNS.xcframework"
+ "$ROOT/ios/dist/NewHTTPDNS.xcframework"
+ "$ROOT/ios/NewHTTPDNS.xcframework"
+ "$ROOT/ios/Build/NewHTTPDNS.xcframework"
)
XCFRAMEWORK_DIR=""
@@ -92,7 +120,7 @@ function build_ios_sdk_package() {
if [ -z "$XCFRAMEWORK_DIR" ]; then
echo "ios xcframework not found."
- echo "please build it on macOS first, then place AlicloudHttpDNS.xcframework under EdgeHttpDNS/sdk/ios/dist/"
+ echo "please build it on macOS first, then place NewHttpDNS.xcframework under HttpDNSSDK/sdk/ios/dist/"
exit 1
fi
@@ -100,8 +128,8 @@ function build_ios_sdk_package() {
rm -rf "$PKG_DIR"
mkdir -p "$PKG_DIR"
cp -R "$XCFRAMEWORK_DIR" "$PKG_DIR/"
- if [ -f "$ROOT/ios/AlicloudHTTPDNS.podspec" ]; then
- cp "$ROOT/ios/AlicloudHTTPDNS.podspec" "$PKG_DIR/"
+ if [ -f "$ROOT/ios/NewHTTPDNS.podspec" ]; then
+ cp "$ROOT/ios/NewHTTPDNS.podspec" "$PKG_DIR/"
fi
if [ -f "$ROOT/ios/README.md" ]; then
cp "$ROOT/ios/README.md" "$PKG_DIR/README.md"
@@ -113,7 +141,7 @@ function build_ios_sdk_package() {
function build_flutter_sdk_package() {
echo "[sdk] packaging flutter plugin ..."
ensure_cmd zip
- PLUGIN_DIR="$ROOT/flutter/aliyun_httpdns"
+ PLUGIN_DIR="$ROOT/flutter/new_httpdns"
if [ ! -d "$PLUGIN_DIR" ]; then
echo "flutter plugin directory not found: $PLUGIN_DIR"
exit 1
@@ -123,7 +151,7 @@ function build_flutter_sdk_package() {
rm -rf "$PKG_DIR"
mkdir -p "$PKG_DIR"
cp -R "$PLUGIN_DIR" "$PKG_DIR/"
- rm -rf "$PKG_DIR/aliyun_httpdns/example/.dart_tool" "$PKG_DIR/aliyun_httpdns/example/build" "$PKG_DIR/aliyun_httpdns/.dart_tool" "$PKG_DIR/aliyun_httpdns/build"
+ rm -rf "$PKG_DIR/new_httpdns/example/.dart_tool" "$PKG_DIR/new_httpdns/example/build" "$PKG_DIR/new_httpdns/.dart_tool" "$PKG_DIR/new_httpdns/build"
zip_dir "$PKG_DIR" "$DIST_DIR/httpdns-sdk-flutter.zip"
}
@@ -137,7 +165,6 @@ function main() {
build_ios_sdk_package
build_flutter_sdk_package
- cp "$DIST_DIR/httpdns-sdk-android.zip" "$DIST_DIR/httpdns-sdk-android-v${VERSION}.zip"
cp "$DIST_DIR/httpdns-sdk-ios.zip" "$DIST_DIR/httpdns-sdk-ios-v${VERSION}.zip"
cp "$DIST_DIR/httpdns-sdk-flutter.zip" "$DIST_DIR/httpdns-sdk-flutter-v${VERSION}.zip"
@@ -146,4 +173,3 @@ function main() {
}
main "$@"
-
diff --git a/HttpDNSSDK/sdk/dist/httpdns-sdk-android-v1.0.0.zip b/HttpDNSSDK/sdk/dist/httpdns-sdk-android-v1.0.0.zip
new file mode 100644
index 0000000..6e48d4e
Binary files /dev/null and b/HttpDNSSDK/sdk/dist/httpdns-sdk-android-v1.0.0.zip differ
diff --git a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/CHANGELOG.md b/HttpDNSSDK/sdk/flutter/new_httpdns/CHANGELOG.md
similarity index 100%
rename from EdgeHttpDNS/sdk/flutter/aliyun_httpdns/CHANGELOG.md
rename to HttpDNSSDK/sdk/flutter/new_httpdns/CHANGELOG.md
diff --git a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/LICENSE b/HttpDNSSDK/sdk/flutter/new_httpdns/LICENSE
similarity index 96%
rename from EdgeHttpDNS/sdk/flutter/aliyun_httpdns/LICENSE
rename to HttpDNSSDK/sdk/flutter/new_httpdns/LICENSE
index 53987ab..b4f5825 100644
--- a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/LICENSE
+++ b/HttpDNSSDK/sdk/flutter/new_httpdns/LICENSE
@@ -1,6 +1,6 @@
MIT License
-Copyright (c) 2023 Alibaba Cloud
+Copyright (c) 2023 New Cloud
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
diff --git a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/README.md b/HttpDNSSDK/sdk/flutter/new_httpdns/README.md
similarity index 79%
rename from EdgeHttpDNS/sdk/flutter/aliyun_httpdns/README.md
rename to HttpDNSSDK/sdk/flutter/new_httpdns/README.md
index d7f747c..0ec7029 100644
--- a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/README.md
+++ b/HttpDNSSDK/sdk/flutter/new_httpdns/README.md
@@ -3,9 +3,9 @@
## 1. Initialization
```dart
-import 'package:aliyun_httpdns/aliyun_httpdns.dart';
+import 'package:new_httpdns/new_httpdns.dart';
-await AliyunHttpdns.init(
+await NewHttpdns.init(
appId: 'app1f1ndpo9',
primaryServiceHost: 'httpdns-a.example.com',
backupServiceHost: 'httpdns-b.example.com', // optional
@@ -13,14 +13,14 @@ await AliyunHttpdns.init(
secretKey: 'your-sign-secret', // optional if sign is enabled
);
-await AliyunHttpdns.setHttpsRequestEnabled(true);
-await AliyunHttpdns.build();
+await NewHttpdns.setHttpsRequestEnabled(true);
+await NewHttpdns.build();
```
## 2. Resolve
```dart
-final result = await AliyunHttpdns.resolveHostSyncNonBlocking(
+final result = await NewHttpdns.resolveHostSyncNonBlocking(
'api.business.com',
ipType: 'both',
);
@@ -32,8 +32,8 @@ final ipv6 = result['ipv6'] ?? [];
## 3. Official HTTP Adapter (IP + Host)
```dart
-final adapter = AliyunHttpdns.createHttpAdapter(
- options: const AliyunHttpdnsAdapterOptions(
+final adapter = NewHttpdns.createHttpAdapter(
+ options: const NewHttpdnsAdapterOptions(
ipType: 'auto',
connectTimeoutMs: 3000,
readTimeoutMs: 5000,
diff --git a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/analysis_options.yaml b/HttpDNSSDK/sdk/flutter/new_httpdns/analysis_options.yaml
similarity index 100%
rename from EdgeHttpDNS/sdk/flutter/aliyun_httpdns/analysis_options.yaml
rename to HttpDNSSDK/sdk/flutter/new_httpdns/analysis_options.yaml
diff --git a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/android/build.gradle b/HttpDNSSDK/sdk/flutter/new_httpdns/android/build.gradle
similarity index 83%
rename from EdgeHttpDNS/sdk/flutter/aliyun_httpdns/android/build.gradle
rename to HttpDNSSDK/sdk/flutter/new_httpdns/android/build.gradle
index b185de9..b85f233 100644
--- a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/android/build.gradle
+++ b/HttpDNSSDK/sdk/flutter/new_httpdns/android/build.gradle
@@ -4,7 +4,7 @@ plugins {
}
android {
- namespace 'com.aliyun.ams.httpdns'
+ namespace 'com.new.ams.httpdns'
compileSdkVersion 34
defaultConfig {
@@ -27,7 +27,7 @@ android {
dependencies {
implementation 'androidx.annotation:annotation:1.8.0'
- implementation 'com.aliyun.ams:alicloud-android-httpdns:2.6.7'
+ implementation 'com.new.ams:new-android-httpdns:2.6.7'
}
diff --git a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/android/consumer-rules.pro b/HttpDNSSDK/sdk/flutter/new_httpdns/android/consumer-rules.pro
similarity index 100%
rename from EdgeHttpDNS/sdk/flutter/aliyun_httpdns/android/consumer-rules.pro
rename to HttpDNSSDK/sdk/flutter/new_httpdns/android/consumer-rules.pro
diff --git a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/android/settings.gradle b/HttpDNSSDK/sdk/flutter/new_httpdns/android/settings.gradle
similarity index 100%
rename from EdgeHttpDNS/sdk/flutter/aliyun_httpdns/android/settings.gradle
rename to HttpDNSSDK/sdk/flutter/new_httpdns/android/settings.gradle
diff --git a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/android/src/main/AndroidManifest.xml b/HttpDNSSDK/sdk/flutter/new_httpdns/android/src/main/AndroidManifest.xml
similarity index 100%
rename from EdgeHttpDNS/sdk/flutter/aliyun_httpdns/android/src/main/AndroidManifest.xml
rename to HttpDNSSDK/sdk/flutter/new_httpdns/android/src/main/AndroidManifest.xml
diff --git a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/android/src/main/kotlin/com/aliyun/ams/httpdns/AliyunHttpDnsPlugin.kt b/HttpDNSSDK/sdk/flutter/new_httpdns/android/src/main/kotlin/com/new/ams/httpdns/NewHttpDnsPlugin.kt
similarity index 100%
rename from EdgeHttpDNS/sdk/flutter/aliyun_httpdns/android/src/main/kotlin/com/aliyun/ams/httpdns/AliyunHttpDnsPlugin.kt
rename to HttpDNSSDK/sdk/flutter/new_httpdns/android/src/main/kotlin/com/new/ams/httpdns/NewHttpDnsPlugin.kt
diff --git a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/README.md b/HttpDNSSDK/sdk/flutter/new_httpdns/example/README.md
similarity index 100%
rename from EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/README.md
rename to HttpDNSSDK/sdk/flutter/new_httpdns/example/README.md
diff --git a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/analysis_options.yaml b/HttpDNSSDK/sdk/flutter/new_httpdns/example/analysis_options.yaml
similarity index 100%
rename from EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/analysis_options.yaml
rename to HttpDNSSDK/sdk/flutter/new_httpdns/example/analysis_options.yaml
diff --git a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/android/app/build.gradle.kts b/HttpDNSSDK/sdk/flutter/new_httpdns/example/android/app/build.gradle.kts
similarity index 100%
rename from EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/android/app/build.gradle.kts
rename to HttpDNSSDK/sdk/flutter/new_httpdns/example/android/app/build.gradle.kts
diff --git a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/android/app/src/debug/AndroidManifest.xml b/HttpDNSSDK/sdk/flutter/new_httpdns/example/android/app/src/debug/AndroidManifest.xml
similarity index 100%
rename from EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/android/app/src/debug/AndroidManifest.xml
rename to HttpDNSSDK/sdk/flutter/new_httpdns/example/android/app/src/debug/AndroidManifest.xml
diff --git a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/android/app/src/main/AndroidManifest.xml b/HttpDNSSDK/sdk/flutter/new_httpdns/example/android/app/src/main/AndroidManifest.xml
similarity index 100%
rename from EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/android/app/src/main/AndroidManifest.xml
rename to HttpDNSSDK/sdk/flutter/new_httpdns/example/android/app/src/main/AndroidManifest.xml
diff --git a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/android/app/src/main/kotlin/com/example/httpdns_flutter_demo/MainActivity.kt b/HttpDNSSDK/sdk/flutter/new_httpdns/example/android/app/src/main/kotlin/com/example/httpdns_flutter_demo/MainActivity.kt
similarity index 100%
rename from EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/android/app/src/main/kotlin/com/example/httpdns_flutter_demo/MainActivity.kt
rename to HttpDNSSDK/sdk/flutter/new_httpdns/example/android/app/src/main/kotlin/com/example/httpdns_flutter_demo/MainActivity.kt
diff --git a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/android/app/src/main/res/drawable-v21/launch_background.xml b/HttpDNSSDK/sdk/flutter/new_httpdns/example/android/app/src/main/res/drawable-v21/launch_background.xml
similarity index 100%
rename from EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/android/app/src/main/res/drawable-v21/launch_background.xml
rename to HttpDNSSDK/sdk/flutter/new_httpdns/example/android/app/src/main/res/drawable-v21/launch_background.xml
diff --git a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/android/app/src/main/res/drawable/launch_background.xml b/HttpDNSSDK/sdk/flutter/new_httpdns/example/android/app/src/main/res/drawable/launch_background.xml
similarity index 100%
rename from EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/android/app/src/main/res/drawable/launch_background.xml
rename to HttpDNSSDK/sdk/flutter/new_httpdns/example/android/app/src/main/res/drawable/launch_background.xml
diff --git a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/HttpDNSSDK/sdk/flutter/new_httpdns/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
rename to HttpDNSSDK/sdk/flutter/new_httpdns/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
diff --git a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/HttpDNSSDK/sdk/flutter/new_httpdns/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
rename to HttpDNSSDK/sdk/flutter/new_httpdns/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
diff --git a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/HttpDNSSDK/sdk/flutter/new_httpdns/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
rename to HttpDNSSDK/sdk/flutter/new_httpdns/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
diff --git a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/HttpDNSSDK/sdk/flutter/new_httpdns/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
rename to HttpDNSSDK/sdk/flutter/new_httpdns/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/HttpDNSSDK/sdk/flutter/new_httpdns/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
rename to HttpDNSSDK/sdk/flutter/new_httpdns/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/android/app/src/main/res/values-night/styles.xml b/HttpDNSSDK/sdk/flutter/new_httpdns/example/android/app/src/main/res/values-night/styles.xml
similarity index 100%
rename from EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/android/app/src/main/res/values-night/styles.xml
rename to HttpDNSSDK/sdk/flutter/new_httpdns/example/android/app/src/main/res/values-night/styles.xml
diff --git a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/android/app/src/main/res/values/styles.xml b/HttpDNSSDK/sdk/flutter/new_httpdns/example/android/app/src/main/res/values/styles.xml
similarity index 100%
rename from EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/android/app/src/main/res/values/styles.xml
rename to HttpDNSSDK/sdk/flutter/new_httpdns/example/android/app/src/main/res/values/styles.xml
diff --git a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/android/app/src/profile/AndroidManifest.xml b/HttpDNSSDK/sdk/flutter/new_httpdns/example/android/app/src/profile/AndroidManifest.xml
similarity index 100%
rename from EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/android/app/src/profile/AndroidManifest.xml
rename to HttpDNSSDK/sdk/flutter/new_httpdns/example/android/app/src/profile/AndroidManifest.xml
diff --git a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/android/build.gradle.kts b/HttpDNSSDK/sdk/flutter/new_httpdns/example/android/build.gradle.kts
similarity index 100%
rename from EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/android/build.gradle.kts
rename to HttpDNSSDK/sdk/flutter/new_httpdns/example/android/build.gradle.kts
diff --git a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/android/gradle.properties b/HttpDNSSDK/sdk/flutter/new_httpdns/example/android/gradle.properties
similarity index 100%
rename from EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/android/gradle.properties
rename to HttpDNSSDK/sdk/flutter/new_httpdns/example/android/gradle.properties
diff --git a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/android/gradle/wrapper/gradle-wrapper.properties b/HttpDNSSDK/sdk/flutter/new_httpdns/example/android/gradle/wrapper/gradle-wrapper.properties
similarity index 100%
rename from EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/android/gradle/wrapper/gradle-wrapper.properties
rename to HttpDNSSDK/sdk/flutter/new_httpdns/example/android/gradle/wrapper/gradle-wrapper.properties
diff --git a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/android/settings.gradle.kts b/HttpDNSSDK/sdk/flutter/new_httpdns/example/android/settings.gradle.kts
similarity index 100%
rename from EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/android/settings.gradle.kts
rename to HttpDNSSDK/sdk/flutter/new_httpdns/example/android/settings.gradle.kts
diff --git a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/ios/Flutter/AppFrameworkInfo.plist b/HttpDNSSDK/sdk/flutter/new_httpdns/example/ios/Flutter/AppFrameworkInfo.plist
similarity index 100%
rename from EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/ios/Flutter/AppFrameworkInfo.plist
rename to HttpDNSSDK/sdk/flutter/new_httpdns/example/ios/Flutter/AppFrameworkInfo.plist
diff --git a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/ios/Flutter/Debug.xcconfig b/HttpDNSSDK/sdk/flutter/new_httpdns/example/ios/Flutter/Debug.xcconfig
similarity index 100%
rename from EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/ios/Flutter/Debug.xcconfig
rename to HttpDNSSDK/sdk/flutter/new_httpdns/example/ios/Flutter/Debug.xcconfig
diff --git a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/ios/Flutter/Release.xcconfig b/HttpDNSSDK/sdk/flutter/new_httpdns/example/ios/Flutter/Release.xcconfig
similarity index 100%
rename from EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/ios/Flutter/Release.xcconfig
rename to HttpDNSSDK/sdk/flutter/new_httpdns/example/ios/Flutter/Release.xcconfig
diff --git a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/ios/Podfile b/HttpDNSSDK/sdk/flutter/new_httpdns/example/ios/Podfile
similarity index 97%
rename from EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/ios/Podfile
rename to HttpDNSSDK/sdk/flutter/new_httpdns/example/ios/Podfile
index be9e8c6..63f0431 100644
--- a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/ios/Podfile
+++ b/HttpDNSSDK/sdk/flutter/new_httpdns/example/ios/Podfile
@@ -1,4 +1,4 @@
-# Add Aliyun specs as per official docs
+# Add New specs as per official docs
source 'https://github.com/CocoaPods/Specs.git'
source 'https://github.com/aliyun/aliyun-specs.git'
# Uncomment this line to define a global platform for your project
diff --git a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/ios/Runner.xcodeproj/project.pbxproj b/HttpDNSSDK/sdk/flutter/new_httpdns/example/ios/Runner.xcodeproj/project.pbxproj
similarity index 99%
rename from EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/ios/Runner.xcodeproj/project.pbxproj
rename to HttpDNSSDK/sdk/flutter/new_httpdns/example/ios/Runner.xcodeproj/project.pbxproj
index a799745..c83df0a 100644
--- a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/ios/Runner.xcodeproj/project.pbxproj
+++ b/HttpDNSSDK/sdk/flutter/new_httpdns/example/ios/Runner.xcodeproj/project.pbxproj
@@ -461,7 +461,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
- PRODUCT_BUNDLE_IDENTIFIER = com.aliyun.emasdemo.httpdns;
+ PRODUCT_BUNDLE_IDENTIFIER = com.new.emasdemo.httpdns;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
"PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = EMAS_HTTPDNS_IOS_DEMO_DEV;
@@ -648,7 +648,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
- PRODUCT_BUNDLE_IDENTIFIER = com.aliyun.emasdemo.httpdns;
+ PRODUCT_BUNDLE_IDENTIFIER = com.new.emasdemo.httpdns;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
"PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = EMAS_HTTPDNS_IOS_DEMO_DEV;
@@ -675,7 +675,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
- PRODUCT_BUNDLE_IDENTIFIER = com.aliyun.emasdemo.httpdns;
+ PRODUCT_BUNDLE_IDENTIFIER = com.new.emasdemo.httpdns;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
"PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = EMAS_HTTPDNS_IOS_DEMO_DEV;
diff --git a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/HttpDNSSDK/sdk/flutter/new_httpdns/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
similarity index 100%
rename from EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
rename to HttpDNSSDK/sdk/flutter/new_httpdns/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
diff --git a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/HttpDNSSDK/sdk/flutter/new_httpdns/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
similarity index 100%
rename from EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
rename to HttpDNSSDK/sdk/flutter/new_httpdns/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
diff --git a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/HttpDNSSDK/sdk/flutter/new_httpdns/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
similarity index 100%
rename from EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
rename to HttpDNSSDK/sdk/flutter/new_httpdns/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
diff --git a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/HttpDNSSDK/sdk/flutter/new_httpdns/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
similarity index 100%
rename from EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
rename to HttpDNSSDK/sdk/flutter/new_httpdns/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
diff --git a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/ios/Runner.xcworkspace/contents.xcworkspacedata b/HttpDNSSDK/sdk/flutter/new_httpdns/example/ios/Runner.xcworkspace/contents.xcworkspacedata
similarity index 100%
rename from EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/ios/Runner.xcworkspace/contents.xcworkspacedata
rename to HttpDNSSDK/sdk/flutter/new_httpdns/example/ios/Runner.xcworkspace/contents.xcworkspacedata
diff --git a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/HttpDNSSDK/sdk/flutter/new_httpdns/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
similarity index 100%
rename from EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
rename to HttpDNSSDK/sdk/flutter/new_httpdns/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
diff --git a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/HttpDNSSDK/sdk/flutter/new_httpdns/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
similarity index 100%
rename from EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
rename to HttpDNSSDK/sdk/flutter/new_httpdns/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
diff --git a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/ios/Runner/AppDelegate.swift b/HttpDNSSDK/sdk/flutter/new_httpdns/example/ios/Runner/AppDelegate.swift
similarity index 100%
rename from EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/ios/Runner/AppDelegate.swift
rename to HttpDNSSDK/sdk/flutter/new_httpdns/example/ios/Runner/AppDelegate.swift
diff --git a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/HttpDNSSDK/sdk/flutter/new_httpdns/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
similarity index 100%
rename from EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
rename to HttpDNSSDK/sdk/flutter/new_httpdns/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
diff --git a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/HttpDNSSDK/sdk/flutter/new_httpdns/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png
similarity index 100%
rename from EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png
rename to HttpDNSSDK/sdk/flutter/new_httpdns/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png
diff --git a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/HttpDNSSDK/sdk/flutter/new_httpdns/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png
similarity index 100%
rename from EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png
rename to HttpDNSSDK/sdk/flutter/new_httpdns/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png
diff --git a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/HttpDNSSDK/sdk/flutter/new_httpdns/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png
similarity index 100%
rename from EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png
rename to HttpDNSSDK/sdk/flutter/new_httpdns/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png
diff --git a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/HttpDNSSDK/sdk/flutter/new_httpdns/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png
similarity index 100%
rename from EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png
rename to HttpDNSSDK/sdk/flutter/new_httpdns/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png
diff --git a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/HttpDNSSDK/sdk/flutter/new_httpdns/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png
similarity index 100%
rename from EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png
rename to HttpDNSSDK/sdk/flutter/new_httpdns/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png
diff --git a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/HttpDNSSDK/sdk/flutter/new_httpdns/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png
similarity index 100%
rename from EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png
rename to HttpDNSSDK/sdk/flutter/new_httpdns/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png
diff --git a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/HttpDNSSDK/sdk/flutter/new_httpdns/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png
similarity index 100%
rename from EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png
rename to HttpDNSSDK/sdk/flutter/new_httpdns/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png
diff --git a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/HttpDNSSDK/sdk/flutter/new_httpdns/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png
similarity index 100%
rename from EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png
rename to HttpDNSSDK/sdk/flutter/new_httpdns/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png
diff --git a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/HttpDNSSDK/sdk/flutter/new_httpdns/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png
similarity index 100%
rename from EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png
rename to HttpDNSSDK/sdk/flutter/new_httpdns/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png
diff --git a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/HttpDNSSDK/sdk/flutter/new_httpdns/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png
similarity index 100%
rename from EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png
rename to HttpDNSSDK/sdk/flutter/new_httpdns/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png
diff --git a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/HttpDNSSDK/sdk/flutter/new_httpdns/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png
similarity index 100%
rename from EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png
rename to HttpDNSSDK/sdk/flutter/new_httpdns/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png
diff --git a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/HttpDNSSDK/sdk/flutter/new_httpdns/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png
similarity index 100%
rename from EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png
rename to HttpDNSSDK/sdk/flutter/new_httpdns/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png
diff --git a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/HttpDNSSDK/sdk/flutter/new_httpdns/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png
similarity index 100%
rename from EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png
rename to HttpDNSSDK/sdk/flutter/new_httpdns/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png
diff --git a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/HttpDNSSDK/sdk/flutter/new_httpdns/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png
similarity index 100%
rename from EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png
rename to HttpDNSSDK/sdk/flutter/new_httpdns/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png
diff --git a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/HttpDNSSDK/sdk/flutter/new_httpdns/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png
similarity index 100%
rename from EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png
rename to HttpDNSSDK/sdk/flutter/new_httpdns/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png
diff --git a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/HttpDNSSDK/sdk/flutter/new_httpdns/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json
similarity index 100%
rename from EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json
rename to HttpDNSSDK/sdk/flutter/new_httpdns/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json
diff --git a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/HttpDNSSDK/sdk/flutter/new_httpdns/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png
similarity index 100%
rename from EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png
rename to HttpDNSSDK/sdk/flutter/new_httpdns/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png
diff --git a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/HttpDNSSDK/sdk/flutter/new_httpdns/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png
similarity index 100%
rename from EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png
rename to HttpDNSSDK/sdk/flutter/new_httpdns/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png
diff --git a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/HttpDNSSDK/sdk/flutter/new_httpdns/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png
similarity index 100%
rename from EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png
rename to HttpDNSSDK/sdk/flutter/new_httpdns/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png
diff --git a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/HttpDNSSDK/sdk/flutter/new_httpdns/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md
similarity index 100%
rename from EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md
rename to HttpDNSSDK/sdk/flutter/new_httpdns/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md
diff --git a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/ios/Runner/Base.lproj/LaunchScreen.storyboard b/HttpDNSSDK/sdk/flutter/new_httpdns/example/ios/Runner/Base.lproj/LaunchScreen.storyboard
similarity index 100%
rename from EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/ios/Runner/Base.lproj/LaunchScreen.storyboard
rename to HttpDNSSDK/sdk/flutter/new_httpdns/example/ios/Runner/Base.lproj/LaunchScreen.storyboard
diff --git a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/ios/Runner/Base.lproj/Main.storyboard b/HttpDNSSDK/sdk/flutter/new_httpdns/example/ios/Runner/Base.lproj/Main.storyboard
similarity index 100%
rename from EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/ios/Runner/Base.lproj/Main.storyboard
rename to HttpDNSSDK/sdk/flutter/new_httpdns/example/ios/Runner/Base.lproj/Main.storyboard
diff --git a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/ios/Runner/Info.plist b/HttpDNSSDK/sdk/flutter/new_httpdns/example/ios/Runner/Info.plist
similarity index 100%
rename from EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/ios/Runner/Info.plist
rename to HttpDNSSDK/sdk/flutter/new_httpdns/example/ios/Runner/Info.plist
diff --git a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/ios/Runner/Runner-Bridging-Header.h b/HttpDNSSDK/sdk/flutter/new_httpdns/example/ios/Runner/Runner-Bridging-Header.h
similarity index 100%
rename from EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/ios/Runner/Runner-Bridging-Header.h
rename to HttpDNSSDK/sdk/flutter/new_httpdns/example/ios/Runner/Runner-Bridging-Header.h
diff --git a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/ios/RunnerTests/RunnerTests.swift b/HttpDNSSDK/sdk/flutter/new_httpdns/example/ios/RunnerTests/RunnerTests.swift
similarity index 100%
rename from EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/ios/RunnerTests/RunnerTests.swift
rename to HttpDNSSDK/sdk/flutter/new_httpdns/example/ios/RunnerTests/RunnerTests.swift
diff --git a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/lib/main.dart b/HttpDNSSDK/sdk/flutter/new_httpdns/example/lib/main.dart
similarity index 100%
rename from EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/lib/main.dart
rename to HttpDNSSDK/sdk/flutter/new_httpdns/example/lib/main.dart
diff --git a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/lib/net/httpdns_http_client_adapter.dart b/HttpDNSSDK/sdk/flutter/new_httpdns/example/lib/net/httpdns_http_client_adapter.dart
similarity index 100%
rename from EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/lib/net/httpdns_http_client_adapter.dart
rename to HttpDNSSDK/sdk/flutter/new_httpdns/example/lib/net/httpdns_http_client_adapter.dart
diff --git a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/pubspec.lock b/HttpDNSSDK/sdk/flutter/new_httpdns/example/pubspec.lock
similarity index 99%
rename from EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/pubspec.lock
rename to HttpDNSSDK/sdk/flutter/new_httpdns/example/pubspec.lock
index 3b6c82e..12b6458 100644
--- a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/pubspec.lock
+++ b/HttpDNSSDK/sdk/flutter/new_httpdns/example/pubspec.lock
@@ -1,7 +1,7 @@
# Generated by pub
# See https://dart.dev/tools/pub/glossary#lockfile
packages:
- aliyun_httpdns:
+ new_httpdns:
dependency: "direct main"
description:
path: ".."
diff --git a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/pubspec.yaml b/HttpDNSSDK/sdk/flutter/new_httpdns/example/pubspec.yaml
similarity index 78%
rename from EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/pubspec.yaml
rename to HttpDNSSDK/sdk/flutter/new_httpdns/example/pubspec.yaml
index 141dd79..4d8c613 100644
--- a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/example/pubspec.yaml
+++ b/HttpDNSSDK/sdk/flutter/new_httpdns/example/pubspec.yaml
@@ -1,5 +1,5 @@
-name: aliyun_httpdns_example
-description: "Demonstrates how to use the aliyun_httpdns plugin."
+name: new_httpdns_example
+description: "Demonstrates how to use the new_httpdns plugin."
publish_to: 'none'
environment:
@@ -8,9 +8,9 @@ environment:
dependencies:
flutter:
sdk: flutter
- aliyun_httpdns:
+ new_httpdns:
# When depending on this package from a real application you should use:
- # aliyun_httpdns: ^x.y.z
+ # new_httpdns: ^x.y.z
# The example app is bundled with the plugin so we use a path dependency on
# the parent directory to use the current plugin's version.
path: ../
diff --git a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/ios/Classes/HttpdnsPlugin.swift b/HttpDNSSDK/sdk/flutter/new_httpdns/ios/Classes/HttpdnsPlugin.swift
similarity index 95%
rename from EdgeHttpDNS/sdk/flutter/aliyun_httpdns/ios/Classes/HttpdnsPlugin.swift
rename to HttpDNSSDK/sdk/flutter/new_httpdns/ios/Classes/HttpdnsPlugin.swift
index 7e7d76b..a53db3f 100644
--- a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/ios/Classes/HttpdnsPlugin.swift
+++ b/HttpDNSSDK/sdk/flutter/new_httpdns/ios/Classes/HttpdnsPlugin.swift
@@ -3,7 +3,7 @@ import Foundation
import UIKit
import CommonCrypto
-public class AliyunHttpDnsPlugin: NSObject, FlutterPlugin {
+public class NewHttpDnsPlugin: NSObject, FlutterPlugin {
private var appId: String?
private var secretKey: String?
private var primaryServiceHost: String?
@@ -20,8 +20,8 @@ public class AliyunHttpDnsPlugin: NSObject, FlutterPlugin {
}()
public static func register(with registrar: FlutterPluginRegistrar) {
- let channel = FlutterMethodChannel(name: "aliyun_httpdns", binaryMessenger: registrar.messenger())
- let instance = AliyunHttpDnsPlugin()
+ let channel = FlutterMethodChannel(name: "new_httpdns", binaryMessenger: registrar.messenger())
+ let instance = NewHttpDnsPlugin()
registrar.addMethodCallDelegate(instance, channel: channel)
}
@@ -84,10 +84,10 @@ public class AliyunHttpDnsPlugin: NSObject, FlutterPlugin {
case "build":
if desiredHttpsEnabled == false {
- NSLog("AliyunHttpDns(iOS): HTTPS is required by current protocol, force enabled")
+ NSLog("NewHttpDns(iOS): HTTPS is required by current protocol, force enabled")
}
if desiredLogEnabled == true {
- NSLog("AliyunHttpDns(iOS): build success, appId=\(appId ?? "")")
+ NSLog("NewHttpDns(iOS): build success, appId=\(appId ?? "")")
}
result(appId != nil && primaryServiceHost != nil)
@@ -227,7 +227,7 @@ public class AliyunHttpDnsPlugin: NSObject, FlutterPlugin {
if let error = error {
if self?.desiredLogEnabled == true {
- NSLog("AliyunHttpDns(iOS): resolve request failed host=\(serviceHost), err=\(error.localizedDescription)")
+ NSLog("NewHttpDns(iOS): resolve request failed host=\(serviceHost), err=\(error.localizedDescription)")
}
attempt(index + 1)
return
diff --git a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/ios/aliyun_httpdns.podspec b/HttpDNSSDK/sdk/flutter/new_httpdns/ios/new_httpdns.podspec
similarity index 73%
rename from EdgeHttpDNS/sdk/flutter/aliyun_httpdns/ios/aliyun_httpdns.podspec
rename to HttpDNSSDK/sdk/flutter/new_httpdns/ios/new_httpdns.podspec
index 11c2b19..9168ad0 100644
--- a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/ios/aliyun_httpdns.podspec
+++ b/HttpDNSSDK/sdk/flutter/new_httpdns/ios/new_httpdns.podspec
@@ -1,16 +1,16 @@
# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html.
-# Run `pod lib lint aliyun_httpdns.podspec` to validate before publishing.
+# Run `pod lib lint new_httpdns.podspec` to validate before publishing.
#
Pod::Spec.new do |s|
- s.name = 'aliyun_httpdns'
+ s.name = 'new_httpdns'
s.version = '1.0.0'
- s.summary = 'aliyun httpdns flutter plugin'
+ s.summary = 'new httpdns flutter plugin'
s.description = <<-DESC
-aliyun httpdns flutter plugin.
+new httpdns flutter plugin.
DESC
s.homepage = 'https://help.aliyun.com/document_detail/435220.html'
s.license = { :file => '../LICENSE' }
- s.author = { 'Aliyun' => 'httpdns@alibaba-inc.com' }
+ s.author = { 'New' => 'httpdns@alibaba-inc.com' }
s.source = { :path => '.' }
s.source_files = 'Classes/**/*'
s.public_header_files = 'Classes/**/*.h'
@@ -25,7 +25,7 @@ DESC
# required reason APIs, update the PrivacyInfo.xcprivacy file to describe your
# plugin's privacy impact, and then uncomment this line. For more information,
# see https://developer.apple.com/documentation/bundleresources/privacy_manifest_files
- # s.resource_bundles = {'aliyun_httpdns_privacy' => ['Resources/PrivacyInfo.xcprivacy']}
+ # s.resource_bundles = {'new_httpdns_privacy' => ['Resources/PrivacyInfo.xcprivacy']}
end
diff --git a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/lib/aliyun_httpdns.dart b/HttpDNSSDK/sdk/flutter/new_httpdns/lib/new_httpdns.dart
similarity index 100%
rename from EdgeHttpDNS/sdk/flutter/aliyun_httpdns/lib/aliyun_httpdns.dart
rename to HttpDNSSDK/sdk/flutter/new_httpdns/lib/new_httpdns.dart
diff --git a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/pubspec.lock b/HttpDNSSDK/sdk/flutter/new_httpdns/pubspec.lock
similarity index 100%
rename from EdgeHttpDNS/sdk/flutter/aliyun_httpdns/pubspec.lock
rename to HttpDNSSDK/sdk/flutter/new_httpdns/pubspec.lock
diff --git a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/pubspec.yaml b/HttpDNSSDK/sdk/flutter/new_httpdns/pubspec.yaml
similarity index 92%
rename from EdgeHttpDNS/sdk/flutter/aliyun_httpdns/pubspec.yaml
rename to HttpDNSSDK/sdk/flutter/new_httpdns/pubspec.yaml
index b1c37b1..ab4cc24 100644
--- a/EdgeHttpDNS/sdk/flutter/aliyun_httpdns/pubspec.yaml
+++ b/HttpDNSSDK/sdk/flutter/new_httpdns/pubspec.yaml
@@ -1,5 +1,5 @@
-name: aliyun_httpdns
-description: "Aliyun HTTPDNS Flutter plugin."
+name: new_httpdns
+description: "New HTTPDNS Flutter plugin."
version: 1.0.0
homepage: https://help.aliyun.com/document_detail/2584339.html
@@ -35,10 +35,10 @@ flutter:
plugin:
platforms:
android:
- package: com.aliyun.ams.httpdns
- pluginClass: AliyunHttpDnsPlugin
+ package: com.new.ams.httpdns
+ pluginClass: NewHttpDnsPlugin
ios:
- pluginClass: AliyunHttpDnsPlugin
+ pluginClass: NewHttpDnsPlugin
# To add assets to your plugin package, add an assets section, like this:
# assets:
diff --git a/EdgeHttpDNS/sdk/ios/CLAUDE.md b/HttpDNSSDK/sdk/ios/CLAUDE.md
similarity index 85%
rename from EdgeHttpDNS/sdk/ios/CLAUDE.md
rename to HttpDNSSDK/sdk/ios/CLAUDE.md
index 32cf173..97c247a 100644
--- a/EdgeHttpDNS/sdk/ios/CLAUDE.md
+++ b/HttpDNSSDK/sdk/ios/CLAUDE.md
@@ -9,10 +9,10 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
pod install
# Build SDK (Release configuration)
-xcodebuild -workspace AlicloudHttpDNS.xcworkspace -scheme AlicloudHttpDNS -configuration Release build
+xcodebuild -workspace NewHttpDNS.xcworkspace -scheme NewHttpDNS -configuration Release build
# Run all unit tests
-xcodebuild test -workspace AlicloudHttpDNS.xcworkspace -scheme AlicloudHttpDNSTests -destination 'platform=iOS Simulator,name=iPhone 15'
+xcodebuild test -workspace NewHttpDNS.xcworkspace -scheme NewHttpDNSTests -destination 'platform=iOS Simulator,name=iPhone 15'
# Build distributable XCFramework
sh build_xc_framework.sh
@@ -52,7 +52,7 @@ This is an iOS HTTPDNS SDK with a multi-layered architecture designed for secure
- Exposed by `HttpdnsRemoteResolver` for DNS resolution requests
**4. DNS Resolution Layer**
-- **`HttpdnsRemoteResolver`**: HTTPS/HTTP requests to Alicloud servers
+- **`HttpdnsRemoteResolver`**: HTTPS/HTTP requests to New servers
- Builds authenticated requests with HMAC-SHA256 signatures
- Optional AES-CBC encryption for sensitive parameters
- Parses JSON responses into `HttpdnsHostObject` (IPv4/IPv6)
@@ -68,23 +68,23 @@ This is an iOS HTTPDNS SDK with a multi-layered architecture designed for secure
**6. Data Flow (Synchronous Resolution)**
```
User Request
- → Validate & wrap in HttpdnsRequest
- → Check memory cache (valid? return)
- → Load from SQLite DB (valid? return)
- → HttpdnsRemoteResolver
+ ?Validate & wrap in HttpdnsRequest
+ ?Check memory cache (valid? return)
+ ?Load from SQLite DB (valid? return)
+ ?HttpdnsRemoteResolver
- Build URL with auth (HMAC-SHA256)
- Encrypt params if enabled (AES-CBC)
- Send to service endpoint
- Parse JSON response
- Decrypt if needed
- → Cache in memory + DB
- → Return HttpdnsResult
+ ?Cache in memory + DB
+ ?Return HttpdnsResult
On Failure:
- → Retry with different endpoint (max 1 retry)
- → Return expired IP (if setReuseExpiredIPEnabled:YES)
- → Fall back to local DNS (if setDegradeToLocalDNSEnabled:YES)
- → Return nil
+ ?Retry with different endpoint (max 1 retry)
+ ?Return expired IP (if setReuseExpiredIPEnabled:YES)
+ ?Fall back to local DNS (if setDegradeToLocalDNSEnabled:YES)
+ ?Return nil
```
### Authentication & Encryption
@@ -128,7 +128,7 @@ On Failure:
- Comments in Chinese, only for complex logic explaining WHY
**Naming:**
-- Types/files: `UpperCamelCase` (e.g., `AlicloudHttpDNSClient.h`)
+- Types/files: `UpperCamelCase` (e.g., `NewHttpDNSClient.h`)
- Methods/variables: `lowerCamelCase`
- Constants: `kAC...` prefix
- Internal headers: `+Internal.h` suffix
@@ -140,13 +140,13 @@ On Failure:
## Testing Notes
-- Test target: `AlicloudHttpDNSTests`
+- Test target: `NewHttpDNSTests`
- OCMock-based tests may have memory issues when run in batch - run individually if needed
- Non-mock tests use predefined credentials:
- Account ID: `1000000`
- Test domains: `*.onlyforhttpdnstest.run.place` (renewed annually)
- Never commit real production Account IDs or Secret Keys
-- Test file naming mirrors class under test (e.g., `AlicloudHttpDNSClientTests.m`)
+- Test file naming mirrors class under test (e.g., `NewHttpDNSClientTests.m`)
- Network layer integration tests organized into 5 focused modules:
- `HttpdnsNWHTTPClient_BasicIntegrationTests.m`: Basic HTTP/HTTPS requests
- `HttpdnsNWHTTPClient_ConcurrencyTests.m`: Thread safety and concurrent access
@@ -161,9 +161,9 @@ On Failure:
- Separate endpoint pools, caches, and configurations per account
**Public vs Internal Headers:**
-- Public headers listed in `AlicloudHTTPDNS.podspec` under `public_header_files`
+- Public headers listed in `NewHTTPDNS.podspec` under `public_header_files`
- Internal headers use `+Internal.h` suffix and are not exposed
-- Umbrella header: `AlicloudHttpDNS.h` imports all public APIs
+- Umbrella header: `NewHttpDNS.h` imports all public APIs
**Required System Frameworks:**
- `CoreTelephony`, `SystemConfiguration`, `Network` (for HTTP transport)
@@ -173,7 +173,7 @@ On Failure:
**Pre-Resolution Strategy:**
- Call `setPreResolveHosts:byIPType:` at app startup for hot domains
-- Automatically re-triggered on network changes (WiFi ↔ cellular)
+- Automatically re-triggered on network changes (WiFi ?cellular)
- Batch requests combine multiple hosts in single HTTP call
**Persistence & Cache:**
diff --git a/HttpDNSSDK/sdk/ios/NewHTTPDNS.podspec b/HttpDNSSDK/sdk/ios/NewHTTPDNS.podspec
new file mode 100644
index 0000000..2f2721d
--- /dev/null
+++ b/HttpDNSSDK/sdk/ios/NewHTTPDNS.podspec
@@ -0,0 +1,46 @@
+Pod::Spec.new do |s|
+ s.name = "NewHTTPDNS"
+ s.version = "1.0.0"
+ s.summary = "New Mobile Service HTTPDNS iOS SDK (source distribution)."
+ s.description = <<-DESC
+ HTTPDNS iOS SDK 源码分发版本,提供通过 HTTP(S) 进行域名解析? IPv4/IPv6 支持、鉴权签名、可选参数加密、内存与 SQLite 持久化缓存? 区域调度与降级到本地解析等能力? DESC
+
+ s.homepage = "https://www.aliyun.com/product/httpdns"
+ s.authors = { "zhouzhuo" => "yecan.xyc@alibaba-inc.com" }
+
+ # 注意:发布到 Specs 仓库前,请将 git 地址指向正式仓库并按版本?tag
+ s.source = { :git => "https://github.com/aliyun/alibabacloud-httpdns-ios-sdk", :tag => s.version.to_s }
+
+ s.platform = :ios, "12.0"
+ s.requires_arc = true
+
+ # 以源码方式集成,仅收?SDK 源码目录
+ s.source_files = "NewHttpDNS/**/*.{h,m}"
+
+ # 资源:隐私清? s.resources = "resource/PrivacyInfo.xcprivacy"
+
+ # 公开头文件(?umbrella 头导入的稳定接口? s.public_header_files = [
+ "NewHttpDNS/NewHttpDNS.h",
+ "NewHttpDNS/HttpdnsService.h",
+ "NewHttpDNS/HttpdnsEdgeService.h",
+ "NewHttpDNS/Model/HttpdnsResult.h",
+ "NewHttpDNS/Model/HttpdnsRequest.h",
+ "NewHttpDNS/Log/HttpdnsLog.h",
+ "NewHttpDNS/Log/HttpdnsLoggerProtocol.h",
+ "NewHttpDNS/HttpdnsDegradationDelegate.h",
+ "NewHttpDNS/Config/HttpdnsPublicConstant.h",
+ "NewHttpDNS/IpStack/HttpdnsIpStackDetector.h"
+ ]
+
+ # 系统库与框架
+ s.frameworks = ["CoreTelephony", "SystemConfiguration"]
+ s.libraries = ["sqlite3.0", "resolv", "z"]
+
+ # 链接器参数:保留 Objective‑C 分类
+ s.pod_target_xcconfig = {
+ 'OTHER_LDFLAGS' => '$(inherited) -ObjC'
+ }
+ s.user_target_xcconfig = {
+ 'OTHER_LDFLAGS' => '$(inherited) -ObjC'
+ }
+end
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNS.xcodeproj/project.pbxproj b/HttpDNSSDK/sdk/ios/NewHttpDNS.xcodeproj/project.pbxproj
similarity index 91%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNS.xcodeproj/project.pbxproj
rename to HttpDNSSDK/sdk/ios/NewHttpDNS.xcodeproj/project.pbxproj
index 2c8df50..4bd9589 100644
--- a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNS.xcodeproj/project.pbxproj
+++ b/HttpDNSSDK/sdk/ios/NewHttpDNS.xcodeproj/project.pbxproj
@@ -1,4 +1,4 @@
-// !$*UTF8*$!
+// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
@@ -7,12 +7,12 @@
objects = {
/* Begin PBXBuildFile section */
- 2197CAC31BC7B3D400BDB65B /* AlicloudHttpDNS.h in Headers */ = {isa = PBXBuildFile; fileRef = 2197CAB11BC7B3D400BDB65B /* AlicloudHttpDNS.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 2197CAC31BC7B3D400BDB65B /* NewHttpDNS.h in Headers */ = {isa = PBXBuildFile; fileRef = 2197CAB11BC7B3D400BDB65B /* NewHttpDNS.h */; settings = {ATTRIBUTES = (Public, ); }; };
2197CAC71BC7B3D400BDB65B /* HttpdnsLog.m in Sources */ = {isa = PBXBuildFile; fileRef = 2197CAB51BC7B3D400BDB65B /* HttpdnsLog.m */; };
2197CACB1BC7B3D400BDB65B /* HttpdnsRemoteResolver.m in Sources */ = {isa = PBXBuildFile; fileRef = 2197CAB91BC7B3D400BDB65B /* HttpdnsRemoteResolver.m */; };
2197CACD1BC7B3D400BDB65B /* HttpdnsRequestManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 2197CABB1BC7B3D400BDB65B /* HttpdnsRequestManager.m */; };
2197CAD11BC7B3D400BDB65B /* HttpdnsUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = 2197CABF1BC7B3D400BDB65B /* HttpdnsUtil.m */; };
- 38E5518686E44C8C6B2E4DAD /* Pods_AlicloudHttpDNSTestDemo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C735B35937A5C5BCDE1B3DE7 /* Pods_AlicloudHttpDNSTestDemo.framework */; };
+ 38E5518686E44C8C6B2E4DAD /* Pods_NewHttpDNSTestDemo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C735B35937A5C5BCDE1B3DE7 /* Pods_NewHttpDNSTestDemo.framework */; };
4A36B63821C9EE9C00B1D008 /* HttpdnsLoggerProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = 4A36B63721C9EDA500B1D008 /* HttpdnsLoggerProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; };
4AF4AB6C211439A800D712DF /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4AF4AB6B211439A800D712DF /* Assets.xcassets */; };
4AF4AB6F211439A800D712DF /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 4AF4AB6D211439A800D712DF /* LaunchScreen.storyboard */; };
@@ -58,7 +58,7 @@
947E5BEC2C0075B800123579 /* HttpdnsLog.h in Headers */ = {isa = PBXBuildFile; fileRef = 2197CAB41BC7B3D400BDB65B /* HttpdnsLog.h */; };
947E5BED2C0075B800123579 /* HttpdnsLog_Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 4A36B63A21C9EFF100B1D008 /* HttpdnsLog_Internal.h */; };
947E5BEE2C0075B800123579 /* HttpdnsLoggerProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = 4A36B63721C9EDA500B1D008 /* HttpdnsLoggerProtocol.h */; };
- 947E5C032C00760200123579 /* AlicloudHttpDNS.h in Headers */ = {isa = PBXBuildFile; fileRef = 2197CAB11BC7B3D400BDB65B /* AlicloudHttpDNS.h */; };
+ 947E5C032C00760200123579 /* NewHttpDNS.h in Headers */ = {isa = PBXBuildFile; fileRef = 2197CAB11BC7B3D400BDB65B /* NewHttpDNS.h */; };
947E5C042C00760200123579 /* HttpdnsInternalConstant.h in Headers */ = {isa = PBXBuildFile; fileRef = 2197CAB21BC7B3D400BDB65B /* HttpdnsInternalConstant.h */; };
947E5C052C00760200123579 /* HttpdnsRemoteResolver.h in Headers */ = {isa = PBXBuildFile; fileRef = 2197CAB81BC7B3D400BDB65B /* HttpdnsRemoteResolver.h */; };
947E5C062C00760200123579 /* HttpdnsRequestManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 2197CABA1BC7B3D400BDB65B /* HttpdnsRequestManager.h */; };
@@ -145,7 +145,7 @@
9AA0FC711EB9AFB700E242DD /* HttpdnsHostRecord.m in Sources */ = {isa = PBXBuildFile; fileRef = 9AA0FC6F1EB9AFB700E242DD /* HttpdnsHostRecord.m */; };
9AF9A5FE1EC4CFCF0018063B /* HttpdnsHostRecord.m in Sources */ = {isa = PBXBuildFile; fileRef = 9AA0FC6F1EB9AFB700E242DD /* HttpdnsHostRecord.m */; };
9AF9A60E1EC4D2EA0018063B /* libsqlite3.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 9AF9A60D1EC4D2EA0018063B /* libsqlite3.tbd */; };
- B5EA18ABF0EB32054A9C07FD /* Pods_AlicloudHttpDNSTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 15FD19FB9D27F0491A62B730 /* Pods_AlicloudHttpDNSTests.framework */; };
+ B5EA18ABF0EB32054A9C07FD /* Pods_NewHttpDNSTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 15FD19FB9D27F0491A62B730 /* Pods_NewHttpDNSTests.framework */; };
CB1E4EE82A8CBD1B00F01EAC /* HttpDnsLocker.m in Sources */ = {isa = PBXBuildFile; fileRef = CB1E4EE72A8CBD1B00F01EAC /* HttpDnsLocker.m */; };
D1F0A12345ABCDEFFEDCBA03 /* DemoLogViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D1F0A12345ABCDEFFEDCBA02 /* DemoLogViewController.m */; };
E7B6D6A9251E4820B3C7C9A7 /* DemoViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E7B6D6A1251E4820B3C7C9A2 /* DemoViewController.m */; };
@@ -154,10 +154,10 @@
/* End PBXBuildFile section */
/* Begin PBXFileReference section */
- 15FD19FB9D27F0491A62B730 /* Pods_AlicloudHttpDNSTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_AlicloudHttpDNSTests.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ 15FD19FB9D27F0491A62B730 /* Pods_NewHttpDNSTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_NewHttpDNSTests.framework; sourceTree = BUILT_PRODUCTS_DIR; };
2197CA3C1BC79A4500BDB65B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
2197CA481BC79A4500BDB65B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
- 2197CAB11BC7B3D400BDB65B /* AlicloudHttpDNS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AlicloudHttpDNS.h; sourceTree = ""; };
+ 2197CAB11BC7B3D400BDB65B /* NewHttpDNS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NewHttpDNS.h; sourceTree = ""; };
2197CAB21BC7B3D400BDB65B /* HttpdnsInternalConstant.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HttpdnsInternalConstant.h; sourceTree = ""; };
2197CAB41BC7B3D400BDB65B /* HttpdnsLog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HttpdnsLog.h; sourceTree = ""; };
2197CAB51BC7B3D400BDB65B /* HttpdnsLog.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HttpdnsLog.m; sourceTree = ""; };
@@ -177,9 +177,9 @@
4AF4AB71211439A800D712DF /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; };
4AF4AB95211439F900D712DF /* libresolv.9.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libresolv.9.tbd; path = usr/lib/libresolv.9.tbd; sourceTree = SDKROOT; };
4AF4AB9821143A3800D712DF /* libz.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libz.tbd; path = usr/lib/libz.tbd; sourceTree = SDKROOT; };
- 736ADE601256D763536B1414 /* Pods-AlicloudHttpDNSTestDemo.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AlicloudHttpDNSTestDemo.release.xcconfig"; path = "Target Support Files/Pods-AlicloudHttpDNSTestDemo/Pods-AlicloudHttpDNSTestDemo.release.xcconfig"; sourceTree = ""; };
+ 736ADE601256D763536B1414 /* Pods-NewHttpDNSTestDemo.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NewHttpDNSTestDemo.release.xcconfig"; path = "Target Support Files/Pods-NewHttpDNSTestDemo/Pods-NewHttpDNSTestDemo.release.xcconfig"; sourceTree = ""; };
7EB5412B2BD5FBFB001DFF47 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = PrivacyInfo.xcprivacy; sourceTree = ""; };
- 880B3002B636BE24B549C85C /* Pods-AlicloudHttpDNSTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AlicloudHttpDNSTests.debug.xcconfig"; path = "Target Support Files/Pods-AlicloudHttpDNSTests/Pods-AlicloudHttpDNSTests.debug.xcconfig"; sourceTree = ""; };
+ 880B3002B636BE24B549C85C /* Pods-NewHttpDNSTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NewHttpDNSTests.debug.xcconfig"; path = "Target Support Files/Pods-NewHttpDNSTests/Pods-NewHttpDNSTests.debug.xcconfig"; sourceTree = ""; };
94008EE42E9222D800C86EFB /* DemoConfig.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = DemoConfig.plist; sourceTree = ""; };
940585122D85AC9C001FEB15 /* HttpdnsDB.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = HttpdnsDB.h; sourceTree = ""; };
940585132D85AC9C001FEB15 /* HttpdnsDB.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = HttpdnsDB.m; sourceTree = ""; };
@@ -256,22 +256,22 @@
9AA0FC6E1EB9AFB700E242DD /* HttpdnsHostRecord.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HttpdnsHostRecord.h; sourceTree = ""; };
9AA0FC6F1EB9AFB700E242DD /* HttpdnsHostRecord.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HttpdnsHostRecord.m; sourceTree = ""; };
9AF9A60D1EC4D2EA0018063B /* libsqlite3.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libsqlite3.tbd; path = usr/lib/libsqlite3.tbd; sourceTree = SDKROOT; };
- C735B35937A5C5BCDE1B3DE7 /* Pods_AlicloudHttpDNSTestDemo.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_AlicloudHttpDNSTestDemo.framework; sourceTree = BUILT_PRODUCTS_DIR; };
- CB1E4EE32A8CA91800F01EAC /* AlicloudHttpDNS.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = AlicloudHttpDNS.framework; sourceTree = BUILT_PRODUCTS_DIR; };
- CB1E4EE42A8CA91800F01EAC /* AlicloudHttpDNS.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = AlicloudHttpDNS.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
- CB1E4EE52A8CA91800F01EAC /* AlicloudHttpDNSTestDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = AlicloudHttpDNSTestDemo.app; sourceTree = BUILT_PRODUCTS_DIR; };
+ C735B35937A5C5BCDE1B3DE7 /* Pods_NewHttpDNSTestDemo.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_NewHttpDNSTestDemo.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ CB1E4EE32A8CA91800F01EAC /* NewHttpDNS.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = NewHttpDNS.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ CB1E4EE42A8CA91800F01EAC /* NewHttpDNS.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = NewHttpDNS.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
+ CB1E4EE52A8CA91800F01EAC /* NewHttpDNSTestDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = NewHttpDNSTestDemo.app; sourceTree = BUILT_PRODUCTS_DIR; };
CB1E4EE62A8CBAD700F01EAC /* HttpDnsLocker.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = HttpDnsLocker.h; sourceTree = ""; };
CB1E4EE72A8CBD1B00F01EAC /* HttpDnsLocker.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = HttpDnsLocker.m; sourceTree = ""; };
D1F0A12345ABCDEFFEDCBA01 /* DemoLogViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DemoLogViewController.h; sourceTree = ""; };
D1F0A12345ABCDEFFEDCBA02 /* DemoLogViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DemoLogViewController.m; sourceTree = ""; };
- DF6C39232D0C2F2330C76410 /* Pods-AlicloudHttpDNSTestDemo.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AlicloudHttpDNSTestDemo.debug.xcconfig"; path = "Target Support Files/Pods-AlicloudHttpDNSTestDemo/Pods-AlicloudHttpDNSTestDemo.debug.xcconfig"; sourceTree = ""; };
+ DF6C39232D0C2F2330C76410 /* Pods-NewHttpDNSTestDemo.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NewHttpDNSTestDemo.debug.xcconfig"; path = "Target Support Files/Pods-NewHttpDNSTestDemo/Pods-NewHttpDNSTestDemo.debug.xcconfig"; sourceTree = ""; };
E7B6D6A0251E4820B3C7C9A1 /* DemoViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DemoViewController.h; sourceTree = ""; };
E7B6D6A1251E4820B3C7C9A2 /* DemoViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DemoViewController.m; sourceTree = ""; };
E7B6D6A2251E4820B3C7C9A3 /* DemoResolveModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DemoResolveModel.h; sourceTree = ""; };
E7B6D6A3251E4820B3C7C9A4 /* DemoResolveModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DemoResolveModel.m; sourceTree = ""; };
E7B6D6A4251E4820B3C7C9A5 /* DemoConfigLoader.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DemoConfigLoader.h; sourceTree = ""; };
E7B6D6A5251E4820B3C7C9A6 /* DemoConfigLoader.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DemoConfigLoader.m; sourceTree = ""; };
- FC445B4FBD1F2B33996BA0EF /* Pods-AlicloudHttpDNSTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AlicloudHttpDNSTests.release.xcconfig"; path = "Target Support Files/Pods-AlicloudHttpDNSTests/Pods-AlicloudHttpDNSTests.release.xcconfig"; sourceTree = ""; };
+ FC445B4FBD1F2B33996BA0EF /* Pods-NewHttpDNSTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NewHttpDNSTests.release.xcconfig"; path = "Target Support Files/Pods-NewHttpDNSTests/Pods-NewHttpDNSTests.release.xcconfig"; sourceTree = ""; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@@ -288,7 +288,7 @@
files = (
9AF9A60E1EC4D2EA0018063B /* libsqlite3.tbd in Frameworks */,
945914121CEB5D9C00D95CF7 /* libresolv.tbd in Frameworks */,
- B5EA18ABF0EB32054A9C07FD /* Pods_AlicloudHttpDNSTests.framework in Frameworks */,
+ B5EA18ABF0EB32054A9C07FD /* Pods_NewHttpDNSTests.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -296,7 +296,7 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
- 38E5518686E44C8C6B2E4DAD /* Pods_AlicloudHttpDNSTestDemo.framework in Frameworks */,
+ 38E5518686E44C8C6B2E4DAD /* Pods_NewHttpDNSTestDemo.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -308,18 +308,18 @@
children = (
7EB5412C2BD5FBFB001DFF47 /* resource */,
945914111CEB5D9C00D95CF7 /* libresolv.tbd */,
- 2197CA391BC79A4500BDB65B /* AlicloudHttpDNS */,
- 2197CA451BC79A4500BDB65B /* AlicloudHttpDNSTests */,
- 4AF4AB61211439A600D712DF /* AlicloudHttpDNSTestDemo */,
+ 2197CA391BC79A4500BDB65B /* NewHttpDNS */,
+ 2197CA451BC79A4500BDB65B /* NewHttpDNSTests */,
+ 4AF4AB61211439A600D712DF /* NewHttpDNSTestDemo */,
4AF5AB801DCB32D600206DD8 /* Frameworks */,
- CB1E4EE32A8CA91800F01EAC /* AlicloudHttpDNS.framework */,
- CB1E4EE42A8CA91800F01EAC /* AlicloudHttpDNS.xctest */,
- CB1E4EE52A8CA91800F01EAC /* AlicloudHttpDNSTestDemo.app */,
+ CB1E4EE32A8CA91800F01EAC /* NewHttpDNS.framework */,
+ CB1E4EE42A8CA91800F01EAC /* NewHttpDNS.xctest */,
+ CB1E4EE52A8CA91800F01EAC /* NewHttpDNSTestDemo.app */,
F9586D08E3A988B948DFF1AC /* Pods */,
);
sourceTree = "";
};
- 2197CA391BC79A4500BDB65B /* AlicloudHttpDNS */ = {
+ 2197CA391BC79A4500BDB65B /* NewHttpDNS */ = {
isa = PBXGroup;
children = (
940585352D87425A001FEB15 /* Scheduler */,
@@ -330,7 +330,7 @@
9406FDA92C19AA8F0003CB6A /* Persistent */,
94A96AE62EAC89C1005538BD /* Network */,
9AA0FC591EB9843A00E242DD /* Utils */,
- 2197CAB11BC7B3D400BDB65B /* AlicloudHttpDNS.h */,
+ 2197CAB11BC7B3D400BDB65B /* NewHttpDNS.h */,
94A0146F2BF38F410018B096 /* HttpdnsService_Internal.h */,
94A0146E2BF38F410018B096 /* HttpdnsService.h */,
94A0146D2BF38F410018B096 /* HttpdnsService.m */,
@@ -343,10 +343,10 @@
942376A51C572AD300736E50 /* HttpdnsDegradationDelegate.h */,
2197CA3C1BC79A4500BDB65B /* Info.plist */,
);
- path = AlicloudHttpDNS;
+ path = NewHttpDNS;
sourceTree = "";
};
- 2197CA451BC79A4500BDB65B /* AlicloudHttpDNSTests */ = {
+ 2197CA451BC79A4500BDB65B /* NewHttpDNSTests */ = {
isa = PBXGroup;
children = (
947E5BE52C0074EF00123579 /* Testbase */,
@@ -357,7 +357,7 @@
947E5C1A2C008E0000123579 /* HighLevelTest */,
2197CA481BC79A4500BDB65B /* Info.plist */,
);
- path = AlicloudHttpDNSTests;
+ path = NewHttpDNSTests;
sourceTree = "";
};
4A36B63621C9ED7B00B1D008 /* Log */ = {
@@ -371,7 +371,7 @@
path = Log;
sourceTree = "";
};
- 4AF4AB61211439A600D712DF /* AlicloudHttpDNSTestDemo */ = {
+ 4AF4AB61211439A600D712DF /* NewHttpDNSTestDemo */ = {
isa = PBXGroup;
children = (
94008EE42E9222D800C86EFB /* DemoConfig.plist */,
@@ -392,7 +392,7 @@
D1F0A12345ABCDEFFEDCBA01 /* DemoLogViewController.h */,
D1F0A12345ABCDEFFEDCBA02 /* DemoLogViewController.m */,
);
- path = AlicloudHttpDNSTestDemo;
+ path = NewHttpDNSTestDemo;
sourceTree = "";
};
4AF5AB801DCB32D600206DD8 /* Frameworks */ = {
@@ -401,8 +401,8 @@
4AF4AB9821143A3800D712DF /* libz.tbd */,
4AF4AB95211439F900D712DF /* libresolv.9.tbd */,
9AF9A60D1EC4D2EA0018063B /* libsqlite3.tbd */,
- C735B35937A5C5BCDE1B3DE7 /* Pods_AlicloudHttpDNSTestDemo.framework */,
- 15FD19FB9D27F0491A62B730 /* Pods_AlicloudHttpDNSTests.framework */,
+ C735B35937A5C5BCDE1B3DE7 /* Pods_NewHttpDNSTestDemo.framework */,
+ 15FD19FB9D27F0491A62B730 /* Pods_NewHttpDNSTests.framework */,
);
name = Frameworks;
sourceTree = "";
@@ -463,7 +463,7 @@
9A5914811EA0815D00A7ED28 /* HttpdnsPersistenceUtils.m */,
);
name = Persistent;
- path = AlicloudHttpDNS/Persistent;
+ path = NewHttpDNS/Persistent;
sourceTree = SOURCE_ROOT;
};
947E5BE52C0074EF00123579 /* Testbase */ = {
@@ -580,10 +580,10 @@
F9586D08E3A988B948DFF1AC /* Pods */ = {
isa = PBXGroup;
children = (
- DF6C39232D0C2F2330C76410 /* Pods-AlicloudHttpDNSTestDemo.debug.xcconfig */,
- 736ADE601256D763536B1414 /* Pods-AlicloudHttpDNSTestDemo.release.xcconfig */,
- 880B3002B636BE24B549C85C /* Pods-AlicloudHttpDNSTests.debug.xcconfig */,
- FC445B4FBD1F2B33996BA0EF /* Pods-AlicloudHttpDNSTests.release.xcconfig */,
+ DF6C39232D0C2F2330C76410 /* Pods-NewHttpDNSTestDemo.debug.xcconfig */,
+ 736ADE601256D763536B1414 /* Pods-NewHttpDNSTestDemo.release.xcconfig */,
+ 880B3002B636BE24B549C85C /* Pods-NewHttpDNSTests.debug.xcconfig */,
+ FC445B4FBD1F2B33996BA0EF /* Pods-NewHttpDNSTests.release.xcconfig */,
);
path = Pods;
sourceTree = "";
@@ -614,7 +614,7 @@
948DA4E42C1EAA8200D81682 /* HttpdnsRegionConfigLoader.h in Headers */,
94F3D0612EB4BDCB0039304A /* HttpdnsNWReusableConnection.h in Headers */,
94F3D0622EB4BDCB0039304A /* HttpdnsNWHTTPClient_Internal.h in Headers */,
- 2197CAC31BC7B3D400BDB65B /* AlicloudHttpDNS.h in Headers */,
+ 2197CAC31BC7B3D400BDB65B /* NewHttpDNS.h in Headers */,
942376DE1C5764CF00736E50 /* HttpdnsDegradationDelegate.h in Headers */,
943FA4222BF9D4FA0006F169 /* HttpdnsHostObject.h in Headers */,
940585162D85AC9C001FEB15 /* HttpdnsDB.h in Headers */,
@@ -627,7 +627,7 @@
isa = PBXHeadersBuildPhase;
buildActionMask = 2147483647;
files = (
- 947E5C032C00760200123579 /* AlicloudHttpDNS.h in Headers */,
+ 947E5C032C00760200123579 /* NewHttpDNS.h in Headers */,
947E5C042C00760200123579 /* HttpdnsInternalConstant.h in Headers */,
947E5C052C00760200123579 /* HttpdnsRemoteResolver.h in Headers */,
947E5C062C00760200123579 /* HttpdnsRequestManager.h in Headers */,
@@ -666,9 +666,9 @@
/* End PBXHeadersBuildPhase section */
/* Begin PBXNativeTarget section */
- 2197CA361BC79A4500BDB65B /* AlicloudHttpDNS */ = {
+ 2197CA361BC79A4500BDB65B /* NewHttpDNS */ = {
isa = PBXNativeTarget;
- buildConfigurationList = 2197CA4B1BC79A4500BDB65B /* Build configuration list for PBXNativeTarget "AlicloudHttpDNS" */;
+ buildConfigurationList = 2197CA4B1BC79A4500BDB65B /* Build configuration list for PBXNativeTarget "NewHttpDNS" */;
buildPhases = (
2197CA321BC79A4500BDB65B /* Sources */,
2197CA331BC79A4500BDB65B /* Frameworks */,
@@ -679,14 +679,14 @@
);
dependencies = (
);
- name = AlicloudHttpDNS;
- productName = AlicloudHttpDNS;
- productReference = CB1E4EE32A8CA91800F01EAC /* AlicloudHttpDNS.framework */;
+ name = NewHttpDNS;
+ productName = NewHttpDNS;
+ productReference = CB1E4EE32A8CA91800F01EAC /* NewHttpDNS.framework */;
productType = "com.apple.product-type.framework";
};
- 2197CA401BC79A4500BDB65B /* AlicloudHttpDNSTests */ = {
+ 2197CA401BC79A4500BDB65B /* NewHttpDNSTests */ = {
isa = PBXNativeTarget;
- buildConfigurationList = 2197CA4E1BC79A4500BDB65B /* Build configuration list for PBXNativeTarget "AlicloudHttpDNSTests" */;
+ buildConfigurationList = 2197CA4E1BC79A4500BDB65B /* Build configuration list for PBXNativeTarget "NewHttpDNSTests" */;
buildPhases = (
CB08CC05A673E0217F2D1764 /* [CP] Check Pods Manifest.lock */,
947E5BE62C0075A100123579 /* Headers */,
@@ -699,14 +699,14 @@
);
dependencies = (
);
- name = AlicloudHttpDNSTests;
- productName = AlicloudHttpDNSTests;
- productReference = CB1E4EE42A8CA91800F01EAC /* AlicloudHttpDNS.xctest */;
+ name = NewHttpDNSTests;
+ productName = NewHttpDNSTests;
+ productReference = CB1E4EE42A8CA91800F01EAC /* NewHttpDNS.xctest */;
productType = "com.apple.product-type.bundle.unit-test";
};
- 4AF4AB5F211439A600D712DF /* AlicloudHttpDNSTestDemo */ = {
+ 4AF4AB5F211439A600D712DF /* NewHttpDNSTestDemo */ = {
isa = PBXNativeTarget;
- buildConfigurationList = 4AF4AB73211439A800D712DF /* Build configuration list for PBXNativeTarget "AlicloudHttpDNSTestDemo" */;
+ buildConfigurationList = 4AF4AB73211439A800D712DF /* Build configuration list for PBXNativeTarget "NewHttpDNSTestDemo" */;
buildPhases = (
41239A110EEBCD18330CB6A1 /* [CP] Check Pods Manifest.lock */,
4AF4AB5C211439A600D712DF /* Sources */,
@@ -718,9 +718,9 @@
);
dependencies = (
);
- name = AlicloudHttpDNSTestDemo;
- productName = AlicloudHttpDNSTestDemo;
- productReference = CB1E4EE52A8CA91800F01EAC /* AlicloudHttpDNSTestDemo.app */;
+ name = NewHttpDNSTestDemo;
+ productName = NewHttpDNSTestDemo;
+ productReference = CB1E4EE52A8CA91800F01EAC /* NewHttpDNSTestDemo.app */;
productType = "com.apple.product-type.application";
};
/* End PBXNativeTarget section */
@@ -731,7 +731,7 @@
attributes = {
BuildIndependentTargetsInParallel = YES;
LastUpgradeCheck = 2600;
- ORGANIZATIONNAME = "alibaba-inc.com";
+ ORGANIZATIONNAME = "new-inc.com";
TargetAttributes = {
2197CA361BC79A4500BDB65B = {
CreatedOnToolsVersion = 7.0.1;
@@ -745,7 +745,7 @@
};
};
};
- buildConfigurationList = 2197CA311BC79A4500BDB65B /* Build configuration list for PBXProject "AlicloudHttpDNS" */;
+ buildConfigurationList = 2197CA311BC79A4500BDB65B /* Build configuration list for PBXProject "NewHttpDNS" */;
compatibilityVersion = "Xcode 3.2";
developmentRegion = en;
hasScannedForEncodings = 0;
@@ -759,9 +759,9 @@
projectDirPath = "";
projectRoot = "";
targets = (
- 2197CA361BC79A4500BDB65B /* AlicloudHttpDNS */,
- 2197CA401BC79A4500BDB65B /* AlicloudHttpDNSTests */,
- 4AF4AB5F211439A600D712DF /* AlicloudHttpDNSTestDemo */,
+ 2197CA361BC79A4500BDB65B /* NewHttpDNS */,
+ 2197CA401BC79A4500BDB65B /* NewHttpDNSTests */,
+ 4AF4AB5F211439A600D712DF /* NewHttpDNSTestDemo */,
);
};
/* End PBXProject section */
@@ -814,7 +814,7 @@
outputFileListPaths = (
);
outputPaths = (
- "$(DERIVED_FILE_DIR)/Pods-AlicloudHttpDNSTestDemo-checkManifestLockResult.txt",
+ "$(DERIVED_FILE_DIR)/Pods-NewHttpDNSTestDemo-checkManifestLockResult.txt",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
@@ -827,7 +827,7 @@
files = (
);
inputPaths = (
- "${PODS_ROOT}/Target Support Files/Pods-AlicloudHttpDNSTests/Pods-AlicloudHttpDNSTests-frameworks.sh",
+ "${PODS_ROOT}/Target Support Files/Pods-NewHttpDNSTests/Pods-NewHttpDNSTests-frameworks.sh",
"${BUILT_PRODUCTS_DIR}/OCMock/OCMock.framework",
);
name = "[CP] Embed Pods Frameworks";
@@ -836,7 +836,7 @@
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
- shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-AlicloudHttpDNSTests/Pods-AlicloudHttpDNSTests-frameworks.sh\"\n";
+ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-NewHttpDNSTests/Pods-NewHttpDNSTests-frameworks.sh\"\n";
showEnvVarsInLog = 0;
};
C0D8ED0FD919DFFA6EF96EB7 /* [CP] Embed Pods Frameworks */ = {
@@ -845,16 +845,16 @@
files = (
);
inputPaths = (
- "${PODS_ROOT}/Target Support Files/Pods-AlicloudHttpDNSTestDemo/Pods-AlicloudHttpDNSTestDemo-frameworks.sh",
- "${BUILT_PRODUCTS_DIR}/AlicloudHTTPDNS/AlicloudHTTPDNS.framework",
+ "${PODS_ROOT}/Target Support Files/Pods-NewHttpDNSTestDemo/Pods-NewHttpDNSTestDemo-frameworks.sh",
+ "${BUILT_PRODUCTS_DIR}/NewHTTPDNS/NewHTTPDNS.framework",
);
name = "[CP] Embed Pods Frameworks";
outputPaths = (
- "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/AlicloudHTTPDNS.framework",
+ "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/NewHTTPDNS.framework",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
- shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-AlicloudHttpDNSTestDemo/Pods-AlicloudHttpDNSTestDemo-frameworks.sh\"\n";
+ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-NewHttpDNSTestDemo/Pods-NewHttpDNSTestDemo-frameworks.sh\"\n";
showEnvVarsInLog = 0;
};
CB08CC05A673E0217F2D1764 /* [CP] Check Pods Manifest.lock */ = {
@@ -872,7 +872,7 @@
outputFileListPaths = (
);
outputPaths = (
- "$(DERIVED_FILE_DIR)/Pods-AlicloudHttpDNSTests-checkManifestLockResult.txt",
+ "$(DERIVED_FILE_DIR)/Pods-NewHttpDNSTests-checkManifestLockResult.txt",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
@@ -1123,7 +1123,7 @@
FRAMEWORK_SEARCH_PATHS = "$(inherited)";
GCC_GENERATE_TEST_COVERAGE_FILES = NO;
GCC_PREPROCESSOR_DEFINITIONS = "DEBUG=1";
- INFOPLIST_FILE = "$(SRCROOT)/AlicloudHttpDNS/Info.plist";
+ INFOPLIST_FILE = "$(SRCROOT)/NewHttpDNS/Info.plist";
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
LD_RUNPATH_SEARCH_PATHS = (
@@ -1139,8 +1139,8 @@
"$(inherited)",
"-ObjC",
);
- PRODUCT_BUNDLE_IDENTIFIER = com.alibaba.sdk.ios.AlicloudHttpDNS;
- PRODUCT_NAME = AlicloudHttpDNS;
+ PRODUCT_BUNDLE_IDENTIFIER = com.new.sdk.ios.NewHttpDNS;
+ PRODUCT_NAME = NewHttpDNS;
SKIP_INSTALL = YES;
SUPPORTS_MACCATALYST = YES;
};
@@ -1163,7 +1163,7 @@
FRAMEWORK_SEARCH_PATHS = "$(inherited)";
GCC_GENERATE_TEST_COVERAGE_FILES = NO;
GCC_PREPROCESSOR_DEFINITIONS = "$(inherited)";
- INFOPLIST_FILE = "$(SRCROOT)/AlicloudHttpDNS/Info.plist";
+ INFOPLIST_FILE = "$(SRCROOT)/NewHttpDNS/Info.plist";
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
LD_RUNPATH_SEARCH_PATHS = (
@@ -1178,8 +1178,8 @@
"$(inherited)",
"-ObjC",
);
- PRODUCT_BUNDLE_IDENTIFIER = com.alibaba.sdk.ios.AlicloudHttpDNS;
- PRODUCT_NAME = AlicloudHttpDNS;
+ PRODUCT_BUNDLE_IDENTIFIER = com.new.sdk.ios.NewHttpDNS;
+ PRODUCT_NAME = NewHttpDNS;
SKIP_INSTALL = YES;
SUPPORTS_MACCATALYST = YES;
};
@@ -1187,7 +1187,7 @@
};
2197CA4F1BC79A4500BDB65B /* Debug */ = {
isa = XCBuildConfiguration;
- baseConfigurationReference = 880B3002B636BE24B549C85C /* Pods-AlicloudHttpDNSTests.debug.xcconfig */;
+ baseConfigurationReference = 880B3002B636BE24B549C85C /* Pods-NewHttpDNSTests.debug.xcconfig */;
buildSettings = {
COMPILER_INDEX_STORE_ENABLE = NO;
ENABLE_USER_SCRIPT_SANDBOXING = NO;
@@ -1198,7 +1198,7 @@
GCC_GENERATE_TEST_COVERAGE_FILES = NO;
GCC_INSTRUMENT_PROGRAM_FLOW_ARCS = YES;
GCC_PREFIX_HEADER = "";
- INFOPLIST_FILE = AlicloudHttpDNSTests/Info.plist;
+ INFOPLIST_FILE = NewHttpDNSTests/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
@@ -1211,14 +1211,14 @@
"-ObjC",
"-lz",
);
- PRODUCT_BUNDLE_IDENTIFIER = com.alibaba.sdk.ios.AlicloudHttpDNSTests;
- PRODUCT_NAME = AlicloudHttpDNS;
+ PRODUCT_BUNDLE_IDENTIFIER = com.new.sdk.ios.NewHttpDNSTests;
+ PRODUCT_NAME = NewHttpDNS;
};
name = Debug;
};
2197CA501BC79A4500BDB65B /* Release */ = {
isa = XCBuildConfiguration;
- baseConfigurationReference = FC445B4FBD1F2B33996BA0EF /* Pods-AlicloudHttpDNSTests.release.xcconfig */;
+ baseConfigurationReference = FC445B4FBD1F2B33996BA0EF /* Pods-NewHttpDNSTests.release.xcconfig */;
buildSettings = {
COMPILER_INDEX_STORE_ENABLE = NO;
ENABLE_USER_SCRIPT_SANDBOXING = NO;
@@ -1229,7 +1229,7 @@
GCC_GENERATE_TEST_COVERAGE_FILES = NO;
GCC_INSTRUMENT_PROGRAM_FLOW_ARCS = YES;
GCC_PREFIX_HEADER = "";
- INFOPLIST_FILE = AlicloudHttpDNSTests/Info.plist;
+ INFOPLIST_FILE = NewHttpDNSTests/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
@@ -1242,14 +1242,14 @@
"-ObjC",
"-lz",
);
- PRODUCT_BUNDLE_IDENTIFIER = com.alibaba.sdk.ios.AlicloudHttpDNSTests;
- PRODUCT_NAME = AlicloudHttpDNS;
+ PRODUCT_BUNDLE_IDENTIFIER = com.new.sdk.ios.NewHttpDNSTests;
+ PRODUCT_NAME = NewHttpDNS;
};
name = Release;
};
4AF4AB74211439A800D712DF /* Debug */ = {
isa = XCBuildConfiguration;
- baseConfigurationReference = DF6C39232D0C2F2330C76410 /* Pods-AlicloudHttpDNSTestDemo.debug.xcconfig */;
+ baseConfigurationReference = DF6C39232D0C2F2330C76410 /* Pods-NewHttpDNSTestDemo.debug.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ANALYZER_NONNULL = YES;
@@ -1275,7 +1275,7 @@
"$(PROJECT_DIR)",
);
GCC_C_LANGUAGE_STANDARD = gnu11;
- INFOPLIST_FILE = AlicloudHttpDNSTestDemo/Info.plist;
+ INFOPLIST_FILE = NewHttpDNSTestDemo/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
@@ -1285,7 +1285,7 @@
"$(inherited)",
"-ObjC",
);
- PRODUCT_BUNDLE_IDENTIFIER = com.aliyun.emas.pocdemo;
+ PRODUCT_BUNDLE_IDENTIFIER = com.new.emas.pocdemo;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
TARGETED_DEVICE_FAMILY = "1,2";
@@ -1294,7 +1294,7 @@
};
4AF4AB75211439A800D712DF /* Release */ = {
isa = XCBuildConfiguration;
- baseConfigurationReference = 736ADE601256D763536B1414 /* Pods-AlicloudHttpDNSTestDemo.release.xcconfig */;
+ baseConfigurationReference = 736ADE601256D763536B1414 /* Pods-NewHttpDNSTestDemo.release.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ANALYZER_NONNULL = YES;
@@ -1320,7 +1320,7 @@
"$(PROJECT_DIR)",
);
GCC_C_LANGUAGE_STANDARD = gnu11;
- INFOPLIST_FILE = AlicloudHttpDNSTestDemo/Info.plist;
+ INFOPLIST_FILE = NewHttpDNSTestDemo/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
@@ -1330,7 +1330,7 @@
"$(inherited)",
"-ObjC",
);
- PRODUCT_BUNDLE_IDENTIFIER = com.aliyun.emas.pocdemo;
+ PRODUCT_BUNDLE_IDENTIFIER = com.new.emas.pocdemo;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
TARGETED_DEVICE_FAMILY = "1,2";
@@ -1340,7 +1340,7 @@
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
- 2197CA311BC79A4500BDB65B /* Build configuration list for PBXProject "AlicloudHttpDNS" */ = {
+ 2197CA311BC79A4500BDB65B /* Build configuration list for PBXProject "NewHttpDNS" */ = {
isa = XCConfigurationList;
buildConfigurations = (
2197CA491BC79A4500BDB65B /* Debug */,
@@ -1349,7 +1349,7 @@
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
- 2197CA4B1BC79A4500BDB65B /* Build configuration list for PBXNativeTarget "AlicloudHttpDNS" */ = {
+ 2197CA4B1BC79A4500BDB65B /* Build configuration list for PBXNativeTarget "NewHttpDNS" */ = {
isa = XCConfigurationList;
buildConfigurations = (
2197CA4C1BC79A4500BDB65B /* Debug */,
@@ -1358,7 +1358,7 @@
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
- 2197CA4E1BC79A4500BDB65B /* Build configuration list for PBXNativeTarget "AlicloudHttpDNSTests" */ = {
+ 2197CA4E1BC79A4500BDB65B /* Build configuration list for PBXNativeTarget "NewHttpDNSTests" */ = {
isa = XCConfigurationList;
buildConfigurations = (
2197CA4F1BC79A4500BDB65B /* Debug */,
@@ -1367,7 +1367,7 @@
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
- 4AF4AB73211439A800D712DF /* Build configuration list for PBXNativeTarget "AlicloudHttpDNSTestDemo" */ = {
+ 4AF4AB73211439A800D712DF /* Build configuration list for PBXNativeTarget "NewHttpDNSTestDemo" */ = {
isa = XCConfigurationList;
buildConfigurations = (
4AF4AB74211439A800D712DF /* Debug */,
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNS.xcodeproj/xcshareddata/xcschemes/AlicloudHttpDNS.xcscheme b/HttpDNSSDK/sdk/ios/NewHttpDNS.xcodeproj/xcshareddata/xcschemes/NewHttpDNS.xcscheme
similarity index 81%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNS.xcodeproj/xcshareddata/xcschemes/AlicloudHttpDNS.xcscheme
rename to HttpDNSSDK/sdk/ios/NewHttpDNS.xcodeproj/xcshareddata/xcschemes/NewHttpDNS.xcscheme
index a930bed..f1f4b71 100644
--- a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNS.xcodeproj/xcshareddata/xcschemes/AlicloudHttpDNS.xcscheme
+++ b/HttpDNSSDK/sdk/ios/NewHttpDNS.xcodeproj/xcshareddata/xcschemes/NewHttpDNS.xcscheme
@@ -15,9 +15,9 @@
+ BuildableName = "NewHttpDNS.framework"
+ BlueprintName = "NewHttpDNS"
+ ReferencedContainer = "container:NewHttpDNS.xcodeproj">
@@ -45,9 +45,9 @@
+ BuildableName = "NewHttpDNS.framework"
+ BlueprintName = "NewHttpDNS"
+ ReferencedContainer = "container:NewHttpDNS.xcodeproj">
@@ -61,9 +61,9 @@
+ BuildableName = "NewHttpDNS.framework"
+ BlueprintName = "NewHttpDNS"
+ ReferencedContainer = "container:NewHttpDNS.xcodeproj">
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNS.xcodeproj/xcshareddata/xcschemes/AlicloudHttpDNSTestDemo.xcscheme b/HttpDNSSDK/sdk/ios/NewHttpDNS.xcodeproj/xcshareddata/xcschemes/NewHttpDNSTestDemo.xcscheme
similarity index 80%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNS.xcodeproj/xcshareddata/xcschemes/AlicloudHttpDNSTestDemo.xcscheme
rename to HttpDNSSDK/sdk/ios/NewHttpDNS.xcodeproj/xcshareddata/xcschemes/NewHttpDNSTestDemo.xcscheme
index edb78df..fe84250 100644
--- a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNS.xcodeproj/xcshareddata/xcschemes/AlicloudHttpDNSTestDemo.xcscheme
+++ b/HttpDNSSDK/sdk/ios/NewHttpDNS.xcodeproj/xcshareddata/xcschemes/NewHttpDNSTestDemo.xcscheme
@@ -15,9 +15,9 @@
+ BuildableName = "NewHttpDNSTestDemo.app"
+ BlueprintName = "NewHttpDNSTestDemo"
+ ReferencedContainer = "container:NewHttpDNS.xcodeproj">
@@ -45,9 +45,9 @@
+ BuildableName = "NewHttpDNSTestDemo.app"
+ BlueprintName = "NewHttpDNSTestDemo"
+ ReferencedContainer = "container:NewHttpDNS.xcodeproj">
@@ -62,9 +62,9 @@
+ BuildableName = "NewHttpDNSTestDemo.app"
+ BlueprintName = "NewHttpDNSTestDemo"
+ ReferencedContainer = "container:NewHttpDNS.xcodeproj">
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNS.xcodeproj/xcshareddata/xcschemes/AlicloudHttpDNSTests.xcscheme b/HttpDNSSDK/sdk/ios/NewHttpDNS.xcodeproj/xcshareddata/xcschemes/NewHttpDNSTests.xcscheme
similarity index 81%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNS.xcodeproj/xcshareddata/xcschemes/AlicloudHttpDNSTests.xcscheme
rename to HttpDNSSDK/sdk/ios/NewHttpDNS.xcodeproj/xcshareddata/xcschemes/NewHttpDNSTests.xcscheme
index c04d051..322e224 100644
--- a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNS.xcodeproj/xcshareddata/xcschemes/AlicloudHttpDNSTests.xcscheme
+++ b/HttpDNSSDK/sdk/ios/NewHttpDNS.xcodeproj/xcshareddata/xcschemes/NewHttpDNSTests.xcscheme
@@ -15,9 +15,9 @@
+ BuildableName = "NewHttpDNS.xctest"
+ BlueprintName = "NewHttpDNSTests"
+ ReferencedContainer = "container:NewHttpDNS.xcodeproj">
@@ -34,9 +34,9 @@
+ BuildableName = "NewHttpDNS.xctest"
+ BlueprintName = "NewHttpDNSTests"
+ ReferencedContainer = "container:NewHttpDNS.xcodeproj">
@@ -69,9 +69,9 @@
+ BuildableName = "NewHttpDNS.xctest"
+ BlueprintName = "NewHttpDNSTests"
+ ReferencedContainer = "container:NewHttpDNS.xcodeproj">
@@ -80,7 +80,7 @@
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/Config/HttpdnsInternalConstant.h b/HttpDNSSDK/sdk/ios/NewHttpDNS/Config/HttpdnsInternalConstant.h
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/Config/HttpdnsInternalConstant.h
rename to HttpDNSSDK/sdk/ios/NewHttpDNS/Config/HttpdnsInternalConstant.h
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/Config/HttpdnsPublicConstant.h b/HttpDNSSDK/sdk/ios/NewHttpDNS/Config/HttpdnsPublicConstant.h
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/Config/HttpdnsPublicConstant.h
rename to HttpDNSSDK/sdk/ios/NewHttpDNS/Config/HttpdnsPublicConstant.h
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/Config/HttpdnsRegionConfigLoader.h b/HttpDNSSDK/sdk/ios/NewHttpDNS/Config/HttpdnsRegionConfigLoader.h
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/Config/HttpdnsRegionConfigLoader.h
rename to HttpDNSSDK/sdk/ios/NewHttpDNS/Config/HttpdnsRegionConfigLoader.h
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/Config/HttpdnsRegionConfigLoader.m b/HttpDNSSDK/sdk/ios/NewHttpDNS/Config/HttpdnsRegionConfigLoader.m
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/Config/HttpdnsRegionConfigLoader.m
rename to HttpDNSSDK/sdk/ios/NewHttpDNS/Config/HttpdnsRegionConfigLoader.m
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/HttpdnsDegradationDelegate.h b/HttpDNSSDK/sdk/ios/NewHttpDNS/HttpdnsDegradationDelegate.h
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/HttpdnsDegradationDelegate.h
rename to HttpDNSSDK/sdk/ios/NewHttpDNS/HttpdnsDegradationDelegate.h
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/HttpdnsEdgeService.h b/HttpDNSSDK/sdk/ios/NewHttpDNS/HttpdnsEdgeService.h
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/HttpdnsEdgeService.h
rename to HttpDNSSDK/sdk/ios/NewHttpDNS/HttpdnsEdgeService.h
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/HttpdnsEdgeService.m b/HttpDNSSDK/sdk/ios/NewHttpDNS/HttpdnsEdgeService.m
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/HttpdnsEdgeService.m
rename to HttpDNSSDK/sdk/ios/NewHttpDNS/HttpdnsEdgeService.m
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/HttpdnsLocalResolver.h b/HttpDNSSDK/sdk/ios/NewHttpDNS/HttpdnsLocalResolver.h
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/HttpdnsLocalResolver.h
rename to HttpDNSSDK/sdk/ios/NewHttpDNS/HttpdnsLocalResolver.h
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/HttpdnsLocalResolver.m b/HttpDNSSDK/sdk/ios/NewHttpDNS/HttpdnsLocalResolver.m
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/HttpdnsLocalResolver.m
rename to HttpDNSSDK/sdk/ios/NewHttpDNS/HttpdnsLocalResolver.m
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/HttpdnsRemoteResolver.h b/HttpDNSSDK/sdk/ios/NewHttpDNS/HttpdnsRemoteResolver.h
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/HttpdnsRemoteResolver.h
rename to HttpDNSSDK/sdk/ios/NewHttpDNS/HttpdnsRemoteResolver.h
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/HttpdnsRemoteResolver.m b/HttpDNSSDK/sdk/ios/NewHttpDNS/HttpdnsRemoteResolver.m
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/HttpdnsRemoteResolver.m
rename to HttpDNSSDK/sdk/ios/NewHttpDNS/HttpdnsRemoteResolver.m
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/HttpdnsRequestManager.h b/HttpDNSSDK/sdk/ios/NewHttpDNS/HttpdnsRequestManager.h
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/HttpdnsRequestManager.h
rename to HttpDNSSDK/sdk/ios/NewHttpDNS/HttpdnsRequestManager.h
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/HttpdnsRequestManager.m b/HttpDNSSDK/sdk/ios/NewHttpDNS/HttpdnsRequestManager.m
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/HttpdnsRequestManager.m
rename to HttpDNSSDK/sdk/ios/NewHttpDNS/HttpdnsRequestManager.m
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/HttpdnsService.h b/HttpDNSSDK/sdk/ios/NewHttpDNS/HttpdnsService.h
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/HttpdnsService.h
rename to HttpDNSSDK/sdk/ios/NewHttpDNS/HttpdnsService.h
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/HttpdnsService.m b/HttpDNSSDK/sdk/ios/NewHttpDNS/HttpdnsService.m
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/HttpdnsService.m
rename to HttpDNSSDK/sdk/ios/NewHttpDNS/HttpdnsService.m
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/HttpdnsService_Internal.h b/HttpDNSSDK/sdk/ios/NewHttpDNS/HttpdnsService_Internal.h
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/HttpdnsService_Internal.h
rename to HttpDNSSDK/sdk/ios/NewHttpDNS/HttpdnsService_Internal.h
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/Info.plist b/HttpDNSSDK/sdk/ios/NewHttpDNS/Info.plist
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/Info.plist
rename to HttpDNSSDK/sdk/ios/NewHttpDNS/Info.plist
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/IpStack/HttpdnsIpStackDetector.h b/HttpDNSSDK/sdk/ios/NewHttpDNS/IpStack/HttpdnsIpStackDetector.h
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/IpStack/HttpdnsIpStackDetector.h
rename to HttpDNSSDK/sdk/ios/NewHttpDNS/IpStack/HttpdnsIpStackDetector.h
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/IpStack/HttpdnsIpStackDetector.m b/HttpDNSSDK/sdk/ios/NewHttpDNS/IpStack/HttpdnsIpStackDetector.m
similarity index 94%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/IpStack/HttpdnsIpStackDetector.m
rename to HttpDNSSDK/sdk/ios/NewHttpDNS/IpStack/HttpdnsIpStackDetector.m
index a628340..c5827ff 100644
--- a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/IpStack/HttpdnsIpStackDetector.m
+++ b/HttpDNSSDK/sdk/ios/NewHttpDNS/IpStack/HttpdnsIpStackDetector.m
@@ -1,9 +1,9 @@
-//
+//
// HttpdnsIpStackDetector.m
-// AlicloudHttpDNS
+// NewHttpDNS
//
// Created by xuyecan on 2025/3/16.
-// Copyright © 2025 alibaba-inc.com. All rights reserved.
+// Copyright © 2025 new-inc.com. All rights reserved.
//
#import "HttpdnsIpStackDetector.h"
@@ -126,8 +126,8 @@ static HttpdnsIPStackType detectIpStack(void) {
_isDetecting = NO;
_lastDetectionTime = 0;
// 创建串行队列用于控制IP栈检测的并发
- _detectSerialQueue = dispatch_queue_create("com.aliyun.httpdns.ipstack.detect", DISPATCH_QUEUE_SERIAL);
- _updateSerialQueue = dispatch_queue_create("com.aliyun.httpdns.ipstack.update", DISPATCH_QUEUE_SERIAL);
+ _detectSerialQueue = dispatch_queue_create("com.new.httpdns.ipstack.detect", DISPATCH_QUEUE_SERIAL);
+ _updateSerialQueue = dispatch_queue_create("com.new.httpdns.ipstack.update", DISPATCH_QUEUE_SERIAL);
}
return self;
}
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/Log/HttpdnsLog.h b/HttpDNSSDK/sdk/ios/NewHttpDNS/Log/HttpdnsLog.h
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/Log/HttpdnsLog.h
rename to HttpDNSSDK/sdk/ios/NewHttpDNS/Log/HttpdnsLog.h
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/Log/HttpdnsLog.m b/HttpDNSSDK/sdk/ios/NewHttpDNS/Log/HttpdnsLog.m
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/Log/HttpdnsLog.m
rename to HttpDNSSDK/sdk/ios/NewHttpDNS/Log/HttpdnsLog.m
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/Log/HttpdnsLog_Internal.h b/HttpDNSSDK/sdk/ios/NewHttpDNS/Log/HttpdnsLog_Internal.h
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/Log/HttpdnsLog_Internal.h
rename to HttpDNSSDK/sdk/ios/NewHttpDNS/Log/HttpdnsLog_Internal.h
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/Log/HttpdnsLoggerProtocol.h b/HttpDNSSDK/sdk/ios/NewHttpDNS/Log/HttpdnsLoggerProtocol.h
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/Log/HttpdnsLoggerProtocol.h
rename to HttpDNSSDK/sdk/ios/NewHttpDNS/Log/HttpdnsLoggerProtocol.h
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/Model/HttpdnsHostObject.h b/HttpDNSSDK/sdk/ios/NewHttpDNS/Model/HttpdnsHostObject.h
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/Model/HttpdnsHostObject.h
rename to HttpDNSSDK/sdk/ios/NewHttpDNS/Model/HttpdnsHostObject.h
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/Model/HttpdnsHostObject.m b/HttpDNSSDK/sdk/ios/NewHttpDNS/Model/HttpdnsHostObject.m
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/Model/HttpdnsHostObject.m
rename to HttpDNSSDK/sdk/ios/NewHttpDNS/Model/HttpdnsHostObject.m
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/Model/HttpdnsHostRecord.h b/HttpDNSSDK/sdk/ios/NewHttpDNS/Model/HttpdnsHostRecord.h
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/Model/HttpdnsHostRecord.h
rename to HttpDNSSDK/sdk/ios/NewHttpDNS/Model/HttpdnsHostRecord.h
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/Model/HttpdnsHostRecord.m b/HttpDNSSDK/sdk/ios/NewHttpDNS/Model/HttpdnsHostRecord.m
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/Model/HttpdnsHostRecord.m
rename to HttpDNSSDK/sdk/ios/NewHttpDNS/Model/HttpdnsHostRecord.m
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/Model/HttpdnsRequest.h b/HttpDNSSDK/sdk/ios/NewHttpDNS/Model/HttpdnsRequest.h
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/Model/HttpdnsRequest.h
rename to HttpDNSSDK/sdk/ios/NewHttpDNS/Model/HttpdnsRequest.h
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/Model/HttpdnsRequest.m b/HttpDNSSDK/sdk/ios/NewHttpDNS/Model/HttpdnsRequest.m
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/Model/HttpdnsRequest.m
rename to HttpDNSSDK/sdk/ios/NewHttpDNS/Model/HttpdnsRequest.m
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/Model/HttpdnsRequest_Internal.h b/HttpDNSSDK/sdk/ios/NewHttpDNS/Model/HttpdnsRequest_Internal.h
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/Model/HttpdnsRequest_Internal.h
rename to HttpDNSSDK/sdk/ios/NewHttpDNS/Model/HttpdnsRequest_Internal.h
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/Model/HttpdnsResult.h b/HttpDNSSDK/sdk/ios/NewHttpDNS/Model/HttpdnsResult.h
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/Model/HttpdnsResult.h
rename to HttpDNSSDK/sdk/ios/NewHttpDNS/Model/HttpdnsResult.h
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/Model/HttpdnsResult.m b/HttpDNSSDK/sdk/ios/NewHttpDNS/Model/HttpdnsResult.m
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/Model/HttpdnsResult.m
rename to HttpDNSSDK/sdk/ios/NewHttpDNS/Model/HttpdnsResult.m
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/Network/HttpdnsNWHTTPClient.h b/HttpDNSSDK/sdk/ios/NewHttpDNS/Network/HttpdnsNWHTTPClient.h
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/Network/HttpdnsNWHTTPClient.h
rename to HttpDNSSDK/sdk/ios/NewHttpDNS/Network/HttpdnsNWHTTPClient.h
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/Network/HttpdnsNWHTTPClient.m b/HttpDNSSDK/sdk/ios/NewHttpDNS/Network/HttpdnsNWHTTPClient.m
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/Network/HttpdnsNWHTTPClient.m
rename to HttpDNSSDK/sdk/ios/NewHttpDNS/Network/HttpdnsNWHTTPClient.m
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/Network/HttpdnsNWHTTPClient_Internal.h b/HttpDNSSDK/sdk/ios/NewHttpDNS/Network/HttpdnsNWHTTPClient_Internal.h
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/Network/HttpdnsNWHTTPClient_Internal.h
rename to HttpDNSSDK/sdk/ios/NewHttpDNS/Network/HttpdnsNWHTTPClient_Internal.h
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/Network/HttpdnsNWReusableConnection.h b/HttpDNSSDK/sdk/ios/NewHttpDNS/Network/HttpdnsNWReusableConnection.h
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/Network/HttpdnsNWReusableConnection.h
rename to HttpDNSSDK/sdk/ios/NewHttpDNS/Network/HttpdnsNWReusableConnection.h
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/Network/HttpdnsNWReusableConnection.m b/HttpDNSSDK/sdk/ios/NewHttpDNS/Network/HttpdnsNWReusableConnection.m
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/Network/HttpdnsNWReusableConnection.m
rename to HttpDNSSDK/sdk/ios/NewHttpDNS/Network/HttpdnsNWReusableConnection.m
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/AlicloudHttpDNS.h b/HttpDNSSDK/sdk/ios/NewHttpDNS/NewHttpDNS.h
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/AlicloudHttpDNS.h
rename to HttpDNSSDK/sdk/ios/NewHttpDNS/NewHttpDNS.h
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/Persistent/HttpdnsDB.h b/HttpDNSSDK/sdk/ios/NewHttpDNS/Persistent/HttpdnsDB.h
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/Persistent/HttpdnsDB.h
rename to HttpDNSSDK/sdk/ios/NewHttpDNS/Persistent/HttpdnsDB.h
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/Persistent/HttpdnsDB.m b/HttpDNSSDK/sdk/ios/NewHttpDNS/Persistent/HttpdnsDB.m
similarity index 99%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/Persistent/HttpdnsDB.m
rename to HttpDNSSDK/sdk/ios/NewHttpDNS/Persistent/HttpdnsDB.m
index 6b5a226..16e1a5b 100644
--- a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/Persistent/HttpdnsDB.m
+++ b/HttpDNSSDK/sdk/ios/NewHttpDNS/Persistent/HttpdnsDB.m
@@ -1,9 +1,9 @@
-//
+//
// HttpdnsDB.m
-// AlicloudHttpDNS
+// NewHttpDNS
//
// Created by xuyecan on 2025/3/15.
-// Copyright © 2025 alibaba-inc.com. All rights reserved.
+// Copyright © 2025 new-inc.com. All rights reserved.
//
#import "HttpdnsDB.h"
@@ -48,7 +48,7 @@ static NSString *const kColumnExtra = @"extra";
_dbPath = [dbDir stringByAppendingPathComponent:[NSString stringWithFormat:@"%ld_v20250406.db", (long)accountId]];
// 创建专用队列确保线程安全
- _dbQueue = dispatch_queue_create("com.aliyun.httpdns.db", DISPATCH_QUEUE_SERIAL);
+ _dbQueue = dispatch_queue_create("com.new.httpdns.db", DISPATCH_QUEUE_SERIAL);
// 打开数据库
__block BOOL success = NO;
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/Persistent/HttpdnsPersistenceUtils.h b/HttpDNSSDK/sdk/ios/NewHttpDNS/Persistent/HttpdnsPersistenceUtils.h
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/Persistent/HttpdnsPersistenceUtils.h
rename to HttpDNSSDK/sdk/ios/NewHttpDNS/Persistent/HttpdnsPersistenceUtils.h
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/Persistent/HttpdnsPersistenceUtils.m b/HttpDNSSDK/sdk/ios/NewHttpDNS/Persistent/HttpdnsPersistenceUtils.m
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/Persistent/HttpdnsPersistenceUtils.m
rename to HttpDNSSDK/sdk/ios/NewHttpDNS/Persistent/HttpdnsPersistenceUtils.m
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/Scheduler/HttpdnsScheduleCenter.h b/HttpDNSSDK/sdk/ios/NewHttpDNS/Scheduler/HttpdnsScheduleCenter.h
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/Scheduler/HttpdnsScheduleCenter.h
rename to HttpDNSSDK/sdk/ios/NewHttpDNS/Scheduler/HttpdnsScheduleCenter.h
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/Scheduler/HttpdnsScheduleCenter.m b/HttpDNSSDK/sdk/ios/NewHttpDNS/Scheduler/HttpdnsScheduleCenter.m
similarity index 93%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/Scheduler/HttpdnsScheduleCenter.m
rename to HttpDNSSDK/sdk/ios/NewHttpDNS/Scheduler/HttpdnsScheduleCenter.m
index c07d493..fa2781e 100644
--- a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/Scheduler/HttpdnsScheduleCenter.m
+++ b/HttpDNSSDK/sdk/ios/NewHttpDNS/Scheduler/HttpdnsScheduleCenter.m
@@ -37,8 +37,8 @@ static int const MAX_UPDATE_RETRY_COUNT = 2;
@interface HttpdnsScheduleCenter ()
-// 为了简单,无论v4还是v6,都只共同维护1个下标
-// 一般而言,下标当前在哪里并不是那么重要,重要的是轮询的能力
+// 为了简单,无论v4还是v6,都只共同维?个下?
+// 一般而言,下标当前在哪里并不是那么重要,重要的是轮询的能?
@property (nonatomic, assign) int currentActiveServiceHostIndex;
@property (nonatomic, assign) int currentActiveUpdateHostIndex;
@@ -74,8 +74,8 @@ static int const MAX_UPDATE_RETRY_COUNT = 2;
- (instancetype)init {
if (self = [super init]) {
- _scheduleFetchConfigAsyncQueue = dispatch_queue_create("com.aliyun.httpdns.scheduleFetchConfigAsyncQueue", DISPATCH_QUEUE_CONCURRENT);
- _scheduleConfigLocalOperationQueue = dispatch_queue_create("com.aliyun.httpdns.scheduleConfigLocalOperationQueue", DISPATCH_QUEUE_SERIAL);
+ _scheduleFetchConfigAsyncQueue = dispatch_queue_create("com.new.httpdns.scheduleFetchConfigAsyncQueue", DISPATCH_QUEUE_CONCURRENT);
+ _scheduleConfigLocalOperationQueue = dispatch_queue_create("com.new.httpdns.scheduleConfigLocalOperationQueue", DISPATCH_QUEUE_SERIAL);
dispatch_sync(_scheduleConfigLocalOperationQueue, ^{
self->_currentActiveUpdateHostIndex = 0;
@@ -85,7 +85,7 @@ static int const MAX_UPDATE_RETRY_COUNT = 2;
_scheduleCenterResultPath = [[HttpdnsPersistenceUtils scheduleCenterResultDirectory]
stringByAppendingPathComponent:kScheduleRegionConfigLocalCacheFileName];
- // 上次更新日期默认设置为1天前,这样如果缓存没有记录,就会立即更新
+ // 上次更新日期默认设置?天前,这样如果缓存没有记录,就会立即更新
_lastScheduleCenterConnectDate = [NSDate dateWithTimeIntervalSinceNow:(- 24 * 60 * 60)];
}
return self;
@@ -93,11 +93,11 @@ static int const MAX_UPDATE_RETRY_COUNT = 2;
- (void)initRegion:(NSString *)region {
if (![[HttpdnsRegionConfigLoader getAvailableRegionList] containsObject:region]) {
- region = ALICLOUD_HTTPDNS_DEFAULT_REGION_KEY;
+ region = NEW_HTTPDNS_DEFAULT_REGION_KEY;
}
- // 先用默认region初始化
- // 如果用户主动调用了设置region接口,会按照用户设置的再来一次
+ // 先用默认region初始?
+ // 如果用户主动调用了设置region接口,会按照用户设置的再来一?
[self initServerListByRegion:region];
// 再从本地缓存读取之前缓存过的配置
@@ -112,7 +112,7 @@ static int const MAX_UPDATE_RETRY_COUNT = 2;
self.currentActiveUpdateHostIndex = 0;
});
- // 重置region之后马上发起一次更新
+ // 重置region之后马上发起一次更?
[self asyncUpdateRegionScheduleConfig];
}
@@ -125,7 +125,7 @@ static int const MAX_UPDATE_RETRY_COUNT = 2;
}
NSDictionary *scheduleCenterResult = (NSDictionary *)obj;
- // 兼容时间戳为NSNumber/NSString,屏蔽NSNull等异常输入
+ // 兼容时间戳为NSNumber/NSString,屏蔽NSNull等异常输?
id ts = [scheduleCenterResult objectForKey:kLastUpdateUnixTimestampKey];
if ([ts respondsToSelector:@selector(doubleValue)]) {
NSDate *lastUpdateDate = [NSDate dateWithTimeIntervalSince1970:[ts doubleValue]];
@@ -135,7 +135,7 @@ static int const MAX_UPDATE_RETRY_COUNT = 2;
});
}
-// 根据指定的时间间隔检查是否需要更新
+// 根据指定的时间间隔检查是否需要更?
- (void)asyncUpdateRegionConfigAfterAtLeast:(NSTimeInterval)interval {
__block BOOL shouldUpdate = NO;
dispatch_sync(_scheduleConfigLocalOperationQueue, ^{
@@ -170,10 +170,10 @@ static int const MAX_UPDATE_RETRY_COUNT = 2;
if (error || !scheduleCenterResult) {
HttpdnsLogDebug("Update region config failed, error: %@", error);
- // 只有报错了就尝试选择新的调度服务器
+ // 只有报错了就尝试选择新的调度服务?
[self rotateUpdateServerHost];
- // 3秒之后重试
+ // 3秒之后重?
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)((retryCount + 1) * NSEC_PER_SEC)), self->_scheduleFetchConfigAsyncQueue, ^{
[self asyncUpdateRegionScheduleConfigAtRetry:retryCount + 1];
});
@@ -192,8 +192,8 @@ static int const MAX_UPDATE_RETRY_COUNT = 2;
}
- (void)updateRegionConfig:(NSDictionary *)scheduleCenterResult {
- NSArray *v4Result = [scheduleCenterResult objectForKey:kAlicloudHttpdnsRegionConfigV4HostKey];
- NSArray *v6Result = [scheduleCenterResult objectForKey:kAlicloudHttpdnsRegionConfigV6HostKey];
+ NSArray *v4Result = [scheduleCenterResult objectForKey:kNewHttpdnsRegionConfigV4HostKey];
+ NSArray *v6Result = [scheduleCenterResult objectForKey:kNewHttpdnsRegionConfigV6HostKey];
dispatch_sync(_scheduleConfigLocalOperationQueue, ^{
HttpdnsRegionConfigLoader *regionConfigLoader = [HttpdnsRegionConfigLoader sharedInstance];
@@ -260,7 +260,7 @@ static int const MAX_UPDATE_RETRY_COUNT = 2;
});
if (timeToUpdate) {
- // 每次服务server列表轮转之后,尝试1个至少间隔30秒的更新
+ // 每次服务server列表轮转之后,尝?个至少间?0秒的更新
[self asyncUpdateRegionConfigAfterAtLeast:30];
}
}
@@ -286,8 +286,8 @@ static int const MAX_UPDATE_RETRY_COUNT = 2;
}
- (NSString *)currentActiveServiceServerV4Host {
- // 每次读取时都检查是否需要更新,相当于实现一个懒加载的机制
- // 因为当前httpdns的初始化方式,没有一个统一的初始化入口,所以需要这样处理
+ // 每次读取时都检查是否需要更新,相当于实现一个懒加载的机?
+ // 因为当前httpdns的初始化方式,没有一个统一的初始化入口,所以需要这样处?
[self asyncUpdateRegionConfigAfterAtLeast:(24 * 60 * 60)];
// 检查是否存在HTTPDNS_DEBUG_V4_SERVICE_IP环境变量
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/Scheduler/HttpdnsScheduleExecutor.h b/HttpDNSSDK/sdk/ios/NewHttpDNS/Scheduler/HttpdnsScheduleExecutor.h
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/Scheduler/HttpdnsScheduleExecutor.h
rename to HttpDNSSDK/sdk/ios/NewHttpDNS/Scheduler/HttpdnsScheduleExecutor.h
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/Scheduler/HttpdnsScheduleExecutor.m b/HttpDNSSDK/sdk/ios/NewHttpDNS/Scheduler/HttpdnsScheduleExecutor.m
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/Scheduler/HttpdnsScheduleExecutor.m
rename to HttpDNSSDK/sdk/ios/NewHttpDNS/Scheduler/HttpdnsScheduleExecutor.m
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/Utils/HttpDnsLocker.h b/HttpDNSSDK/sdk/ios/NewHttpDNS/Utils/HttpDnsLocker.h
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/Utils/HttpDnsLocker.h
rename to HttpDNSSDK/sdk/ios/NewHttpDNS/Utils/HttpDnsLocker.h
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/Utils/HttpDnsLocker.m b/HttpDNSSDK/sdk/ios/NewHttpDNS/Utils/HttpDnsLocker.m
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/Utils/HttpDnsLocker.m
rename to HttpDNSSDK/sdk/ios/NewHttpDNS/Utils/HttpDnsLocker.m
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/Utils/HttpdnsHostObjectInMemoryCache.h b/HttpDNSSDK/sdk/ios/NewHttpDNS/Utils/HttpdnsHostObjectInMemoryCache.h
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/Utils/HttpdnsHostObjectInMemoryCache.h
rename to HttpDNSSDK/sdk/ios/NewHttpDNS/Utils/HttpdnsHostObjectInMemoryCache.h
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/Utils/HttpdnsHostObjectInMemoryCache.m b/HttpDNSSDK/sdk/ios/NewHttpDNS/Utils/HttpdnsHostObjectInMemoryCache.m
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/Utils/HttpdnsHostObjectInMemoryCache.m
rename to HttpDNSSDK/sdk/ios/NewHttpDNS/Utils/HttpdnsHostObjectInMemoryCache.m
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/Utils/HttpdnsIPQualityDetector.h b/HttpDNSSDK/sdk/ios/NewHttpDNS/Utils/HttpdnsIPQualityDetector.h
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/Utils/HttpdnsIPQualityDetector.h
rename to HttpDNSSDK/sdk/ios/NewHttpDNS/Utils/HttpdnsIPQualityDetector.h
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/Utils/HttpdnsIPQualityDetector.m b/HttpDNSSDK/sdk/ios/NewHttpDNS/Utils/HttpdnsIPQualityDetector.m
similarity index 97%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/Utils/HttpdnsIPQualityDetector.m
rename to HttpDNSSDK/sdk/ios/NewHttpDNS/Utils/HttpdnsIPQualityDetector.m
index 0d95cce..1ec2a80 100644
--- a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/Utils/HttpdnsIPQualityDetector.m
+++ b/HttpDNSSDK/sdk/ios/NewHttpDNS/Utils/HttpdnsIPQualityDetector.m
@@ -1,9 +1,9 @@
-//
+//
// HttpdnsIPQualityDetector.m
-// AlicloudHttpDNS
+// NewHttpDNS
//
// Created by xuyecan on 2025/3/13.
-// Copyright © 2025 alibaba-inc.com. All rights reserved.
+// Copyright © 2025 new-inc.com. All rights reserved.
//
#import "HttpdnsIPQualityDetector.h"
@@ -58,7 +58,7 @@
- (instancetype)init {
self = [super init];
if (self) {
- _detectQueue = dispatch_queue_create("com.aliyun.httpdns.ipqualitydetector", DISPATCH_QUEUE_CONCURRENT);
+ _detectQueue = dispatch_queue_create("com.new.httpdns.ipqualitydetector", DISPATCH_QUEUE_CONCURRENT);
_maxConcurrentDetections = 10;
_concurrencySemaphore = dispatch_semaphore_create(_maxConcurrentDetections);
_pendingTasks = [NSMutableArray array];
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/Utils/HttpdnsReachability.h b/HttpDNSSDK/sdk/ios/NewHttpDNS/Utils/HttpdnsReachability.h
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/Utils/HttpdnsReachability.h
rename to HttpDNSSDK/sdk/ios/NewHttpDNS/Utils/HttpdnsReachability.h
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/Utils/HttpdnsReachability.m b/HttpDNSSDK/sdk/ios/NewHttpDNS/Utils/HttpdnsReachability.m
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/Utils/HttpdnsReachability.m
rename to HttpDNSSDK/sdk/ios/NewHttpDNS/Utils/HttpdnsReachability.m
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/Utils/HttpdnsUtil.h b/HttpDNSSDK/sdk/ios/NewHttpDNS/Utils/HttpdnsUtil.h
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/Utils/HttpdnsUtil.h
rename to HttpDNSSDK/sdk/ios/NewHttpDNS/Utils/HttpdnsUtil.h
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/Utils/HttpdnsUtil.m b/HttpDNSSDK/sdk/ios/NewHttpDNS/Utils/HttpdnsUtil.m
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNS/Utils/HttpdnsUtil.m
rename to HttpDNSSDK/sdk/ios/NewHttpDNS/Utils/HttpdnsUtil.m
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTestDemo/AppDelegate.h b/HttpDNSSDK/sdk/ios/NewHttpDNSTestDemo/AppDelegate.h
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTestDemo/AppDelegate.h
rename to HttpDNSSDK/sdk/ios/NewHttpDNSTestDemo/AppDelegate.h
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTestDemo/AppDelegate.m b/HttpDNSSDK/sdk/ios/NewHttpDNSTestDemo/AppDelegate.m
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTestDemo/AppDelegate.m
rename to HttpDNSSDK/sdk/ios/NewHttpDNSTestDemo/AppDelegate.m
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTestDemo/Assets.xcassets/AppIcon.appiconset/Contents.json b/HttpDNSSDK/sdk/ios/NewHttpDNSTestDemo/Assets.xcassets/AppIcon.appiconset/Contents.json
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTestDemo/Assets.xcassets/AppIcon.appiconset/Contents.json
rename to HttpDNSSDK/sdk/ios/NewHttpDNSTestDemo/Assets.xcassets/AppIcon.appiconset/Contents.json
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTestDemo/Assets.xcassets/Contents.json b/HttpDNSSDK/sdk/ios/NewHttpDNSTestDemo/Assets.xcassets/Contents.json
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTestDemo/Assets.xcassets/Contents.json
rename to HttpDNSSDK/sdk/ios/NewHttpDNSTestDemo/Assets.xcassets/Contents.json
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTestDemo/Base.lproj/LaunchScreen.storyboard b/HttpDNSSDK/sdk/ios/NewHttpDNSTestDemo/Base.lproj/LaunchScreen.storyboard
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTestDemo/Base.lproj/LaunchScreen.storyboard
rename to HttpDNSSDK/sdk/ios/NewHttpDNSTestDemo/Base.lproj/LaunchScreen.storyboard
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTestDemo/DemoConfig.plist b/HttpDNSSDK/sdk/ios/NewHttpDNSTestDemo/DemoConfig.plist
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTestDemo/DemoConfig.plist
rename to HttpDNSSDK/sdk/ios/NewHttpDNSTestDemo/DemoConfig.plist
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTestDemo/DemoConfigLoader.h b/HttpDNSSDK/sdk/ios/NewHttpDNSTestDemo/DemoConfigLoader.h
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTestDemo/DemoConfigLoader.h
rename to HttpDNSSDK/sdk/ios/NewHttpDNSTestDemo/DemoConfigLoader.h
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTestDemo/DemoConfigLoader.m b/HttpDNSSDK/sdk/ios/NewHttpDNSTestDemo/DemoConfigLoader.m
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTestDemo/DemoConfigLoader.m
rename to HttpDNSSDK/sdk/ios/NewHttpDNSTestDemo/DemoConfigLoader.m
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTestDemo/DemoHttpdnsScenario.h b/HttpDNSSDK/sdk/ios/NewHttpDNSTestDemo/DemoHttpdnsScenario.h
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTestDemo/DemoHttpdnsScenario.h
rename to HttpDNSSDK/sdk/ios/NewHttpDNSTestDemo/DemoHttpdnsScenario.h
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTestDemo/DemoHttpdnsScenario.m b/HttpDNSSDK/sdk/ios/NewHttpDNSTestDemo/DemoHttpdnsScenario.m
similarity index 94%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTestDemo/DemoHttpdnsScenario.m
rename to HttpDNSSDK/sdk/ios/NewHttpDNSTestDemo/DemoHttpdnsScenario.m
index 4b01706..496e6ca 100644
--- a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTestDemo/DemoHttpdnsScenario.m
+++ b/HttpDNSSDK/sdk/ios/NewHttpDNSTestDemo/DemoHttpdnsScenario.m
@@ -1,6 +1,6 @@
-//
+//
// DemoHttpdnsScenario.m
-// AlicloudHttpDNSTestDemo
+// NewHttpDNSTestDemo
//
// @author Created by Claude Code on 2025-10-23
//
@@ -15,7 +15,7 @@
- (instancetype)init {
if (self = [super init]) {
- _host = @"www.aliyun.com";
+ _host = @"www.new.com";
_ipType = HttpdnsQueryIPTypeBoth;
_httpsEnabled = YES;
_persistentCacheEnabled = YES;
@@ -53,7 +53,7 @@
_model = [[DemoResolveModel alloc] init];
_config = [[DemoHttpdnsScenarioConfig alloc] init];
_logBuffer = [NSMutableString string];
- _logQueue = dispatch_queue_create("com.alicloud.httpdns.demo.log", DISPATCH_QUEUE_SERIAL);
+ _logQueue = dispatch_queue_create("com.new.httpdns.demo.log", DISPATCH_QUEUE_SERIAL);
[self buildService];
[self applyConfig:_config];
}
@@ -114,7 +114,7 @@
}
- (NSString *)currentHost {
- return self.config.host.length > 0 ? self.config.host : @"www.aliyun.com";
+ return self.config.host.length > 0 ? self.config.host : @"www.new.com";
}
- (void)handleResult:(HttpdnsResult *)result host:(NSString *)host ipType:(HttpdnsQueryIPType)ipType start:(NSTimeInterval)startMs {
@@ -146,7 +146,7 @@
});
}
-- (int64_t)httpdnsHost:(NSString *)host ipType:(AlicloudHttpDNS_IPType)ipType ttl:(int64_t)ttl {
+- (int64_t)httpdnsHost:(NSString *)host ipType:(NewHttpDNS_IPType)ipType ttl:(int64_t)ttl {
return ttl;
}
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTestDemo/DemoLogViewController.h b/HttpDNSSDK/sdk/ios/NewHttpDNSTestDemo/DemoLogViewController.h
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTestDemo/DemoLogViewController.h
rename to HttpDNSSDK/sdk/ios/NewHttpDNSTestDemo/DemoLogViewController.h
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTestDemo/DemoLogViewController.m b/HttpDNSSDK/sdk/ios/NewHttpDNSTestDemo/DemoLogViewController.m
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTestDemo/DemoLogViewController.m
rename to HttpDNSSDK/sdk/ios/NewHttpDNSTestDemo/DemoLogViewController.m
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTestDemo/DemoResolveModel.h b/HttpDNSSDK/sdk/ios/NewHttpDNSTestDemo/DemoResolveModel.h
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTestDemo/DemoResolveModel.h
rename to HttpDNSSDK/sdk/ios/NewHttpDNSTestDemo/DemoResolveModel.h
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTestDemo/DemoResolveModel.m b/HttpDNSSDK/sdk/ios/NewHttpDNSTestDemo/DemoResolveModel.m
similarity index 92%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTestDemo/DemoResolveModel.m
rename to HttpDNSSDK/sdk/ios/NewHttpDNSTestDemo/DemoResolveModel.m
index b772d23..403258e 100644
--- a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTestDemo/DemoResolveModel.m
+++ b/HttpDNSSDK/sdk/ios/NewHttpDNSTestDemo/DemoResolveModel.m
@@ -1,6 +1,6 @@
-//
+//
// DemoResolveModel.m
-// AlicloudHttpDNSTestDemo
+// NewHttpDNSTestDemo
//
// @author Created by Claude Code on 2025-10-05
//
@@ -11,7 +11,7 @@
- (instancetype)init {
if (self = [super init]) {
- _host = @"www.aliyun.com";
+ _host = @"www.new.com";
_ipType = HttpdnsQueryIPTypeBoth;
_ipv4s = @[];
_ipv6s = @[];
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTestDemo/DemoViewController.h b/HttpDNSSDK/sdk/ios/NewHttpDNSTestDemo/DemoViewController.h
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTestDemo/DemoViewController.h
rename to HttpDNSSDK/sdk/ios/NewHttpDNSTestDemo/DemoViewController.h
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTestDemo/DemoViewController.m b/HttpDNSSDK/sdk/ios/NewHttpDNSTestDemo/DemoViewController.m
similarity index 98%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTestDemo/DemoViewController.m
rename to HttpDNSSDK/sdk/ios/NewHttpDNSTestDemo/DemoViewController.m
index dc52e3d..1b43cde 100644
--- a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTestDemo/DemoViewController.m
+++ b/HttpDNSSDK/sdk/ios/NewHttpDNSTestDemo/DemoViewController.m
@@ -1,6 +1,6 @@
-//
+//
// DNSDemoViewController.m
-// AlicloudHttpDNSTestDemo
+// NewHttpDNSTestDemo
//
// @author Created by Claude Code on 2025-10-05
//
@@ -75,7 +75,7 @@
UIStackView *row1 = [self labeledRow:@"Host"];
self.hostField = [[UITextField alloc] init];
- self.hostField.placeholder = @"www.aliyun.com";
+ self.hostField.placeholder = @"www.new.com";
self.hostField.text = self.scenarioConfig.host;
self.hostField.borderStyle = UITextBorderStyleRoundedRect;
[row1 addArrangedSubview:self.hostField];
@@ -243,7 +243,7 @@
- (void)onResolveAsync {
[self.view endEditing:YES];
- NSString *host = self.hostField.text.length > 0 ? self.hostField.text : @"www.aliyun.com";
+ NSString *host = self.hostField.text.length > 0 ? self.hostField.text : @"www.new.com";
self.model.host = host;
self.scenarioConfig.host = host;
[self.scenario applyConfig:self.scenarioConfig];
@@ -252,7 +252,7 @@
- (void)onResolveSync {
[self.view endEditing:YES];
- NSString *host = self.hostField.text.length > 0 ? self.hostField.text : @"www.aliyun.com";
+ NSString *host = self.hostField.text.length > 0 ? self.hostField.text : @"www.new.com";
self.model.host = host;
self.scenarioConfig.host = host;
[self.scenario applyConfig:self.scenarioConfig];
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTestDemo/Info.plist b/HttpDNSSDK/sdk/ios/NewHttpDNSTestDemo/Info.plist
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTestDemo/Info.plist
rename to HttpDNSSDK/sdk/ios/NewHttpDNSTestDemo/Info.plist
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTestDemo/main.m b/HttpDNSSDK/sdk/ios/NewHttpDNSTestDemo/main.m
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTestDemo/main.m
rename to HttpDNSSDK/sdk/ios/NewHttpDNSTestDemo/main.m
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTests/DB/DBTest.m b/HttpDNSSDK/sdk/ios/NewHttpDNSTests/DB/DBTest.m
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTests/DB/DBTest.m
rename to HttpDNSSDK/sdk/ios/NewHttpDNSTests/DB/DBTest.m
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTests/HighLevelTest/CacheKeyFunctionTest.m b/HttpDNSSDK/sdk/ios/NewHttpDNSTests/HighLevelTest/CacheKeyFunctionTest.m
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTests/HighLevelTest/CacheKeyFunctionTest.m
rename to HttpDNSSDK/sdk/ios/NewHttpDNSTests/HighLevelTest/CacheKeyFunctionTest.m
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTests/HighLevelTest/CustomTTLTest.m b/HttpDNSSDK/sdk/ios/NewHttpDNSTests/HighLevelTest/CustomTTLTest.m
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTests/HighLevelTest/CustomTTLTest.m
rename to HttpDNSSDK/sdk/ios/NewHttpDNSTests/HighLevelTest/CustomTTLTest.m
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTests/HighLevelTest/EnableReuseExpiredIpTest.m b/HttpDNSSDK/sdk/ios/NewHttpDNSTests/HighLevelTest/EnableReuseExpiredIpTest.m
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTests/HighLevelTest/EnableReuseExpiredIpTest.m
rename to HttpDNSSDK/sdk/ios/NewHttpDNSTests/HighLevelTest/EnableReuseExpiredIpTest.m
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTests/HighLevelTest/HttpdnsHostObjectTest.m b/HttpDNSSDK/sdk/ios/NewHttpDNSTests/HighLevelTest/HttpdnsHostObjectTest.m
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTests/HighLevelTest/HttpdnsHostObjectTest.m
rename to HttpDNSSDK/sdk/ios/NewHttpDNSTests/HighLevelTest/HttpdnsHostObjectTest.m
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTests/HighLevelTest/ManuallyCleanCacheTest.m b/HttpDNSSDK/sdk/ios/NewHttpDNSTests/HighLevelTest/ManuallyCleanCacheTest.m
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTests/HighLevelTest/ManuallyCleanCacheTest.m
rename to HttpDNSSDK/sdk/ios/NewHttpDNSTests/HighLevelTest/ManuallyCleanCacheTest.m
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTests/HighLevelTest/MultithreadCorrectnessTest.m b/HttpDNSSDK/sdk/ios/NewHttpDNSTests/HighLevelTest/MultithreadCorrectnessTest.m
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTests/HighLevelTest/MultithreadCorrectnessTest.m
rename to HttpDNSSDK/sdk/ios/NewHttpDNSTests/HighLevelTest/MultithreadCorrectnessTest.m
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTests/HighLevelTest/PresetCacheAndRetrieveTest.m b/HttpDNSSDK/sdk/ios/NewHttpDNSTests/HighLevelTest/PresetCacheAndRetrieveTest.m
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTests/HighLevelTest/PresetCacheAndRetrieveTest.m
rename to HttpDNSSDK/sdk/ios/NewHttpDNSTests/HighLevelTest/PresetCacheAndRetrieveTest.m
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTests/HighLevelTest/ResolvingEffectiveHostTest.m b/HttpDNSSDK/sdk/ios/NewHttpDNSTests/HighLevelTest/ResolvingEffectiveHostTest.m
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTests/HighLevelTest/ResolvingEffectiveHostTest.m
rename to HttpDNSSDK/sdk/ios/NewHttpDNSTests/HighLevelTest/ResolvingEffectiveHostTest.m
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTests/HighLevelTest/ScheduleCenterV4Test.m b/HttpDNSSDK/sdk/ios/NewHttpDNSTests/HighLevelTest/ScheduleCenterV4Test.m
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTests/HighLevelTest/ScheduleCenterV4Test.m
rename to HttpDNSSDK/sdk/ios/NewHttpDNSTests/HighLevelTest/ScheduleCenterV4Test.m
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTests/HighLevelTest/ScheduleCenterV6Test.m b/HttpDNSSDK/sdk/ios/NewHttpDNSTests/HighLevelTest/ScheduleCenterV6Test.m
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTests/HighLevelTest/ScheduleCenterV6Test.m
rename to HttpDNSSDK/sdk/ios/NewHttpDNSTests/HighLevelTest/ScheduleCenterV6Test.m
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTests/HighLevelTest/SdnsScenarioTest.m b/HttpDNSSDK/sdk/ios/NewHttpDNSTests/HighLevelTest/SdnsScenarioTest.m
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTests/HighLevelTest/SdnsScenarioTest.m
rename to HttpDNSSDK/sdk/ios/NewHttpDNSTests/HighLevelTest/SdnsScenarioTest.m
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTests/IPDetector/IpDetectorTest.m b/HttpDNSSDK/sdk/ios/NewHttpDNSTests/IPDetector/IpDetectorTest.m
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTests/IPDetector/IpDetectorTest.m
rename to HttpDNSSDK/sdk/ios/NewHttpDNSTests/IPDetector/IpDetectorTest.m
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTests/Info.plist b/HttpDNSSDK/sdk/ios/NewHttpDNSTests/Info.plist
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTests/Info.plist
rename to HttpDNSSDK/sdk/ios/NewHttpDNSTests/Info.plist
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTests/Network/HttpdnsNWHTTPClientTestBase.h b/HttpDNSSDK/sdk/ios/NewHttpDNSTests/Network/HttpdnsNWHTTPClientTestBase.h
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTests/Network/HttpdnsNWHTTPClientTestBase.h
rename to HttpDNSSDK/sdk/ios/NewHttpDNSTests/Network/HttpdnsNWHTTPClientTestBase.h
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTests/Network/HttpdnsNWHTTPClientTestBase.m b/HttpDNSSDK/sdk/ios/NewHttpDNSTests/Network/HttpdnsNWHTTPClientTestBase.m
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTests/Network/HttpdnsNWHTTPClientTestBase.m
rename to HttpDNSSDK/sdk/ios/NewHttpDNSTests/Network/HttpdnsNWHTTPClientTestBase.m
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTests/Network/HttpdnsNWHTTPClientTestHelper.h b/HttpDNSSDK/sdk/ios/NewHttpDNSTests/Network/HttpdnsNWHTTPClientTestHelper.h
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTests/Network/HttpdnsNWHTTPClientTestHelper.h
rename to HttpDNSSDK/sdk/ios/NewHttpDNSTests/Network/HttpdnsNWHTTPClientTestHelper.h
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTests/Network/HttpdnsNWHTTPClientTestHelper.m b/HttpDNSSDK/sdk/ios/NewHttpDNSTests/Network/HttpdnsNWHTTPClientTestHelper.m
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTests/Network/HttpdnsNWHTTPClientTestHelper.m
rename to HttpDNSSDK/sdk/ios/NewHttpDNSTests/Network/HttpdnsNWHTTPClientTestHelper.m
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTests/Network/HttpdnsNWHTTPClientTests.m b/HttpDNSSDK/sdk/ios/NewHttpDNSTests/Network/HttpdnsNWHTTPClientTests.m
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTests/Network/HttpdnsNWHTTPClientTests.m
rename to HttpDNSSDK/sdk/ios/NewHttpDNSTests/Network/HttpdnsNWHTTPClientTests.m
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTests/Network/HttpdnsNWHTTPClient_BasicIntegrationTests.m b/HttpDNSSDK/sdk/ios/NewHttpDNSTests/Network/HttpdnsNWHTTPClient_BasicIntegrationTests.m
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTests/Network/HttpdnsNWHTTPClient_BasicIntegrationTests.m
rename to HttpDNSSDK/sdk/ios/NewHttpDNSTests/Network/HttpdnsNWHTTPClient_BasicIntegrationTests.m
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTests/Network/HttpdnsNWHTTPClient_ConcurrencyTests.m b/HttpDNSSDK/sdk/ios/NewHttpDNSTests/Network/HttpdnsNWHTTPClient_ConcurrencyTests.m
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTests/Network/HttpdnsNWHTTPClient_ConcurrencyTests.m
rename to HttpDNSSDK/sdk/ios/NewHttpDNSTests/Network/HttpdnsNWHTTPClient_ConcurrencyTests.m
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTests/Network/HttpdnsNWHTTPClient_EdgeCasesAndTimeoutTests.m b/HttpDNSSDK/sdk/ios/NewHttpDNSTests/Network/HttpdnsNWHTTPClient_EdgeCasesAndTimeoutTests.m
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTests/Network/HttpdnsNWHTTPClient_EdgeCasesAndTimeoutTests.m
rename to HttpDNSSDK/sdk/ios/NewHttpDNSTests/Network/HttpdnsNWHTTPClient_EdgeCasesAndTimeoutTests.m
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTests/Network/HttpdnsNWHTTPClient_PoolManagementTests.m b/HttpDNSSDK/sdk/ios/NewHttpDNSTests/Network/HttpdnsNWHTTPClient_PoolManagementTests.m
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTests/Network/HttpdnsNWHTTPClient_PoolManagementTests.m
rename to HttpDNSSDK/sdk/ios/NewHttpDNSTests/Network/HttpdnsNWHTTPClient_PoolManagementTests.m
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTests/Network/HttpdnsNWHTTPClient_StateMachineTests.m b/HttpDNSSDK/sdk/ios/NewHttpDNSTests/Network/HttpdnsNWHTTPClient_StateMachineTests.m
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTests/Network/HttpdnsNWHTTPClient_StateMachineTests.m
rename to HttpDNSSDK/sdk/ios/NewHttpDNSTests/Network/HttpdnsNWHTTPClient_StateMachineTests.m
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTests/Network/MOCK_SERVER.md b/HttpDNSSDK/sdk/ios/NewHttpDNSTests/Network/MOCK_SERVER.md
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTests/Network/MOCK_SERVER.md
rename to HttpDNSSDK/sdk/ios/NewHttpDNSTests/Network/MOCK_SERVER.md
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTests/Network/README.md b/HttpDNSSDK/sdk/ios/NewHttpDNSTests/Network/README.md
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTests/Network/README.md
rename to HttpDNSSDK/sdk/ios/NewHttpDNSTests/Network/README.md
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTests/Network/STATE_MACHINE_ANALYSIS.md b/HttpDNSSDK/sdk/ios/NewHttpDNSTests/Network/STATE_MACHINE_ANALYSIS.md
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTests/Network/STATE_MACHINE_ANALYSIS.md
rename to HttpDNSSDK/sdk/ios/NewHttpDNSTests/Network/STATE_MACHINE_ANALYSIS.md
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTests/Network/TIMEOUT_ANALYSIS.md b/HttpDNSSDK/sdk/ios/NewHttpDNSTests/Network/TIMEOUT_ANALYSIS.md
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTests/Network/TIMEOUT_ANALYSIS.md
rename to HttpDNSSDK/sdk/ios/NewHttpDNSTests/Network/TIMEOUT_ANALYSIS.md
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTests/Network/mock_server.py b/HttpDNSSDK/sdk/ios/NewHttpDNSTests/Network/mock_server.py
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTests/Network/mock_server.py
rename to HttpDNSSDK/sdk/ios/NewHttpDNSTests/Network/mock_server.py
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTests/OutdatedTest/NetworkManager.h b/HttpDNSSDK/sdk/ios/NewHttpDNSTests/OutdatedTest/NetworkManager.h
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTests/OutdatedTest/NetworkManager.h
rename to HttpDNSSDK/sdk/ios/NewHttpDNSTests/OutdatedTest/NetworkManager.h
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTests/OutdatedTest/NetworkManager.m b/HttpDNSSDK/sdk/ios/NewHttpDNSTests/OutdatedTest/NetworkManager.m
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTests/OutdatedTest/NetworkManager.m
rename to HttpDNSSDK/sdk/ios/NewHttpDNSTests/OutdatedTest/NetworkManager.m
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTests/Testbase/TestBase.h b/HttpDNSSDK/sdk/ios/NewHttpDNSTests/Testbase/TestBase.h
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTests/Testbase/TestBase.h
rename to HttpDNSSDK/sdk/ios/NewHttpDNSTests/Testbase/TestBase.h
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTests/Testbase/TestBase.m b/HttpDNSSDK/sdk/ios/NewHttpDNSTests/Testbase/TestBase.m
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTests/Testbase/TestBase.m
rename to HttpDNSSDK/sdk/ios/NewHttpDNSTests/Testbase/TestBase.m
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTests/Testbase/XCTestCase+AsyncTesting.h b/HttpDNSSDK/sdk/ios/NewHttpDNSTests/Testbase/XCTestCase+AsyncTesting.h
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTests/Testbase/XCTestCase+AsyncTesting.h
rename to HttpDNSSDK/sdk/ios/NewHttpDNSTests/Testbase/XCTestCase+AsyncTesting.h
diff --git a/EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTests/Testbase/XCTestCase+AsyncTesting.m b/HttpDNSSDK/sdk/ios/NewHttpDNSTests/Testbase/XCTestCase+AsyncTesting.m
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/AlicloudHttpDNSTests/Testbase/XCTestCase+AsyncTesting.m
rename to HttpDNSSDK/sdk/ios/NewHttpDNSTests/Testbase/XCTestCase+AsyncTesting.m
diff --git a/EdgeHttpDNS/sdk/ios/Podfile b/HttpDNSSDK/sdk/ios/Podfile
similarity index 75%
rename from EdgeHttpDNS/sdk/ios/Podfile
rename to HttpDNSSDK/sdk/ios/Podfile
index 840b50e..12078c7 100644
--- a/EdgeHttpDNS/sdk/ios/Podfile
+++ b/HttpDNSSDK/sdk/ios/Podfile
@@ -5,12 +5,12 @@ use_frameworks!
platform :ios, '12.0'
-target 'AlicloudHttpDNSTests' do
+target 'NewHttpDNSTests' do
pod 'OCMock'
end
-target 'AlicloudHttpDNSTestDemo' do
- pod 'AlicloudHTTPDNS', :path => './AlicloudHTTPDNS.podspec'
+target 'NewHttpDNSTestDemo' do
+ pod 'NewHTTPDNS', :path => './NewHTTPDNS.podspec'
end
post_install do |installer|
diff --git a/EdgeHttpDNS/sdk/ios/README.md b/HttpDNSSDK/sdk/ios/README.md
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/README.md
rename to HttpDNSSDK/sdk/ios/README.md
diff --git a/EdgeHttpDNS/sdk/ios/build_xc_framework.sh b/HttpDNSSDK/sdk/ios/build_xc_framework.sh
similarity index 93%
rename from EdgeHttpDNS/sdk/ios/build_xc_framework.sh
rename to HttpDNSSDK/sdk/ios/build_xc_framework.sh
index 736ab72..ffcd3a3 100644
--- a/EdgeHttpDNS/sdk/ios/build_xc_framework.sh
+++ b/HttpDNSSDK/sdk/ios/build_xc_framework.sh
@@ -3,7 +3,7 @@
set -x
FRAMEWORK_ID="httpdns"
-FRAMEWORK_NAME="AlicloudHttpDNS"
+FRAMEWORK_NAME="NewHttpDNS"
BUILD_CONFIG="release"
BUILD_DIR="`pwd`/Build"
diff --git a/EdgeHttpDNS/sdk/ios/resource/PrivacyInfo.xcprivacy b/HttpDNSSDK/sdk/ios/resource/PrivacyInfo.xcprivacy
similarity index 100%
rename from EdgeHttpDNS/sdk/ios/resource/PrivacyInfo.xcprivacy
rename to HttpDNSSDK/sdk/ios/resource/PrivacyInfo.xcprivacy
diff --git a/HttpDNSSDK/spec/error-codes.md b/HttpDNSSDK/spec/error-codes.md
new file mode 100644
index 0000000..4149e7f
--- /dev/null
+++ b/HttpDNSSDK/spec/error-codes.md
@@ -0,0 +1,13 @@
+# 错误码规范
+
+## 基础错误码
+- `SUCCESS`: 成功
+- `NO_RECORDS`: 无解析记录
+- `SIGN_INVALID`: 签名错误
+- `APP_NOT_FOUND`: 应用不存在
+- `INTERNAL_ERROR`: 服务内部错误
+
+## 客户端处理建议
+- `NO_RECORDS`: 触发本地 DNS 或业务降级
+- `SIGN_INVALID`: 检查 appId/secret 与时钟
+- `INTERNAL_ERROR`: 重试 + 回退
diff --git a/HttpDNSSDK/spec/resolve-api.md b/HttpDNSSDK/spec/resolve-api.md
new file mode 100644
index 0000000..a75760b
--- /dev/null
+++ b/HttpDNSSDK/spec/resolve-api.md
@@ -0,0 +1,17 @@
+# Resolve API 规范
+
+## 目标
+- 统一 Android / iOS / Flutter 对 `/resolve` 的请求与响应语义。
+
+## 请求参数
+- `appId`: 应用标识
+- `dn`: 待解析域名
+- `qtype`: `A` 或 `AAAA`
+- `sdk_version`: SDK 版本号
+- `os`: 平台标识(android/ios/flutter)
+- `sid`: 会话标识
+
+## 响应语义
+- `code=SUCCESS` 且 `records` 非空:返回可用 IP 列表
+- `code=SUCCESS` 且 `records` 为空:视为无解析记录
+- 非 `SUCCESS`:按错误码处理降级
diff --git a/HttpDNSSDK/tools/release/httpdns/README.md b/HttpDNSSDK/tools/release/httpdns/README.md
new file mode 100644
index 0000000..cac7b98
--- /dev/null
+++ b/HttpDNSSDK/tools/release/httpdns/README.md
@@ -0,0 +1,5 @@
+# Release Scripts
+
+- `release_android.ps1`: Android SDK 编译并输出 ZIP 到 `HttpDNSSDK/sdk/dist`(不保留单独 AAR)
+- `release_ios.sh`: iOS SDK 打包发布脚本(模板)
+- `release_flutter.ps1`: Flutter SDK 打包发布脚本(模板)
diff --git a/HttpDNSSDK/tools/release/httpdns/release_android.ps1 b/HttpDNSSDK/tools/release/httpdns/release_android.ps1
new file mode 100644
index 0000000..a599963
--- /dev/null
+++ b/HttpDNSSDK/tools/release/httpdns/release_android.ps1
@@ -0,0 +1,100 @@
+param(
+ [Parameter(Mandatory = $true)][string]$Version
+)
+
+$ErrorActionPreference = "Stop"
+
+$scriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
+$sdkRoot = (Resolve-Path (Join-Path $scriptDir "..\..\..")).Path
+$androidRoot = Join-Path $sdkRoot "sdk\android"
+$distDir = Join-Path $sdkRoot "sdk\dist"
+$aarOutputDir = Join-Path $androidRoot "httpdns-sdk\build\outputs\aar"
+$localMavenRoot = Join-Path $androidRoot "local-maven\com\newsdk\ams"
+
+if (!(Test-Path $androidRoot)) {
+ throw "Android SDK directory not found: $androidRoot"
+}
+
+New-Item -ItemType Directory -Path $distDir -Force | Out-Null
+
+Write-Host "Building Android SDK..."
+Push-Location $androidRoot
+try {
+ & .\gradlew.bat :httpdns-sdk:clean :httpdns-sdk:assembleNormalRelease
+}
+finally {
+ Pop-Location
+}
+
+$aar = Get-ChildItem -Path $aarOutputDir -Filter ("new--android-httpdns-v{0}.aar" -f $Version) -File -ErrorAction SilentlyContinue |
+ Sort-Object LastWriteTime -Descending |
+ Select-Object -First 1
+
+if ($null -eq $aar) {
+ $aar = Get-ChildItem -Path $aarOutputDir -Filter "new--android-httpdns-v*.aar" -File -ErrorAction SilentlyContinue |
+ Sort-Object LastWriteTime -Descending |
+ Select-Object -First 1
+}
+
+if ($null -eq $aar) {
+ $aar = Get-ChildItem -Path $aarOutputDir -Filter "*normal-release*.aar" -File -ErrorAction SilentlyContinue |
+ Sort-Object LastWriteTime -Descending |
+ Select-Object -First 1
+}
+
+if ($null -eq $aar) {
+ $aar = Get-ChildItem -Path $aarOutputDir -Filter "*release*.aar" -File -ErrorAction SilentlyContinue |
+ Sort-Object LastWriteTime -Descending |
+ Select-Object -First 1
+}
+
+if ($null -eq $aar) {
+ throw "AAR not found: $aarOutputDir"
+}
+
+$targetAarName = "new--android-httpdns-v$Version.aar"
+$crashDefend = Join-Path $localMavenRoot "new-android-crashdefend\0.0.6\new-android-crashdefend-0.0.6.jar"
+$ipDetector = Join-Path $localMavenRoot "new-android-ipdetector\1.2.0\new-android-ipdetector-1.2.0.aar"
+$logger = Join-Path $localMavenRoot "new-android-logger\1.2.0\new-android-logger-1.2.0.aar"
+
+foreach ($requiredFile in @($crashDefend, $ipDetector, $logger)) {
+ if (!(Test-Path $requiredFile)) {
+ throw "Required file missing: $requiredFile"
+ }
+}
+
+$stageDir = Join-Path $sdkRoot ("sdk\.tmp_android_release_{0}" -f [System.Guid]::NewGuid().ToString("N"))
+New-Item -ItemType Directory -Path $stageDir -Force | Out-Null
+
+try {
+ Copy-Item -Path $aar.FullName -Destination (Join-Path $stageDir $targetAarName) -Force
+ Copy-Item -Path $crashDefend -Destination (Join-Path $stageDir "new-android-crashdefend-0.0.6.jar") -Force
+ Copy-Item -Path $ipDetector -Destination (Join-Path $stageDir "new-android-ipdetector-1.2.0.aar") -Force
+ Copy-Item -Path $logger -Destination (Join-Path $stageDir "new-android-logger-1.2.0.aar") -Force
+
+ $zipWithVersion = Join-Path $distDir ("httpdns-sdk-android-v{0}.zip" -f $Version)
+
+ $zipNoVersion = Join-Path $distDir "httpdns-sdk-android.zip"
+ if (Test-Path $zipNoVersion) { Remove-Item -Path $zipNoVersion -Force }
+ if (Test-Path $zipWithVersion) { Remove-Item -Path $zipWithVersion -Force }
+
+ Compress-Archive -Path (Join-Path $stageDir "*") -DestinationPath $zipWithVersion -CompressionLevel Optimal
+}
+finally {
+ if (Test-Path $stageDir) {
+ Remove-Item -Path $stageDir -Recurse -Force
+ }
+}
+
+$standaloneAar = Join-Path $distDir $targetAarName
+if (Test-Path $standaloneAar) {
+ Remove-Item -Path $standaloneAar -Force
+}
+
+$outputsDir = Join-Path $androidRoot "httpdns-sdk\build\outputs"
+if (Test-Path $outputsDir) {
+ Remove-Item -Path $outputsDir -Recurse -Force
+}
+
+Write-Host "Android SDK build complete (zip only)."
+Write-Host "ZIP: $zipWithVersion"
diff --git a/HttpDNSSDK/tools/release/httpdns/release_flutter.ps1 b/HttpDNSSDK/tools/release/httpdns/release_flutter.ps1
new file mode 100644
index 0000000..fdfd93f
--- /dev/null
+++ b/HttpDNSSDK/tools/release/httpdns/release_flutter.ps1
@@ -0,0 +1,4 @@
+param(
+ [Parameter(Mandatory=$true)][string]$Version
+)
+Write-Host "[TODO] build Flutter SDK version: $Version"
diff --git a/HttpDNSSDK/tools/release/httpdns/release_ios.sh b/HttpDNSSDK/tools/release/httpdns/release_ios.sh
new file mode 100644
index 0000000..b8cf043
--- /dev/null
+++ b/HttpDNSSDK/tools/release/httpdns/release_ios.sh
@@ -0,0 +1,8 @@
+#!/usr/bin/env bash
+set -euo pipefail
+VERSION="${1:-}"
+if [ -z "$VERSION" ]; then
+ echo "usage: ./release_ios.sh "
+ exit 1
+fi
+echo "[TODO] build iOS SDK version: $VERSION"