111 lines
2.8 KiB
Go
111 lines
2.8 KiB
Go
package method
|
|
|
|
import (
|
|
"edns_svcb/utils"
|
|
"fmt"
|
|
"log"
|
|
"sync"
|
|
|
|
"github.com/miekg/dns"
|
|
)
|
|
|
|
func HTTPSSupportTest(addr string) TestResult {
|
|
_, err := utils.DNSQuery(addr, utils.DNSOptions{Domain: "www.example.net", RD: true})
|
|
if err != nil {
|
|
return TestResult{Err: err}
|
|
}
|
|
res, err := utils.DNSQuery(addr, utils.DNSOptions{Domain: "blog.cloudflare.com", Qtype: dns.TypeHTTPS, RD: true})
|
|
if err == nil {
|
|
if len(res.Answer) == 1 {
|
|
if _, ok := res.Extra[0].(*dns.HTTPS); ok {
|
|
return TestResult{Alive: true, Support: true}
|
|
}
|
|
}
|
|
}
|
|
return TestResult{Alive: true}
|
|
}
|
|
|
|
func SVCBSupportTest(addr string) TestResult {
|
|
_, err := utils.DNSQuery(addr, utils.DNSOptions{Domain: "www.example.net", RD: true})
|
|
if err != nil {
|
|
return TestResult{Err: err}
|
|
}
|
|
res, err := utils.DNSQuery(addr, utils.DNSOptions{Domain: "blog.cloudflare.com", Qtype: dns.TypeSVCB, RD: true})
|
|
if err == nil {
|
|
if len(res.Answer) == 1 {
|
|
if _, ok := res.Extra[0].(*dns.SVCB); ok {
|
|
return TestResult{Alive: true, Support: true}
|
|
}
|
|
}
|
|
}
|
|
return TestResult{Alive: true}
|
|
}
|
|
|
|
func HTTPSRecordMeasurement(servers []string, domain_pool chan string, result_pool chan bool, routine_num int, wg *sync.WaitGroup, logger *log.Logger) {
|
|
for i := 0; i < routine_num; i++ {
|
|
wg.Add(1)
|
|
go HTTPSRecordTestRoutine(servers, domain_pool, result_pool, wg, logger)
|
|
}
|
|
}
|
|
|
|
func HTTPSRecordTestRoutine(server_list []string, domain_pool chan string, result_pool chan bool, wg *sync.WaitGroup, logger *log.Logger) {
|
|
server_index := 0
|
|
for {
|
|
if domain, ok := <-domain_pool; ok {
|
|
server := server_list[server_index] + ":53"
|
|
res, err := HTTPSRecordTest(server, domain)
|
|
if err == nil {
|
|
logger.Printf("%v : %v", domain, res)
|
|
} else {
|
|
logger.Printf("%v : failed (%v) server %v", domain, err, server)
|
|
}
|
|
result_pool <- res
|
|
server_index = (server_index + 1) % len(server_list)
|
|
} else {
|
|
break
|
|
}
|
|
}
|
|
wg.Done()
|
|
}
|
|
|
|
func HTTPSRecordTest(addr, domain string) (bool, error) {
|
|
res, err := utils.DNSQuery(addr, utils.DNSOptions{Domain: domain, Qtype: dns.TypeHTTPS, RD: true})
|
|
if err == nil {
|
|
if len(res.Answer) > 0 {
|
|
if _, ok := res.Answer[0].(*dns.HTTPS); ok {
|
|
return true, nil
|
|
}
|
|
}
|
|
}
|
|
return false, err
|
|
}
|
|
|
|
func HTTPSRecordResultProcess(result_pool chan bool, wg *sync.WaitGroup) {
|
|
total_cnt := 0
|
|
valid_cnt := 0
|
|
for {
|
|
if res, ok := <-result_pool; ok {
|
|
total_cnt++
|
|
if res {
|
|
valid_cnt++
|
|
}
|
|
} else {
|
|
break
|
|
}
|
|
}
|
|
fmt.Printf("Domain HTTPS support Test: total %v https %v\n", total_cnt, valid_cnt)
|
|
wg.Done()
|
|
}
|
|
|
|
func SVCBRecordTest(addr, domain string) bool {
|
|
res, err := utils.DNSQuery(addr, utils.DNSOptions{Domain: domain, Qtype: dns.TypeSVCB, RD: true})
|
|
if err == nil {
|
|
if len(res.Answer) > 0 {
|
|
if _, ok := res.Answer[0].(*dns.SVCB); ok {
|
|
return true
|
|
}
|
|
}
|
|
}
|
|
return false
|
|
}
|