diff --git a/internal/dnsclients/provider_dnspod.go b/internal/dnsclients/provider_dnspod.go index 32a850cc..e47930b8 100644 --- a/internal/dnsclients/provider_dnspod.go +++ b/internal/dnsclients/provider_dnspod.go @@ -1,6 +1,7 @@ package dnsclients import ( + "crypto/tls" "encoding/json" "errors" "github.com/TeaOSLab/EdgeAPI/internal/dnsclients/dnstypes" @@ -11,6 +12,7 @@ import ( "net/http" "net/url" "strings" + "time" ) const ( @@ -18,6 +20,15 @@ const ( DNSPodInternational = "international" ) +var dnsPodHTTPClient = &http.Client{ + Timeout: 10 * time.Second, + Transport: &http.Transport{ + TLSClientConfig: &tls.Config{ + InsecureSkipVerify: true, + }, + }, +} + // DNSPodProvider DNSPod服务商 type DNSPodProvider struct { BaseProvider @@ -46,8 +57,9 @@ func (this *DNSPodProvider) Auth(params maps.Map) error { func (this *DNSPodProvider) GetDomains() (domains []string, err error) { offset := 0 size := 100 + for { - domainsResp, err := this.post("/Domain.list", map[string]string{ + domainsResp, err := this.post("/Domain.List", map[string]string{ "offset": numberutils.FormatInt(offset), "length": numberutils.FormatInt(size), }) @@ -81,7 +93,7 @@ func (this *DNSPodProvider) GetRecords(domain string) (records []*dnstypes.Recor offset := 0 size := 100 for { - recordsResp, err := this.post("/Record.list", map[string]string{ + recordsResp, err := this.post("/Record.List", map[string]string{ "domain": domain, "offset": numberutils.FormatInt(offset), "length": numberutils.FormatInt(size), @@ -117,7 +129,7 @@ func (this *DNSPodProvider) GetRecords(domain string) (records []*dnstypes.Recor // GetRoutes 读取线路数据 func (this *DNSPodProvider) GetRoutes(domain string) (routes []*dnstypes.Route, err error) { - infoResp, err := this.post("/Domain.info", map[string]string{ + infoResp, err := this.post("/Domain.Info", map[string]string{ "domain": domain, }) if err != nil { @@ -234,32 +246,35 @@ func (this *DNSPodProvider) DeleteRecord(domain string, record *dnstypes.Record) // 发送请求 func (this *DNSPodProvider) post(path string, params map[string]string) (maps.Map, error) { var apiHost = "https://dnsapi.cn" - if this.region == DNSPodInternational { // 国际版 + var lang = "cn" + if this.isInternational() { // 国际版 apiHost = "https://api.dnspod.com" + lang = "en" } var query = url.Values{ "login_token": []string{this.apiId + "," + this.apiToken}, "format": []string{"json"}, - "lang": []string{"cn"}, + "lang": []string{lang}, } + for p, v := range params { query[p] = []string{v} } + req, err := http.NewRequest(http.MethodPost, apiHost+path, strings.NewReader(query.Encode())) if err != nil { return nil, err } req.Header.Set("Content-Type", "application/x-www-form-urlencoded") req.Header.Set("User-Agent", "GoEdge-Client/1.0.0 (iwind.liu@gmail.com)") + req.Header.Set("Accept", "*/*") - var client = http.Client{} - resp, err := client.Do(req) + resp, err := dnsPodHTTPClient.Do(req) if err != nil { return nil, err } defer func() { _ = resp.Body.Close() - client.CloseIdleConnections() }() body, err := ioutil.ReadAll(resp.Body) if err != nil { @@ -273,7 +288,7 @@ func (this *DNSPodProvider) post(path string, params map[string]string) (maps.Ma var status = m.GetMap("status") var code = status.GetString("code") if code != "1" { - return nil, errors.New("code: " + code + ", message: " + status.GetString("message")) + return nil, errors.New("API response error: code: " + code + ", message: " + status.GetString("message")) } return m, nil @@ -281,5 +296,12 @@ func (this *DNSPodProvider) post(path string, params map[string]string) (maps.Ma // DefaultRoute 默认线路 func (this *DNSPodProvider) DefaultRoute() string { + if this.isInternational() { + return "Default" + } return "默认" } + +func (this *DNSPodProvider) isInternational() bool { + return this.region == DNSPodInternational +} diff --git a/internal/dnsclients/provider_dnspod_test.go b/internal/dnsclients/provider_dnspod_test.go index 8e246f3e..956eba30 100644 --- a/internal/dnsclients/provider_dnspod_test.go +++ b/internal/dnsclients/provider_dnspod_test.go @@ -1,7 +1,8 @@ -package dnsclients +package dnsclients_test import ( "encoding/json" + "github.com/TeaOSLab/EdgeAPI/internal/dnsclients" "github.com/TeaOSLab/EdgeAPI/internal/dnsclients/dnstypes" "github.com/iwind/TeaGo/dbs" "github.com/iwind/TeaGo/logs" @@ -9,8 +10,10 @@ import ( "testing" ) +const DNSPodTestDomain = "yun4s.cn" + func TestDNSPodProvider_GetDomains(t *testing.T) { - provider, err := testDNSPodProvider() + provider, _, err := testDNSPodProvider() if err != nil { t.Fatal(err) } @@ -22,11 +25,11 @@ func TestDNSPodProvider_GetDomains(t *testing.T) { } func TestDNSPodProvider_GetRoutes(t *testing.T) { - provider, err := testDNSPodProvider() + provider, _, err := testDNSPodProvider() if err != nil { t.Fatal(err) } - routes, err := provider.GetRoutes("yun4s.cn") + routes, err := provider.GetRoutes(DNSPodTestDomain) if err != nil { t.Fatal(err) } @@ -34,11 +37,11 @@ func TestDNSPodProvider_GetRoutes(t *testing.T) { } func TestDNSPodProvider_GetRecords(t *testing.T) { - provider, err := testDNSPodProvider() + provider, _, err := testDNSPodProvider() if err != nil { t.Fatal(err) } - records, err := provider.GetRecords("yun4s.cn") + records, err := provider.GetRecords(DNSPodTestDomain) if err != nil { t.Fatal(err) } @@ -48,17 +51,22 @@ func TestDNSPodProvider_GetRecords(t *testing.T) { } func TestDNSPodProvider_AddRecord(t *testing.T) { - provider, err := testDNSPodProvider() + provider, isInternational, err := testDNSPodProvider() if err != nil { t.Fatal(err) } - err = provider.AddRecord("yun4s.cn", &dnstypes.Record{ + var route = "联通" + if isInternational { + route = "Default" + } + + err = provider.AddRecord(DNSPodTestDomain, &dnstypes.Record{ Type: dnstypes.RecordTypeCNAME, Name: "hello-forward", - Value: "hello.yun4s.cn", - Route: "联通", - TTL: 300, + Value: "hello." + DNSPodTestDomain, + Route: route, + TTL: 600, }) if err != nil { t.Fatal(err) @@ -67,18 +75,25 @@ func TestDNSPodProvider_AddRecord(t *testing.T) { } func TestDNSPodProvider_UpdateRecord(t *testing.T) { - provider, err := testDNSPodProvider() + provider, isInternational, err := testDNSPodProvider() if err != nil { t.Fatal(err) } - err = provider.UpdateRecord("yun4s.cn", &dnstypes.Record{ - Id: "697036856", + var route = "联通" + var id = "1093875360" + if isInternational { + route = "Default" + id = "28507333" + } + + err = provider.UpdateRecord(DNSPodTestDomain, &dnstypes.Record{ + Id: id, }, &dnstypes.Record{ Type: dnstypes.RecordTypeA, Name: "hello", Value: "192.168.1.102", - Route: "联通", + Route: route, }) if err != nil { t.Fatal(err) @@ -87,13 +102,17 @@ func TestDNSPodProvider_UpdateRecord(t *testing.T) { } func TestDNSPodProvider_DeleteRecord(t *testing.T) { - provider, err := testDNSPodProvider() + provider, isInternational, err := testDNSPodProvider() if err != nil { t.Fatal(err) } - err = provider.DeleteRecord("yun4s.cn", &dnstypes.Record{ - Id: "697040986", + var id = "1093875360" + if isInternational { + id = "28507333" + } + err = provider.DeleteRecord(DNSPodTestDomain, &dnstypes.Record{ + Id: id, }) if err != nil { t.Fatal(err) @@ -101,24 +120,24 @@ func TestDNSPodProvider_DeleteRecord(t *testing.T) { t.Log("ok") } -func testDNSPodProvider() (ProviderInterface, error) { +func testDNSPodProvider() (provider dnsclients.ProviderInterface, isInternational bool, err error) { db, err := dbs.Default() if err != nil { - return nil, err + return nil, false, err } - one, err := db.FindOne("SELECT * FROM edgeDNSProviders WHERE type='dnspod' ORDER BY id DESC") + one, err := db.FindOne("SELECT * FROM edgeDNSProviders WHERE type='dnspod' AND id='14' ORDER BY id DESC") if err != nil { - return nil, err + return nil, false, err } apiParams := maps.Map{} err = json.Unmarshal([]byte(one.GetString("apiParams")), &apiParams) if err != nil { - return nil, err + return nil, false, err } - provider := &DNSPodProvider{} + provider = &dnsclients.DNSPodProvider{} err = provider.Auth(apiParams) if err != nil { - return nil, err + return nil, false, err } - return provider, nil + return provider, apiParams.GetString("region") == "international", nil }